Bir MySQL veritabanında İlişkisel Verileri Sürümlemek için Kalıplar?


12

Bir kullanıcının kayıtları düzenleyebileceği ve bu kayıtların geçmiş sürümlerini görebildiği bir proje için bir yaklaşım bulmaya çalışıyorum. Aşağıda, bir liste kullanarak sessizleştirilmiş bir örnek şema verilmiştir:

TABLE list (
  id int auto_increment primary key,
  user_id int, 
  title varchar(255)
);

TABLE list_tasks (
  id int auto_increment primary key,
  list_id int,
  title varchar(255),
  order int,
  is_complete tinyint
);

Böylece bir kullanıcı içeri girebilir ve listede birkaç düzenleme yapabilir, (yani, görev ekleme veya kaldırma, görevleri yeniden sipariş etme, bazılarını tamamla işaretleme, bazılarını yeniden adlandırma vb.), Sonra kaydedin. Bu noktada, liste ve görevlerin bir 'sürüm 2' oluşturmak ve önceki sürümleri görüntüleyebilmelerini istiyorum, ancak listeye eriştiklerinde her zaman en son sürümü edinin.

Bir MySQL veritabanında bu şekilde sürüm verilerinin ele alınması için ortak bir yaklaşım / tasarım modeli var mı?


Bunun kütüphane olduğunu unutmayın. Örneğin Hazırda Beklet'i kullanıyorsanız, Hazırda Bekletme Modları vardır. Dolayısıyla, DAO'yu işleyen bir çerçeveniz varsa, böyle bir şey olup olmadığını aramaya çalışın.
Walfrat

Yanıtlar:


9

Bunu bir db yapmak istemek oldukça yaygın. Öğelerin bir listesi için bir revizyon izlemek istediğinizde üzerine bir bükülme koyuyorsunuz.

Bunu yapmanın bir yolu, aşağıdaki gibi yapıyı değiştirmek olabilir.

Alter table lists add revision_id integer;
Alter table list_tasks add revision_id integer;

Create Table revisions
{
   id int autoincrement... (revision id)
   list_id int...
   revdate datetime...
}

Kullanıcı listelerini kaydettiğinde, revisionsyukarıdaki tabloda yeni bir düzeltme oluşturun ve bu değeri 'geçerli' düzeltme olarak işaretlemek için bu değeri içindeki liste öğelerine list_tasksve ardından düzeltme kimliğine atayın lists. Kullanıcı öğeleri düzenlediğinde, mevcut öğeleri düzenlemeyin - bunun yerine, yeni bir düzeltme kimliğine sahip olanları ekleyin ve listtabloyu mevcut düzeltme olarak işaretlemek için bu revizyonla güncelleyin .

Ardından, geçerli öğeleri listelemek için liststabloda belirtilen geçerli düzeltme kimliğindeki öğeleri listeleyin . Önceki sürümlere göz atmak için revizyonlar tablosundan listelerin önceki revizyonlarının bir listesini alabilir ve ardından bu kimliğe göre öğeleri tek tek listeleyebilirsiniz.


5

Bu çözüm ayrı bir denetim tablosu kullanır. Artıları ve eksileri vardır. Eski kayıtları ana tablonuzdan kaldırmayı tercih edebilirsiniz. Performans artışı göz ardı edilebilir.

Denetlenen her tabloya aşağıdaki alanları ekleyin:

AddUserID      int <whatever your system uses>
AddDateTime    datetime
UpdateUserID   int <whatever your system uses>
UpdateDateTime datetime
CurrentVersion int
IsDeleted      bit

Veri her değiştiğinde bu alanları güncellemeniz gerekir. CurrentVersion 1 arttırılır (Bir kaydı kilitlemenin bir yolu olarak kullanılabilir, ancak bu başka bir soru.) IsDeleted, ileride başvurulabilmesi için bir "yumuşak silme" sağlar.

Ayrı Denetim Tabloları Her tablonun karşılık gelen _Archive veya _History sürümü olmalıdır. Bunların muhtemelen aynı şekilde dizine eklenmesi gerekmez. Açıkçası tek bir birincil anahtar alanı geçerli olmayacaktır. Kimlik alanından ve UpdateDateTime öğesinden bileşik anahtar oluşturabilmeniz gerekir.

Bir tetikleyici kullanarak (Bu, kodunuzun içinde veya dışında yapılan değişiklikleri ele alacaktır. Durumunuz için işe yarayıp yaramayacağına karar verebilirsiniz.) Veya başka bir kodlama, bir kayıt eklendiğinde, güncellendiğinde veya silindiğinde, kaydın bir kopyası arşive yerleştirilir / geçmiş tablosu. Tüm sürümler ve diğer denetim alanları korunur. Bu, kullanıcıların ne zaman ne yaptığını size söyleyecektir. Bir kaydın ne zaman değiştirildiğini görmek veya eğilimleri görmek için tablo kendisiyle karşılaştırılabilir.

Son birkaç yıldır bu işi iyi gördüm. Düşünmediğim dezavantajları duymak isterim.


Bunu hem GrandMasterB'ların yanı sıra destekliyorum, hem de iyi ve hangisini kullanacağım, özel ihtiyaçlarla ilgili daha fazla ayrıntıya bağlı.
Junky

-2

Bu ayrıntılı makaleyi okumanızı öneririm.

https://blog.jondh.me.uk/2011/11/relational-database-versioning-strategies/comment-page-1/#comment-373850

Başka bir yaklaşım tablonuzda bir version_id sütunu ve hangi satırın geçerli satır olduğunu belirten bir 'geçerli' bayrağı bulundurmaktır. Her güncelleme gerektiğinde, yeni bir satır ekleyebilir ve mevcut 'geçerli' bayrağını 0 / false ve yeni eklenen satırı 1 olarak ayarlayabilirsiniz.

Bu şekilde yalnızca geçerli bayrak ayarlı olanları gösteren bir görünüm oluşturabilirsiniz.

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.