Pilihan saya adalah variasi dari pendekatan 2. Tebal menunjukkan bidang di kunci utama.
- Anda menyisipkan setiap artikel dalam tabel
articles_versioned
(id , stempel waktu , nama, teks) - Tabel kedua Anda adalah
articles
(id , stempel waktu, [nama, teks]). Perhatikan bagaimana stempel waktu bukan yang utama; nama dan teks dapat direplikasi, atau Anda dapat menggunakan gabungan denganarticles_versioned
(yang akan cepat karena id dan stempel waktu adalaharticles_versioned
kunci utama) articles_versioned
memiliki pemicu pada sisipan yang mengambil baris yang baru saja dimasukkan dan mereplikasinya padaarticles
- Untuk memulihkan versi artikel tertentu, Anda memodifikasi
articles
meja.
Keuntungan dari pendekatan ini adalah:
- Anda mendapatkan secara gratis informasi lain (tanggal dan waktu artikel) di tabel Anda, yang mungkin Anda perlukan
- Anda tidak perlu menanyakan database untuk mendapatkan tanggal saat ini. Jika Anda menggunakan versi, Anda harus melakukannya.
- Kode Anda tidak harus menyisipkan artikel dalam dua tabel. Anda cukup memasukkan
articles_versioned
dan baca dariarticles
, db menangani migrasi data saat Anda memasukkannya melalui pemicu, menghindari masalah konsistensi.
Kontra
- Dalam lingkungan yang sangat bersamaan, dua versi dapat dimasukkan pada saat yang sama, jadi salah satunya mungkin gagal. Ini seharusnya tidak menjadi masalah saat memasukkan artikel yang ditulis pengguna (sangat tidak mungkin mengingat ketepatan cap waktu hari ini). Jika Anda tidak menentukan stempel waktu di
INSERT
pernyataan, tetapi alih-alih Anda menyetel bidang datetime untuk memiliki waktu saat ini sebagai nilai default, Anda dapat menghindari masalah ini sepenuhnya.
Untuk menjawab sisa pertanyaan Anda. Pendekatan 1 tidak akan menghasilkan kueri yang lebih panjang selama Anda menambahkan indeks pada status. Ini masuk akal hanya jika Anda cenderung memiliki banyak versi berbeda dari setiap artikel; selama Anda memiliki 2 versi per artikel rata-rata atau kurang, indeks hanya akan memperlambat Anda, dan pendekatan 2 tidak akan lebih cepat (walaupun saya masih akan merekomendasikan pendekatan saya karena itu menyederhanakan kode, karena memulihkan versi tidak tidak memerlukan peralihan status untuk dua baris).
Sumber daya terkait, seperti gambar, harus mengikuti versi serupa. Saya berasumsi Anda menyimpannya di sistem file; daripada menyimpannya dengan nama aslinya, gunakan tabel (id , image_name) untuk memberi setiap gambar id, lalu simpan gambar sebagai -id-.jpg
. Bidang image_name akan membuat Anda dapat mengetahui apa nama file aslinya (jika Anda peduli tentang itu). Dengan cara ini Anda dapat membuat versi gambar dengan cara yang sama seperti artikel versi Anda, dan dalam artikel Anda akan menggunakan sesuatu seperti <img src="-id-.jpg">
, yang Anda tahu akan tetap tersedia selamanya.