MariaDB Server 10.3 идва с нова, много полезна функция, която ще улесни дизайна на много приложения. Версионирането на данни е важно от няколко гледни точки. Съответствието може да изисква да съхранявате промени в данните. За аналитични заявки може да искате да разгледате данните в определен момент от време и за целите на одита какви промени са направени и кога е важно. Също така, в случай на изтриване на таблица, може да бъде от голяма полза да я възстановите от историята. MariaDB Server вече включва функция с име System-Versioned Tables, която се основава на спецификацията в стандарта SQL:2011. Той осигурява автоматично версия на данните в таблицата.
Ще разгледам концепцията за таблици с версии на системата с много прост пример, който ще ви покаже за какво става въпрос. Нека започнем със създаване на база данни и таблица.
CREATE DATABASE Company;
CREATE TABLE Person (
Id int(11) NOT NULL AUTO_INCREMENT,
FirstName varchar(50) NOT NULL,
LastName varchar(50) NOT NULL,
Gender char(1) NOT NULL,
DepartmentId int(11) NOT NULL,
PRIMARY KEY (Id),
CONSTRAINT con_gender CHECK (Gender in ('f','m')))
WITH SYSTEM VERSIONING;
Изглежда точно както преди, с изключение на последната опция за таблица WITH SYSTEM_VERSIONING, която включва автоматичното управление на версиите на таблицата. Нека видим как работи, като вмъкнем ред в таблицата.
MariaDB [Company]> INSERT INTO Person (FirstName, LastName, Gender, DepartmentId) VALUES ('Rasmus', 'Johansson', 'm', 1);
Query OK, 1 row affected (0.002 sec)
MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 1 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
Имаме ме като един ред в таблица. Интересната част започва, когато актуализираме редовете. Ще сменя отделите няколко пъти.
MariaDB [Company]> UPDATE Person SET DepartmentId = 2 WHERE Id = 1; Query OK, 1 row affected (0.002 sec)
Rows matched: 1 Changed: 1 Inserted: 1 Warnings: 0
MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 2 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
MariaDB [Company]> UPDATE Person SET DepartmentId = 3 WHERE Id = 1;
Query OK, 1 row affected (0.003 sec)
Rows matched: 1 Changed: 1 Inserted: 1 Warnings: 0
MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 3 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
Както можете да видите, MariaDB Server казва, че има 1 променен ред за всяка актуализация, както обикновено, но също така и 1 вмъкнат, което не би било така за таблица без версии. Всяка актуализация причинява нова версия на реда, която трябва да се вмъкне в таблицата. Както виждате по-горе, нормалният SELECT ще покаже само най-новата версия. За да видите всички версии на редовете, MariaDB Server предоставя следния синтаксис.
MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME ALL;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 1 |
| 1 | Rasmus | Johansson | m | 2 |
| 1 | Rasmus | Johansson | m | 3 |
+----+-----------+-----------+--------+--------------+
3 rows in set (0.001 sec)
За да можем да видим кога редовете са актуализирани, искаме да включим две невидими колони, които са създадени от автоматичното управление на версиите. Invisible Column е друга вълнуваща нова функция на MariaDB Server 10.3. Невидимите колони на автоматичното управление на версиите са ROW_START и ROW_END. Те определят периода от време, за който версията на реда е била/е валидна.
MariaDB [Company]> SELECT *, ROW_START, ROW_END FROM Person FOR SYSTEM_TIME ALL;
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
| Id | FirstName | LastName | Gender | DepartmentId | ROW_START | ROW_END |
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
| 1 | Rasmus | Johansson | m | 1 | 2018-05-03 07:21:12.386980 | 2018-05-03 07:22:29.188266 |
| 1 | Rasmus | Johansson | m | 2 | 2018-05-03 07:22:29.188266 | 2018-05-03 07:22:47.596481 |
| 1 | Rasmus | Johansson | m | 3 | 2018-05-03 07:22:47.596481 | 2038-01-19 03:14:07.999999 |
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
3 rows in set (0.000 sec)
Интересното нещо сега е да правите заявки във времето, за да извлечете точно как изглежда таблицата на конкретна дата и час. Можем да направим това, като използваме синтаксиса AS OF:
MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME AS OF TIMESTAMP '2018-05-03 07:22:33';
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 2 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
Това беше само малък поглед към таблиците с версии на системата. В допълнение към примерите, показани по-горе, можете да поставите хронология на отделни дялове от съображения за производителност, да изключите колони от версиите и много други.
Прочетете повече за таблиците с версии на системата в документацията на MariaDB. Вземете MariaDB Server 10.3 като част от изтеглянето на MariaDB TX 3.0 – вече е налице.