Saya akan berbagi dengan Anda desain saya dan ini berbeda dari kedua desain Anda karena membutuhkan satu tabel untuk setiap jenis entitas. Saya menemukan cara terbaik untuk mendeskripsikan desain database adalah melalui ERD, ini milik saya:
Dalam contoh ini kami memiliki entitas bernama karyawan . tabel pengguna menyimpan catatan pengguna Anda dan entitas dan entitas_revision adalah dua tabel yang menyimpan riwayat revisi untuk semua jenis entitas yang akan Anda miliki di sistem Anda. Begini cara desain ini bekerja:
Dua bidang dari entity_id dan revision_id
Setiap entitas di sistem Anda akan memiliki id entitas unik sendiri. Entitas Anda mungkin melalui revisi tetapi entity_idnya akan tetap sama. Anda harus menyimpan id entitas ini di meja karyawan Anda (sebagai kunci asing). Anda juga harus menyimpan tipe entitas Anda di tabel entitas (mis. 'Karyawan'). Sekarang seperti untuk revision_id, seperti namanya, itu melacak revisi entitas Anda. Cara terbaik yang saya temukan untuk ini adalah dengan menggunakan employee_id sebagai revision_id Anda. Ini berarti Anda akan memiliki id revisi duplikat untuk berbagai jenis entitas, tetapi ini bukan masalah bagi saya (saya tidak yakin dengan kasus Anda). Satu-satunya catatan penting yang harus dibuat adalah bahwa kombinasi dari entity_id dan revision_id harus unik.
Ada juga bidang keadaan dalam tabel entity_revision yang menunjukkan keadaan revisi. Hal ini dapat memiliki salah satu dari tiga negara: latest
, obsolete
atau deleted
(tidak bergantung pada tanggal revisi membantu Anda banyak untuk meningkatkan pertanyaan Anda).
Satu catatan terakhir tentang revision_id, saya tidak membuat kunci asing yang menghubungkan employee_id ke revision_id karena kami tidak ingin mengubah tabel entitas_revision untuk setiap jenis entitas yang mungkin kami tambahkan di masa depan.
INSERSI
Untuk setiap karyawan yang ingin Anda masukkan ke dalam basis data, Anda juga akan menambahkan catatan ke entitas dan entitas_revisi . Dua catatan terakhir ini akan membantu Anda melacak oleh siapa dan kapan catatan telah dimasukkan ke dalam basis data.
MEMPERBARUI
Setiap pembaruan untuk catatan karyawan yang ada akan diimplementasikan sebagai dua sisipan, satu di tabel karyawan dan satu di entitas_revision. Yang kedua akan membantu Anda untuk mengetahui oleh siapa dan kapan catatan telah diperbarui.
PENGHAPUSAN
Untuk menghapus karyawan, catatan dimasukkan ke entitas_revision yang menyatakan penghapusan dan dilakukan.
Seperti yang Anda lihat dalam desain ini tidak ada data yang pernah diubah atau dihapus dari database dan yang lebih penting setiap jenis entitas hanya membutuhkan satu tabel. Secara pribadi saya menemukan desain ini sangat fleksibel dan mudah dikerjakan. Tetapi saya tidak yakin tentang Anda karena kebutuhan Anda mungkin berbeda.
[MEMPERBARUI]
Setelah mendukung partisi dalam versi MySQL baru, saya percaya desain saya juga dilengkapi dengan salah satu pertunjukan terbaik juga. Satu dapat mempartisi entity
tabel menggunakan type
bidang sementara partisi entity_revision
menggunakan state
bidangnya. Ini akan meningkatkan SELECT
pertanyaan sejauh ini sambil menjaga desain tetap sederhana dan bersih.