Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Praktik terbaik untuk sistem versi data mysql

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 dengan articles_versioned (yang akan cepat karena id dan stempel waktu adalah articles_versioned kunci utama)
  • articles_versioned memiliki pemicu pada sisipan yang mengambil baris yang baru saja dimasukkan dan mereplikasinya pada articles
  • Untuk memulihkan versi artikel tertentu, Anda memodifikasi articles meja.

Keuntungan dari pendekatan ini adalah:

  1. Anda mendapatkan secara gratis informasi lain (tanggal dan waktu artikel) di tabel Anda, yang mungkin Anda perlukan
  2. Anda tidak perlu menanyakan database untuk mendapatkan tanggal saat ini. Jika Anda menggunakan versi, Anda harus melakukannya.
  3. Kode Anda tidak harus menyisipkan artikel dalam dua tabel. Anda cukup memasukkan articles_versioned dan baca dari articles , db menangani migrasi data saat Anda memasukkannya melalui pemicu, menghindari masalah konsistensi.

Kontra

  1. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ukuran tabel maksimum untuk database MySQL

  2. Permintaan MySQL digantung dan harus mematikan prosesnya

  3. batasan kunci asing mysql adalah kesalahan yang salah bentuk

  4. Bagaimana cara mengoptimalkan kueri SQL dengan menghitung jarak berdasarkan garis bujur dan garis lintang?

  5. Indeks database MySQL dengan Apache Lucene, dan sinkronkan