MariaDB Server 10.3 hadir dengan fitur baru yang sangat berguna yang akan memudahkan desain banyak aplikasi. Versi data penting untuk beberapa perspektif. Kepatuhan mungkin mengharuskan Anda untuk menyimpan perubahan data. Untuk kueri analitis, Anda mungkin ingin melihat data pada titik waktu tertentu dan untuk tujuan audit, perubahan apa yang dibuat dan kapan penting. Juga, dalam kasus tabel yang dihapus, bisa sangat bermanfaat untuk memulihkannya dari riwayat. MariaDB Server sekarang menyertakan fitur bernama System-Versioned Tables, yang didasarkan pada spesifikasi dalam standar SQL:2011. Ini menyediakan versi otomatis dari data tabel.
Saya akan menjelaskan konsep Tabel Versi Sistem dengan contoh yang sangat sederhana, yang akan menunjukkan kepada Anda apa itu semua. Mari kita mulai dengan membuat database dan tabel.
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;
Tampilannya persis seperti sebelumnya kecuali opsi tabel terakhir WITH SYSTEM_VERSIONING, yang mengaktifkan pembuatan versi otomatis pada tabel. Mari kita lihat cara kerjanya dengan menyisipkan baris ke dalam tabel.
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)
Di sana kami memiliki saya sebagai satu baris dalam sebuah tabel. Bagian yang menarik dimulai ketika kami memperbarui baris. Saya akan berganti departemen beberapa kali.
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)
Seperti yang Anda lihat, MariaDB Server memberi tahu bahwa ada 1 baris yang diubah untuk setiap pembaruan seperti biasa, tetapi juga 1 yang dimasukkan, yang tidak akan terjadi pada tabel tanpa versi. Setiap pembaruan menyebabkan versi baru dari baris, yang harus dimasukkan ke dalam tabel. Seperti yang juga Anda lihat di atas, SELECT normal hanya akan menampilkan versi terbaru. Untuk melihat semua versi baris, MariaDB Server menyediakan sintaks berikut.
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)
Untuk dapat melihat kapan baris telah diperbarui, kami ingin menyertakan dua kolom tak terlihat yang dibuat oleh pembuatan versi otomatis. Invisible Columnsis fitur baru yang menarik lainnya dari MariaDB Server 10.3. Kolom tak terlihat dari pembuatan versi otomatis adalah ROW_START dan ROW_END. Mereka menentukan periode waktu di mana versi baris itu valid/valid.
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)
Hal yang menarik sekarang adalah melakukan kueri titik waktu untuk mengambil persis seperti apa tabel pada tanggal dan waktu tertentu. Kita dapat melakukan ini dengan menggunakan sintaks 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)
Ini hanya sedikit gambaran tentang Tabel Versi Sistem. Selain contoh yang ditunjukkan di atas, Anda dapat menempatkan riwayat pada partisi terpisah untuk alasan kinerja, mengecualikan kolom dari pembuatan versi, dan banyak lagi.
Baca selengkapnya tentang Tabel Versi Sistem dalam dokumentasi MariaDB. Dapatkan MariaDB Server 10.3 sebagai bagian dari unduhan MariaDB TX 3.0 – sekarang tersedia.