MariaDB Server 10.3 jest wyposażony w nową, bardzo przydatną funkcję, która ułatwi projektowanie wielu aplikacji. Wersjonowanie danych jest ważne z kilku perspektyw. Zgodność może wymagać przechowywania zmian danych. W przypadku zapytań analitycznych możesz chcieć spojrzeć na dane w określonym momencie i do celów audytu, jakie zmiany zostały wprowadzone i kiedy są ważne. Ponadto, w przypadku usunięcia tabeli, bardzo cenne może być odzyskanie jej z historii. MariaDB Server zawiera teraz funkcję o nazwie Tabele systemowe, która jest oparta na specyfikacji standardu SQL:2011. Zapewnia automatyczne wersjonowanie danych tabeli.
Przejdę przez koncepcję tabel systemowych z bardzo prostym przykładem, który pokaże, o co w tym wszystkim chodzi. Zacznijmy od stworzenia bazy danych i tabeli.
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;
Wygląda dokładnie tak jak poprzednio, z wyjątkiem ostatniej opcji tabeli WITH SYSTEM_VERSIONING, która włącza automatyczne wersjonowanie tabeli. Zobaczmy, jak to działa, wstawiając wiersz do tabeli.
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)
Mamy mnie w jednym rzędzie w tabeli. Ciekawa część zaczyna się, gdy aktualizujemy wiersze. Kilka razy zmienię działy.
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)
Jak widać, MariaDB Server informuje, że dla każdej aktualizacji jak zwykle jest 1 zmieniony wiersz, ale także 1 wstawiony, co nie miałoby miejsca w przypadku tabeli bez wersjonowania. Każda aktualizacja powoduje powstanie nowej wersji wiersza, który należy wstawić do tabeli. Jak widać powyżej, normalny SELECT pokaże tylko najnowszą wersję. Aby zobaczyć wszystkie wersje wierszy, MariaDB Server udostępnia następującą składnię.
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)
Aby móc zobaczyć, kiedy wiersze zostały zaktualizowane, chcemy uwzględnić dwie niewidoczne kolumny, które są tworzone przez automatyczne wersjonowanie. Invisible Columns to kolejna ekscytująca nowa funkcja MariaDB Server 10.3. Niewidoczne kolumny automatycznego wersjonowania to ROW_START i ROW_END. Określają okres, w którym wersja wiersza była/jest ważna.
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)
Interesującą rzeczą jest teraz wykonanie zapytań o punkt w czasie, aby pobrać dokładnie to, jak wyglądała tabela w określonym dniu i czasie. Możemy to zrobić za pomocą składni 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)
To był tylko mały rzut oka na tabele systemowe. Oprócz przykładów pokazanych powyżej możesz umieścić historię na oddzielnych partycjach ze względu na wydajność, wykluczyć kolumny z wersjonowania i wiele więcej.
Dowiedz się więcej o tabelach wersji systemowych w dokumentacji MariaDB. Pobierz MariaDB Server 10.3 w ramach pobierania MariaDB TX 3.0 — już dostępne.