Üzerinde çalıştığım bir projede , veritabanının bazı tablolarındaki satırlarda yapılan her değişiklik, daha fazla denetim veya geri alma için izlenmelidir . Satırı kimin, hangi IP adresinin ne zaman ve ne zaman değiştirdiğini bulmak ve önceki sürümü geri yükleyebilmek kolay olmalıdır.
Benzer bir şey, örneğin Stack Exchange tarafından kullanılır. Başka birinin sorusunu değiştirdiğimde, değiştirdiğimi bulmak ve değişiklikleri geri almak mümkündür.
Geçerli şemamın ortalama bir işletme uygulamasıyla aynı özelliklere (aşağıda) sahip olması nedeniyle, bir nesnede yapılan her değişikliği bir veritabanında depolamak için kullanılan genel teknik nedir ?
- Bazı olabilir: nesneler nispeten küçük boyuta sahip
nvarchar(1000)
, örneğin ancak ikili verilerin büyük lekeler, bu bir doğrudan ve direkt olarak diskte depolanır ve erişilen değil değil , Microsoft SQL arasındafilestream
, - Veritabanı yükü oldukça düşük ve tüm veritabanı sunucudaki bir sanal makine tarafından işleniyor,
- Önceki sürümlere erişimin en son sürüme erişim kadar hızlı olması gerekmez, ancak yine de güncel olması gerekir¹ ve çok yavaş değildir².
<Tl-dr>
Aşağıdaki vakaları düşündüm, ancak bu tür senaryolarla ilgili gerçek bir deneyimim yok, bu yüzden başkalarının fikirlerini duyacağım:
Satırları kimlik ve sürüme göre ayırarak her şeyi aynı tabloda saklayın. IMO, ciddi bir şekilde aptalca ve performans düzeyinde yakında veya daha sonra incinecek. Bu yaklaşımla, en son öğelere ve sürüm izlemesine farklı bir güvenlik düzeyi ayarlamak da imkansızdır. Son olarak, her sorgunun yazılması daha karmaşık olacaktır. Aslında, güncel verilere erişmek için her şeyi kimliğe göre gruplamak ve her grupta son sürümü almak zorunda kalırdım.
En son sürümü bir tabloda saklayın ve her değişiklikte eski sürümü başka bir şemadaki başka bir tabloya kopyalayın. Kusur şu ki, her seferinde, değişmemiş olsa bile her değeri saklıyoruz.
null
Değerin ne zamannull
veya olarak değiştirildiğini de izlemem gerektiğinden, değişmeyen değerleri olarak ayarlamak bir çözüm değildirnull
.En son sürümü bir tabloda ve değiştirilen özellikler listesini önceki değerleri ile başka bir tabloda depolayın. Bu iki kusura sahip gibi görünüyor: en önemlisi, aynı sütundaki heterojen önceki değer türlerini sıralamanın tek yolunun a
binary(max)
. İkincisi, bence, önceki sürümleri kullanıcıya görüntülerken bu yapıyı kullanmak daha zor olurdu.Önceki iki noktayla aynı işlemi yapın, ancak sürümleri ayrı bir veritabanında saklayın. Performans açısından, aynı veritabanında önceki sürümlere sahip olarak en son sürümlere erişimi yavaşlatmaktan kaçınmak ilginç olabilir; Yine de, bunun erken bir optimizasyon olduğuna ve yalnızca aynı veritabanında eski ve en son sürümlere sahip olmanın bir darboğaz olduğuna dair bir kanıt varsa yapılması gerektiğine inanıyorum.
</ Tl-dr>
¹ Örneğin, HTTP günlükleri için yapıldığı gibi değişikliklerin bir günlük dosyasına kaydedilmesi ve sunucu yükünün en düşük olduğu gece verileri günlükten veritabanına akıtmak kabul edilemez. Farklı sürümler hakkındaki bilgiler derhal ya da hemen erişilebilir olmalıdır; birkaç saniye gecikme kabul edilebilir.
² Bilgiye çok sık erişilemez ve sadece belirli bir grup kullanıcı tarafından erişilebilir, ancak yine de sürüm listesinin görüntülenmesi için 30 saniye beklemeye zorlanması kabul edilemez. Yine, birkaç saniye gecikme kabul edilebilir.