Tabel Sejarah Database / Tabel Pelacakan

13

Saat ini saya ingin menyusun tabel pelacakan / riwayat seperti ini:

  • PrimaryKey - ID
  • OtherTableId - fk
  • fieldName - nama bidang yang dilacak
  • OldValue
  • Nilai baru
  • Nama pengguna
  • CreateDateTime

Jadi pada dasarnya saya ingin memiliki tabel yang akan melacak sejarah tabel lain, menyimpan nama kolom bidang yang diubah dengan nilai baru dan lama. Pertanyaan saya, adakah yang bisa melubangi ini? Juga, apa cara termudah untuk memastikan bahwa hanya nama kolom dari tabel pelacakannya dimasukkan ke kolom fieldName? Saat ini opsi saya adalah memiliki enum di layanan yang saya buat, atau membuat tabel status lain dan menjadikan fieldName sebagai fk. Ada ide yang lebih baik?

Sunting Sasaran: Saat ini hanya ada 2 bidang yang ingin kami lacak. Satu bidang akan ditampilkan pada halaman web untuk menampilkan riwayat, bidang lainnya hanya akan diakses oleh satu departemen dan mereka memiliki akses ke tampilan database yang dapat mereka query. Mereka akan menanyakan hanya satu bidang ini untuk mendapatkan informasi tentang siapa yang mengubah bidang dan apa yang harus dilakukan. Ini adalah alasan kami ingin mengaturnya di mana bidang database mendefinisikan kolom tabel daripada memiliki salinan yang tepat dari sejarah catatan tabel. Kami hanya ingin dua bidang dilacak dengan kemungkinan menambah atau menghapus bidang di masa mendatang.

Terima kasih!

pengguna76982
sumber
Apakah Anda tahu sebelumnya berapa banyak tabel yang akan Anda lacak?
Kofi Sarfo
Tabel ini hanya akan melacak satu tabel lainnya, sejauh ini kami hanya melacak tabel yang satu ini.
user76982
Jadi pendekatan ini mungkin berlebihan. Lebih buruk lagi, tidak akan mudah untuk melakukan kueri tabel ini dengan tabel yang dipantau bersama untuk membuat ulang data langsung pada suatu titik waktu, seandainya membuat ulang snapshot bernilai apa pun nilainya.
Kofi Sarfo
1
Di sisi lain kueri untuk melihat kolom mana yang paling sering berubah akan lebih mudah menggunakan pendekatan yang Anda usulkan.
Kofi Sarfo
Anda mungkin ingin mencari di dba.stackexchange.com ; pertanyaan serupa telah diajukan di sana dan beberapa mungkin memiliki jawaban yang dapat Anda gunakan.
FrustratedWithFormsDesigner

Jawaban:

8

Lubang berlubang: bagaimana jika skema basis data diubah pada titik yang sama di kemudian hari, dan nama kolom berubah, atau kolom dihapus sepenuhnya? Banyak sistem basis data memungkinkan ini. Apa yang akan terjadi dengan "fieldName" Anda?

Untuk integritas data: Anda harus memastikan bahwa setiap operasi pembaruan atau penghapusan pasti akan memperbarui tabel pelacakan Anda. Itu paling baik dilakukan dengan pemicu memanggil prosedur tersimpan. Anda harus memastikan hanya prosedur tersimpan yang memiliki akses tertulis ke tabel pelacakan Anda, sehingga tidak ada orang lain yang dapat menulis nilai yang salah.

Jika Anda dapat hidup dengan solusi spesifik vendor db: sebagian besar sistem db memiliki tabel sistem tempat informasi skema (nama tabel, id tabel, nama kolom, dll) disimpan. Anda dapat memeriksa apakah mungkin untuk menetapkan referensi kunci asing ke tabel sistem tersebut. Itu akan memungkinkan untuk mengganti nama bidang dengan ID bidang jika database mendukung sesuatu seperti ini.

Sebenarnya, jika Anda perlu melacak seluruh baris tabel spesifik termasuk semua kolom (dan bukan hanya sebagian kecil dari kolom), Anda harus mempertimbangkan saran @ sarfeast. Baca artikel ini tentang kelemahan dari model pasangan nama-nilai.

Doc Brown
sumber
8

Implementasi audit perubahan (pelacakan riwayat) yang paling sukses yang pernah saya lihat kurang generik dan jauh lebih sederhana. Ini melibatkan membuat tabel log perubahan untuk setiap tabel yang ingin Anda pantau, menjaga nama kolom dan tipe data yang identik (dengan kolom tambahan untuk cap waktu).

Tujuan akhirnya, yaitu, apa yang ingin Anda lakukan dengan data yang diaudit akan membantu mengevaluasi seberapa cocok masing-masing pendekatan.

Kofi Sarfo
sumber
Halo Sarfeast, saya menambahkan tujuan akhir yang ingin saya capai. Maaf karena tidak termasuk ini untuk memulai.
user76982
Pendekatan ini memiliki kelemahan. Baca di sini: database-programmer.blogspot.co.uk/2008/07/history-tables.html
Tuukka Haapaniemi
7

Singkatnya: Anda perlu mengatur mekanisme Jejak Audit untuk tabel yang ingin Anda lacak perubahan nilainya.

Tabel jejak audit tunggal :

Buat tabel untuk mencatat nama tabel, nama bidang dan versi data lama dan baru. Untuk metode ini, biasanya untuk mencatat versi data lama dan baru dan hanya bidang-bidang yang telah berubah. Untuk mengimplementasikan ini di pemicu itu adalah persyaratan bahwa ada kunci utama di atas meja atau hanya satu baris diperbarui.

Berikut ini adalah pos yang bagus dengan skrip tentang cara mencapainya - Membuat Jejak Audit

Referensi lain yang bermanfaat untuk dilihat:

Yusubov
sumber
Tautan kedua buruk sekarang.
Jeremy Harris
@cillosis, Terima kasih telah memperhatikan ini. Itu diperbarui sekarang :)
Yusubov
3

Anda mungkin ingin melihat-lihat dokumentasi proyek NHibernate Envers .

Pada dasarnya, Anda memiliki satu tabel revisi di mana Anda dapat menambahkan data tambahan seperti cap waktu atau pengguna. Kemudian, setiap tabel yang Anda lacak mendapat tabel audit tambahan dengan semua kolom digandakan, sebuah fk ke tabel revisi, dan jenis revisi (tambah, ubah, hapus). AFAIK, Anda tidak ingin tabel audit Anda memiliki FK yang sebenarnya untuk tabel nyata karena itu akan mencegah penghapusan.

dotjoe
sumber