Setiap kali saya perlu mendesain database baru, saya menghabiskan banyak waktu memikirkan bagaimana saya harus mengatur skema database untuk menyimpan log audit dari perubahan.
Beberapa pertanyaan telah diajukan di sini tentang ini, tetapi saya tidak setuju bahwa ada satu pendekatan terbaik untuk semua skenario:
- Desain Basis Data Untuk Revisi
- Desain terbaik untuk tabel database audit perubahan log
- Gagasan tentang desain basis data untuk menangkap jejak audit
Saya juga menemukan artikel menarik tentang Mempertahankan Log Perubahan Database yang mencoba membuat daftar pro dan kontra dari setiap pendekatan. Itu ditulis dengan sangat baik dan memiliki informasi yang menarik, tetapi itu membuat keputusan saya lebih sulit.
Pertanyaan saya adalah: Apakah ada referensi yang dapat saya gunakan, mungkin buku atau sesuatu seperti pohon keputusan yang dapat saya rujuk untuk memutuskan cara mana yang harus saya gunakan berdasarkan beberapa variabel input, seperti:
- Kematangan skema basis data
- Bagaimana log akan ditanyakan
- Probabilitas bahwa itu akan perlu untuk membuat ulang catatan
- Yang lebih penting: menulis atau membaca kinerja
- Sifat nilai-nilai yang sedang dicatat (string, angka, gumpalan)
- Ruang penyimpanan tersedia
Pendekatan yang saya tahu adalah:
1. Tambahkan kolom untuk tanggal dan pengguna yang dibuat dan dimodifikasi
Contoh tabel:
- Indo
- value_1
- value_2
- value_3
- Created_date
- tanggal yang diubah
- dibuat oleh
- modified_by
Kontra utama: Kami kehilangan sejarah modifikasi. Tidak dapat mengembalikan setelah komit.
2. Masukkan hanya tabel
- Indo
- value_1
- value_2
- value_3
- dari
- untuk
- dihapus (Boolean)
- pengguna
Kontra utama: Bagaimana cara memperbarui kunci asing? Dibutuhkan ruang besar
3. Buat tabel sejarah terpisah untuk setiap tabel
Contoh tabel sejarah:
- Indo
- value_1
- value_2
- value_3
- value_4
- pengguna
- dihapus (Boolean)
- cap waktu
Kontra utama: Perlu menduplikasi semua tabel yang diaudit. Jika skema berubah, maka akan diperlukan juga untuk memigrasi semua log.
4. Buat Tabel Riwayat Konsolidasi untuk Semua Tabel
Contoh tabel sejarah:
- table_name
- bidang
- pengguna
- nilai baru
- dihapus (Boolean)
- cap waktu
Kontra utama: Apakah saya dapat membuat ulang catatan (kembalikan) jika diperlukan dengan mudah? Kolom new_value harus berupa string besar sehingga dapat mendukung semua jenis kolom yang berbeda.