Veritabanı Geçmiş Tablosu / İzleme Tablosu


13

Şu anda böyle bir izleme / geçmiş tablosu yapılandırmak istiyorum:

  • PrimaryKey - Kimlik
  • OtherTableId - fk
  • fieldName - izlediği alanın adı
  • OldValue
  • Yeni değer
  • Kullanıcı adı
  • CreateDateTime

Yani temelde başka bir tablo geçmişini izlemek, yeni ve eski değeri ile değiştirilen alanın sütun adını depolamak bir tablo istiyorum. Sorum şu: Herkes bu konuda delik açabilir? Ayrıca, fieldName sütununa izlediği tablolardan yalnızca bir sütun adının girilmesini sağlamanın en kolay yolu nedir? Şu anda seçeneklerim, oluşturduğum hizmette bir numaralandırma yapmak veya başka bir durum tablosu oluşturmak ve fieldName'i bir fk yapmak. Daha iyi bir fikrin var mı?

Hedefi Düzenle : Şu anda izlememiz gereken yalnızca 2 alan var. Bir alan bir web sayfasında geçmişi görüntülemek için gösterilecek, diğer alana sadece bir departman tarafından erişilecek ve sorgulayabilecekleri veritabanı görünümüne erişebilecektir. Alanı kimin değiştirdiği ve neyin değiştirileceği hakkında bilgi almak için sadece bu alanı sorgulayacaklardı. Bu nedenle, bir veritabanı alanının tablo kayıt geçmişinin tam bir kopyasına sahip olmak yerine tablo sütununu tanımladığı yere ayarlamak istedik. Gelecekte yalnızca alan ekleme veya çıkarma olanaklarıyla izlenen iki alan istiyoruz.

Teşekkürler!


Kaç tablo izleyeceğinizi önceden biliyor musunuz?
Kofi Sarfo

Bu tablo yalnızca bir tablo daha izleyecek, şu ana kadar bu tabloyu izliyoruz.
user76982

Yani bu yaklaşım aşırıya kaçabilir. Daha da kötüsü, herhangi bir değere sahip bir anlık görüntüyü yeniden oluşturmalı, canlı verileri zaman içinde yeniden oluşturmak için birlikte izlenen tabloyla sorgulamak daha kolay olmayacaktır.
Kofi Sarfo

1
Flip tarafında, önerdiğiniz yaklaşımı kullanarak hangi sütunların en sık değiştiğini görmek için sorgu daha kolay olacaktır.
Kofi Sarfo

Dba.stackexchange.com'da arama yapmak isteyebilirsiniz ; orada benzer sorular sorulmuştur ve bazılarının kullanabileceğiniz cevapları olabilir.
Sinirli

Yanıtlar:


8

Delme delikleri: veritabanı şeması daha sonra aynı anda değiştirilirse ve bir sütun adı değişirse veya sütun tamamen silinirse ne olur? Birçok veritabanı sistemi buna izin verir. O zaman "fieldName" inize ne olacak?

Veri bütünlüğü için: her güncelleme veya silme işleminin izleme tablonuzu mutlaka güncelleyeceğinden emin olmalısınız. Bu en iyi saklı yordam çağıran tetikleyiciler tarafından gerçekleştirilir. Başkalarının yanlış değerler yazamaması için yalnızca bu saklı yordamın izleme tablonuza yazma erişimine sahip olduğundan emin olmalısınız.

Bir db satıcısına özel çözüm ile yaşayabiliyorsanız: çoğu db sistemi, şema bilgilerinin (tablo adları, tablo kimlikleri, sütun adları vb.) Depolandığı sistem tablolarına sahiptir. Böyle bir sistem tablosuna yabancı anahtar başvurusu ayarlamanın mümkün olup olmadığını kontrol edebilirsiniz. Bu, veritabanı böyle bir şeyi destekliyorsa, alan adının alan kimliğiyle değiştirilmesine izin verir.

Aslında, belirli sütunların tüm sütunları içeren sütunları (ve yalnızca sütunların küçük bir alt kümesini değil) izlemeniz gerekiyorsa, @ sarfeast'in önerisini dikkate almalısınız. Ad-değer çifti modellerinin dezavantajları hakkında bu makaleyi okuyun .


8

Gördüğüm en başarılı değişiklik denetimi (geçmiş izleme) uygulaması daha az genel ve çok daha basit. İzlemek istediğiniz her tablo için bir değişiklik günlüğü tablosu oluşturmayı, aynı sütun adlarını ve veri türlerini (zaman damgası için ek bir sütunla) tutmayı içerir.

Nihai hedef, yani denetlenen verilerle ne yapmak istediğiniz her yaklaşımın ne kadar uygun olabileceğini değerlendirmenize yardımcı olacaktır.


Merhaba Sarfeast, ulaşmak istediğim son hedefi ekledim. Başlamak için buna dahil etmediğim için üzgünüm.
user76982

Bu yaklaşımın dezavantajları vardır. Burada okuyun: database-programmer.blogspot.co.uk/2008/07/history-tables.html
Tuukka Haapaniemi

7

Kısaca: Değer değişikliğini izlemek istediğiniz tablolar için Denetim İzi mekanizmasını ayarlamanız gerekir .

Tek denetim izi tablosu :

Tablo adını, alan adını ve eski ve yeni sürümlerini kaydetmek için bir tablo oluşturun. Bu yöntem için, verilerin hem eski hem de yeni sürümlerini ve yalnızca değişen alanları günlüğe kaydetmek normaldir. Bunu tetikleyicilerde uygulamak için, tabloda birincil anahtarın bulunması veya yalnızca tek satırların güncellenmesi gerekir.

İşte bunu nasıl başaracağınıza dair senaryolar içeren iyi bir yazı - Denetim Parkurları Oluşturma

Bakmak için diğer yararlı referanslar :


İkinci bağlantı şimdi kötü.
Jeremy Harris

@cillosis, Bunu fark ettiğiniz için teşekkürler. Şimdi güncellendi :)
Yusubov

3

Fikirler için NHibernate Envers proje belgelerine göz atmak isteyebilirsiniz .

Temel olarak, zaman damgası veya kullanıcı gibi ek veriler ekleyebileceğiniz bir revizyon tablonuz var. Ardından, izlediğiniz her tablo, tüm sütunların kopyalandığı ek bir denetim tablosu, revizyon tablosuna bir fk ve revizyon türünü (ekleme, değiştirme, silme) alır. AFAIK, denetim tablolarınızın gerçek tabloya gerçek bir FK sahip olmasını istemezsiniz, çünkü bu silmeleri önler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.