SORU
2 EYLÜL 2008, Salı


Düzeltmeler için Veritabanı Tasarımı?

Proje gereği veritabanında varlıklar için tüm düzenlemeler(Değişiklik Geçmişi) depolamak için. Şu anda bu 2 dizayn önerileri var:

örneğin "Çalışan" Varlık

Tasarım 1:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- Holds the Employee Revisions in Xml. The RevisionXML will contain
-- all data of that particular EmployeeId
"EmployeeHistories (EmployeeId, DateModified, RevisionXML)"

Tasarım 2:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- In this approach we have basically duplicated all the fields on Employees 
-- in the EmployeeHistories and storing the revision data.
"EmployeeHistories (EmployeeId, RevisionId, DateModified, FirstName, 
      LastName, DepartmentId, .., ..)"

Bu işi yapmanın başka bir yolu var mı?

"Tasarım 1 veri erişimi için gereken zaman. XML ayrıştırma için her zaman var olan" sorun Bu süreç yavaş ve Ayrıca biz gibi bazı sınırlamalar eklenemiyor revizyon katılır veri alanları ekleyin.

Ve "Tasarım 2 Her ve tüm varlıklar (70-80 civarında olan revizyonlar korumak isteyen kuruluşlar var). her alanda çoğaltmak için" ile sorun

CEVAP
2 EYLÜL 2008, Salı


Burada sormamız gereken önemli soru şu bence geçmişini kullanarak olacak Ne / Kim'?

Eğer çoğunlukla / insan okunabilir tarih raporlama için olacak, geçmişte bu planı uyguladık...

Bir tablo 'AuditTrail' ya da aşağıdaki alanları olan bir şey... oluşturun

[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NULL,
[EventDate] [datetime] NOT NULL,
[TableName] [varchar](50) NOT NULL,
[RecordID] [varchar](20) NOT NULL,
[FieldName] [varchar](50) NULL,
[OldValue] [varchar](5000) NULL,
[NewValue] [varchar](5000) NULL

Sonra 'LastUpdatedByUserİD' her zaman yeniden ayarlanması gereken tüm tabloları sütun yaptığın tablo Ekle / güncelle. bir bir ekleyebilirsiniz

Sonra her tablo için bir tetikleyici olur update / ınsert yakalamak için ekleyebilirsiniz ve değişen her alan için bu tabloda bir giriş oluşturur. Bu tablo da 'LastUpdateByUserİD' her update / ınsert için, denetim masasına eklerken tetikleyici bu değer erişebilir ve kullanabilirsiniz. besleniyor çünkü

Recordıd alan tablo güncelleştirilen bir anahtar alan değerini saklamak için kullanırız. Eğer kombine bir anahtar olsaydı, biz sadece '~' alanlar arasında. bir ile bir dize birleştirme yapmak

Eminim bu sistem olabilir dezavantajları için yoğun bir şekilde güncellenen veritabanı performans isabet olabilir, ama benim web uygulaması, çok daha fazla okur ve daha yazar gibi görünüyor performans oldukça iyi. Biz bile tetikler tabloya göre tanımları otomatik olarak yazmak için küçük VB.NET bir yardımcı program yazdı.

Sadece bir düşünce!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesomesauce Network

    Awesomesauce

    4 EKİM 2012
  • KSI

    KSI

    25 Temmuz 2009
  • Ty Moss

    Ty Moss

    20 Kasım 2007