Sizinle tasarımımı paylaşacağım ve her bir varlık türü için bir tablo gerektirmesi bakımından her iki tasarımınızdan farklıdır. Herhangi bir veritabanı tasarımını tanımlamanın en iyi yolunu buldum, işte benimki: ERD:

Bu örnekte çalışan adında bir varlığımız var . kullanıcı tablosu, kullanıcılarınızın kayıtlarını tutar ve varlık ve varlık_görünümü , sisteminizde sahip olacağınız tüm varlık türleri için revizyon geçmişini tutan iki tablodur . Bu tasarım şu şekilde çalışır:
Entity_id ve revision_id için iki alan
Sisteminizdeki her varlığın kendine ait benzersiz bir varlık kimliği olacaktır. Varlığınız revizyonlardan geçebilir ancak varlık kimliği aynı kalacaktır. Bu varlık kimliğini çalışan tablonuzda (yabancı anahtar olarak) tutmanız gerekir. Varlığınızın türünü de varlık tablosunda saklamalısınız (örneğin, 'çalışan'). Revision_id'ye gelince, adından da anlaşılacağı gibi, varlık revizyonlarınızı takip eder. Bunun için bulunan en iyi yolu kullanmaktır employee_id sizin REVISION_ID olarak. Bu, farklı türdeki varlıklar için yinelenen revizyon kimliklerine sahip olacağınız anlamına gelir, ancak bu benim için bir muamele değildir (durumunuzdan emin değilim). Yapılması gereken tek önemli not, entity_id ve revision_id kombinasyonunun benzersiz olması gerektiğidir.
Ayrıca bir Entity_revision tablosunda revizyon durumunu gösteren durum alanı . Bu üç durumdan birine sahip olabilir: latest, obsoleteveya deleted(revizyon tarihindeki güvenerek değil size sorguları artırmak için bir hayli yardımcı olur).
Revision_id ile ilgili son bir not: Employ_id ile revision_id arasında bağlantı kuran bir yabancı anahtar oluşturmadım, çünkü gelecekte ekleyebileceğimiz her varlık türü için entity_revision tablosunu değiştirmek istemiyoruz.
EKLEME
Veritabanına eklemek istediğiniz her çalışan için ayrıca bir kayıt da ekleyeceksiniz. varlık ve varlık_görünümüne . Bu son iki kayıt, veritabanına bir kaydın kim tarafından ve ne zaman eklendiğini izlemenize yardımcı olacaktır.
GÜNCELLEME
Mevcut bir çalışan kaydı için her güncelleme, biri çalışan tablosunda, diğeri varlık_başvurusunda olmak üzere iki ek olarak uygulanacaktır. İkincisi, kaydın kim tarafından ve ne zaman güncellendiğini bilmenize yardımcı olacaktır.
SİLME
Bir çalışanı silmek için, entity_revision içine silme işlemini belirten bir kayıt eklenir ve yapılır.
Bu tasarımda görebileceğiniz gibi, veri tabanından hiçbir veri değiştirilmez veya kaldırılmaz ve daha da önemlisi her varlık türü yalnızca bir tablo gerektirir. Şahsen ben bu tasarımı gerçekten esnek ve kullanımı kolay buluyorum. Ama ihtiyaçlarınız farklı olabileceğinden emin değilim.
[GÜNCELLEME]
Yeni MySQL sürümlerinde desteklenen bölümleri olduğu için tasarımımın da en iyi performanslardan biriyle geldiğine inanıyorum. Bir bölümlemek entitykullanarak tablo typebölüm ise alanını entity_revisionkendi kullanarak statealanını. Bu SELECT, tasarımı basit ve temiz tutarken sorguları büyük ölçüde artıracaktır .