Veritabanı denetim günlüğü için tasarım
Her zaman çok zaman geçiriyorum yeni bir veritabanı tasarlamak istiyorum veritabanı şeması bir denetim günlüğü tutmak yapayım nasıl düşündüğünü değişiklikleri.
Bazı sorular zaten bu konuda, ama ben aynı fikirde değilim istendi tüm senaryolar için en iyi tek bir yol daha var:
- Database Design For Revisions
- Best design for a changelog auditing database table
- Ideas on database design for capturing audit trails
Ayrıca her yaklaşımın yanlısı ve eksilerini listesi için çalışır interesting article on Maintaining a Log of Database Changes Bu tökezledi. Çok iyi yazılmış ve ilginç bilgiler var, ama kararlarımı bile zor yaptı.
Benim sorum:Orada kullanabileceğim bir referans, belki bir kitap ya da bir karar gibi bir şey ben o ağacı karar vermek için bakın hangi yolu bazı temel gideyim giriş değişkenleri, gibi:
- Veritabanı şema olgunluk
- Günlükleri nasıl sorgulanacak
- Olması ihtimali kayıtları yeniden oluşturmanız gerekir
- Ne daha önemli: okuma veya yazma performansı
- Oturum değerleri (string, sayı, lekeler) doğası
- Depolama alanı mevcut
Bu bildiğim yaklaşımlar:
1. Ve değiştirilme tarihi ve kullanıcı oluşturulan sütun ekleyin
Tablo örneği:
- ıd
- value_1
- value_2
- value_3
- created_date
- modifed_date
- created_by
- modified_by
Büyük eksileri: Değişiklik Tarihi kaybederiz. Geri alma taahhüt sonra.
2. Ekle tablolar yalnızca
- ıd
- value_1
- value_2
- value_3
- dan
- için
- silinen (boolean)
- kullanıcı
Güncel yabancı anahtarları tutmak için Nasıl? büyük eksileri: Büyük bir boşluk vardı
3. Her tablo için Ayrı bir geçmiş bir tablo oluşturmak
Tarih tablo örnek:
- ıd
- value_1
- value_2
- value_3
- value_4
- kullanıcı
- silinen (boolean)
- zaman damgası
Büyük eksileri: denetlenen tüm tabloları. yinelenen Gerekiyor Eğer şema değişiklikleri tüm kayıtlara geçirmek için çok gerekli olacak.
4. Tüm Tabloları Konsolide geçmiş bir Tablo oluşturmak
Tarih tablo örnek:
- table_name
- alan
- kullanıcı
- yeni_değer
- silinen (boolean)
- zaman damgası
Büyük eksileri: eğer kolayca gerekirse kayıtları (geri alma) yeniden mümkün Olacak? Yeni_değer sütun farklı sütun türleri destekleyebilir çok büyük bir dize olması gerekir.
CEVAP
Birkaç wiki platformları tarafından kullanılan bir yöntem tanımlayıcı verileri ve denetim olduğunuz içerik ayırmaktır. Bu karmaşıklık ekler, ama sonunda bir denetim izi tam kayıtları, sadece listeleri alanları vardı düzenlenmiş sana sonra püre ver kullanıcı ne bir fikir eski kayıt benziyordu.
Eğer olsaydı yani, örneğin, bir masa aradıFırsatlarsatış fiyatları takip etmek için, aslında iki ayrı tablo oluşturmak:
Fırsatlar
Opportunities_Content(ya da onun gibi bir şey)
Fırsatlartablo kaydı benzersiz olarak tanımlamak için kullanmak istiyorum bilgi sahibi olacaklar ve yabancı anahtar ilişkileri için referans edersin birincil anahtar evi.Opportunities_Contentmasa kullanıcılar değiştirebilir ve kendisi için bir denetim izi tutmak istiyorsanız, tüm alanları tutun. Her kayıtİçeriktablo-tarafından değiştirilmiş ve değiştirilme tarihi kendi PK verilerini içerir.Fırsatlartablo geçerli sürüm kimler tarafından ana kayıt başlangıçta oluşturulduğunda hakkında bilgi ve başvuru vardır.
Burada basit bir örnek ScrewTurn's veri şemasına göre:
CREATE TABLE dbo.Page(
ID int PRIMARY KEY,
Name nvarchar(200) NOT NULL,
CreatedByName nvarchar(100) NOT NULL,
CurrentRevision int NOT NULL,
CreatedDateTime datetime NOT NULL
Ve içeriği:
CREATE TABLE dbo.PageContent(
PageID int NOT NULL,
Revision int NOT NULL,
Title nvarchar(200) NOT NULL,
User nvarchar(100) NOT NULL,
LastModified datetime NOT NULL,
Comment nvarchar(300) NULL,
Content nvarchar(max) NOT NULL,
Description nvarchar(200) NULL
Muhtemelen Pageıd ve Revizyon sağlanan Revizyon dan çok sütunlu bir anahtar kimlik türü idi içindekiler tablosunun PK yapmak istiyorum. Bu FK olarak Revize sütunu kullanırsınız. Daha sonra bu gibi Katılarak konsolide kaydı çeksin ..
SELECT * FROM Page
JOIN PageContent ON CurrentRevision = Revision AND ID = PageID
Bazı hatalar olabilir. bu benim biraz kafam karisti. Size alternatif bir model hakkında bir fikir vermiş olmalı.
Josh
changelog / denetim veritabanı tablosu...
Tavsiye SQL veritabanı etiket veya eti...
Veritabanı Etiketleme için Tasarım...
Ortak sokak adresi veritabanı dünyanın...
Veritabanı araştırması için tasarım...