Sementara @WW. Jawabannya adalah jawaban yang baik. Cara lain adalah membuat kolom versi dan menyimpan semua versi Anda di tabel yang sama.
Untuk satu pendekatan meja Anda juga:
- Gunakan bendera untuk menunjukkan ala Word Press terbaru
- ATAU melakukan yang lebih besar dari versi jahat
outer join
.
Contoh SQL dari outer join
metode menggunakan angka revisi adalah:
SELECT tc.*
FROM text_content tc
LEFT OUTER JOIN text_content mc ON tc.path = mc.path
AND mc.revision > tc.revision
WHERE mc.revision is NULL
AND tc.path = '/stuff' -- path in this case is our natural id.
Kabar buruknya adalah di atas membutuhkan outer join
sambungan luar dan bisa lambat. Kabar baiknya adalah bahwa membuat entri baru secara teoritis lebih murah karena Anda dapat melakukannya dalam satu operasi tulis tanpa transaksi (dengan asumsi database Anda adalah atomik).
Contoh membuat revisi baru untuk '/stuff'
mungkin:
INSERT INTO text_content (id, path, data, revision, revision_comment, enabled, create_time, update_time)
(
SELECT
(md5(random()::text)) -- {id}
, tc.path
, 'NEW' -- {data}
, (tc.revision + 1)
, 'UPDATE' -- {comment}
, 't' -- {enabled}
, tc.create_time
, now()
FROM text_content tc
LEFT OUTER JOIN text_content mc ON tc.path = mc.path
AND mc.revision > tc.revision
WHERE mc.revision is NULL
AND tc.path = '/stuff' -- {path}
)
Kami menyisipkan dengan menggunakan data lama. Ini sangat berguna jika Anda hanya ingin memperbarui satu kolom dan menghindari penguncian dan atau transaksi yang optimis.
Pendekatan bendera dan pendekatan tabel sejarah membutuhkan dua baris yang harus dimasukkan / diperbarui.
Keuntungan lain dengan outer join
pendekatan angka revisi adalah bahwa Anda selalu dapat refactor ke pendekatan beberapa tabel nanti dengan pemicu karena pemicu Anda pada dasarnya harus melakukan sesuatu seperti di atas.