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.
sumber
Jawaban:
Salah satu metode yang digunakan oleh beberapa platform wiki adalah memisahkan data pengidentifikasian dan konten yang Anda audit. Ini menambah kerumitan, tetapi Anda berakhir dengan jejak audit dari catatan lengkap, bukan hanya daftar bidang yang diedit yang kemudian harus Anda hancurkan untuk memberi pengguna gambaran tentang seperti apa rekaman lama itu.
Jadi misalnya, jika Anda memiliki tabel bernama Peluang untuk melacak penawaran penjualan, Anda sebenarnya akan membuat dua tabel terpisah:
Peluang
Opportunities_Content (atau sesuatu seperti itu)
The Peluang tabel akan memiliki informasi akan Anda gunakan untuk secara unik mengidentifikasi catatan dan akan rumah kunci utama Anda akan referensi untuk hubungan kunci asing Anda. The Opportunities_Content meja akan menahan semua bidang pengguna Anda dapat mengubah dan yang Anda ingin tetap audit trail. Setiap catatan dalam tabel Konten akan mencakup PK-nya sendiri dan data yang diubah oleh dan tanggal yang dimodifikasi. The Peluang meja akan mencakup referensi untuk versi saat ini serta informasi tentang kapan rekor utama awalnya diciptakan dan oleh siapa.
Berikut ini contoh sederhana:
Dan isinya:
Saya mungkin akan membuat PK dari tabel isi kunci multi-kolom dari PageID dan Revisi asalkan Revisi adalah tipe identitas. Anda akan menggunakan kolom Revisi sebagai FK. Anda kemudian menarik catatan konsolidasi dengan BERGABUNG seperti ini:
Mungkin ada beberapa kesalahan di sana ... ini di atas kepala saya. Ini seharusnya memberi Anda gambaran tentang pola alternatif.
sumber
PageContent.PageID
untuk FKPage.ID
danPage.CurrentRevision
FKPageContent.Revision
? Apakah ketergantungan ini benar-benar melingkar?id, revision_id
; lebih dari tabel persimpangan, sungguh. Ini terasa agak bau bagi saya. Apa keuntungannya dibandingkan pendekatan 3 dalam OP (tabel sejarah per tabel yang diaudit)?Jika Anda menggunakan SQL Server 2008, Anda mungkin harus mempertimbangkan Ubah Data Capture. Ini baru untuk tahun 2008 dan dapat menghemat banyak pekerjaan.
sumber
Saya tidak tahu referensi apa pun, tetapi saya yakin seseorang telah menulis sesuatu.
Namun, jika tujuannya hanya untuk memiliki catatan tentang apa yang terjadi - penggunaan log audit yang paling khas - maka mengapa tidak menyimpan semuanya:
Agaknya ini dipertahankan oleh pemicu.
sumber
Kami akan membuat contoh database kecil untuk aplikasi blogging. Diperlukan dua tabel:
blog
: menyimpan ID pos unik, judul, konten, dan bendera yang dihapus.audit
: menyimpan serangkaian perubahan historis dasar dengan ID rekaman, ID posting blog, tipe perubahan (BARU, EDIT atau HAPUS) dan tanggal / waktu perubahan itu. SQL berikut ini membuatblog
dan mengindeks kolom yang dihapus:SQL berikut ini membuat
audit
tabel. Semua kolom diindeks dan kunci asing didefinisikan untuk audit.blog_id yang merujuk blog.id. Karenanya, ketika kita secara fisik HAPUS entri blog, riwayat audit lengkapnya juga dihapus.sumber
Saya pikir tidak ada yang seperti pohon keputusan. Karena beberapa pro dan kontra (atau persyaratan) tidak benar-benar dapat dihitung. Bagaimana Anda mengukur Kematangan misalnya?
Jadi, segariskan persyaratan bisnis Anda untuk pendataan audit Anda. Cobalah untuk memprediksi bagaimana persyaratan ini dapat berubah di masa depan dan hasilkan persyaratan teknis Anda. Sekarang Anda dapat membandingkannya dengan pro dan kontra dan memilih opsi yang tepat / terbaik.
Dan yakinlah, tidak masalah bagaimana Anda memutuskan, akan selalu ada seseorang yang berpikir Anda membuat keputusan yang salah. Namun, Anda melakukan pekerjaan rumah Anda dan Anda membenarkan keputusan Anda.
sumber