Ketika saya melihat implementasi "catatan sejarah" - versi, di sisi program bekerja dengan database SQL. Sebelum mengubah catatan, versi lama diperoleh dari database, ditulis ke XML dan string XML yang dihasilkan ditulis ke tabel versi terpisah.
Awalnya, dalam programnya ia berencana untuk membuat versi beberapa waktu kemudian, tidak ada kebutuhan mendesak. Saya ingat ada keinginan untuk menggunakan tipe data jsonb di suatu tempat, segera setelah saya memikirkan implementasi versi yang sederhana dan ringkas di sisi SQL, saya tidak bisa melakukannya. Hanya satu tabel versi dengan 5 kolom dan satu fungsi pemicu dalam 3 baris kode.
Untuk menggambarkan implementasi satu tabel versi saja tidak cukup, jadi Anda harus menjelaskan beberapa tabel lagi misalnya.
Di hampir semua database, dengan pengecualian langka, ada tabel pengguna - pengguna. Berguna untuk menyimpan riwayat perubahan - versi pengguna, misalnya, untuk kemampuan untuk kembali ke versi lama, oleh pengguna itu sendiri.
Contoh tabel pengguna:

Dua bidang terakhir dalam gambar diperlukan untuk tabel versi, mereka juga bisa disebut "penulis versi" dan "tanggal versi", tetapi, jika diinginkan, Anda bisa melakukannya tanpa itu.
Tabel versi:

Fungsi pemicu untuk menyimpan versi:

Dua bidang pertama diisi dari catatan tersimpan OLD.changestamp dan OLD.userid.
Di tabel versi, tidak hanya entri tabel pengguna dapat disimpan, bidang ketiga adalah hash MD5 dari nama tabel versi, dikonversi menjadi uuid.
Contoh sebelumnya menggambarkan struktur yang sangat sederhana, tetapi sebagai aturan, berbagai data referensi mungkin memiliki tabel tambahan dengan hubungan satu-ke-banyak.
Misalnya, tabel "Grup pengguna".

Dan tabel kedua adalah "Pengguna Grup", komposisi grup adalah pengguna dalam grup.

Agar tidak menyulitkan mekanisme versi sederhana, Anda dapat membuat sedikit duplikasi data dalam tabel grup, tambahkan bidang jsonb yang mengulangi struktur tabel "Pengguna Grup".

Untuk menyederhanakan pekerjaan dengan data duplikat, Anda dapat membuat fungsi pemicu tambahan, dengan INSERT atau UPDATE, mengisi tabel "Kelompok Pengguna" dari bidang jsonb.

Duplikasi yang dijelaskan di atas hanya diperlukan ketika diperlukan untuk mendapatkan data dari tabel sesering dan secepat mungkin. Misalnya, jika kueri sering dibuat ke tabel "Pengguna Grup" untuk menentukan apakah pengguna adalah anggota grup Administrator. Dalam kasus lain, data dapat diperoleh dengan kueri langsung dari bidang jsonb, dan tidak menggunakan tabel duplikat.
Kode contoh lengkap ada di sini