Ich werde mein Design mit Ihnen teilen und es unterscheidet sich von Ihren beiden Designs darin, dass es eine Tabelle pro Entitätstyp erfordert. Ich habe festgestellt, dass der beste Weg, ein Datenbankdesign zu beschreiben, die ERD ist. Hier ist meine:
In diesem Beispiel haben wir eine Entität namens Mitarbeiter . Die Benutzertabelle enthält die Datensätze Ihrer Benutzer, und entity und entity_revision sind zwei Tabellen, die den Revisionsverlauf für alle Entitätstypen enthalten, die in Ihrem System vorhanden sind. So funktioniert dieses Design:
Die beiden Felder entity_id und revision_id
Jede Entität in Ihrem System verfügt über eine eigene eindeutige Entitäts-ID. Ihre Entität wird möglicherweise überarbeitet, aber ihre entity_id bleibt gleich. Sie müssen diese Entitäts-ID in Ihrer Mitarbeitertabelle behalten (als Fremdschlüssel). Sie sollten auch den Typ Ihrer Entität in der Entitätstabelle speichern (z. B. 'Mitarbeiter'). Wie der Name schon sagt, verfolgt die revision_id die Entitätsrevisionen. Der beste Weg, den ich dafür gefunden habe, ist, die employee_id als Ihre revision_id zu verwenden. Dies bedeutet, dass Sie doppelte Revisions-IDs für verschiedene Arten von Entitäten haben, aber das ist für mich kein Vergnügen (ich bin mir über Ihren Fall nicht sicher). Der einzige wichtige Hinweis ist, dass die Kombination von entity_id und revision_id eindeutig sein sollte.
Es gibt auch einen Zustand Feld innerhalb entity_revision Tabelle , die den Zustand der Revision angezeigt. Es kann einen der drei Zustände haben : latest
, obsolete
oder deleted
( wenn Sie sich nicht auf das Datum der Überarbeitung verlassen, können Sie Ihre Abfragen erheblich verbessern).
Ein letzter Hinweis zu revision_id: Ich habe keinen Fremdschlüssel erstellt, der employee_id mit revision_id verbindet, da wir die Tabelle entity_revision nicht für jeden Entitätstyp ändern möchten, den wir möglicherweise in Zukunft hinzufügen.
EINSATZ
Für jeden Mitarbeiter , den Sie in die Datenbank einfügen möchten, fügen Sie der Entität und der Entitätsrevision einen Datensatz hinzu . Mithilfe dieser beiden letzten Datensätze können Sie verfolgen, von wem und wann ein Datensatz in die Datenbank eingefügt wurde.
AKTUALISIEREN
Jede Aktualisierung für einen vorhandenen Mitarbeiterdatensatz wird als zwei Einfügungen implementiert, eine in der Mitarbeitertabelle und eine in entity_revision. Der zweite hilft Ihnen zu wissen, von wem und wann der Datensatz aktualisiert wurde.
STREICHUNG
Zum Löschen eines Mitarbeiters wird in entity_revision ein Datensatz eingefügt, der das Löschen angibt und abgeschlossen ist.
Wie Sie in diesem Entwurf sehen können, werden niemals Daten geändert oder aus der Datenbank entfernt, und was noch wichtiger ist, jeder Entitätstyp erfordert nur eine Tabelle. Persönlich finde ich dieses Design sehr flexibel und einfach zu bearbeiten. Aber ich bin mir nicht sicher, da Ihre Bedürfnisse unterschiedlich sein könnten.
[AKTUALISIEREN]
Nachdem ich Partitionen in den neuen MySQL-Versionen unterstützt habe, glaube ich, dass mein Design auch eine der besten Leistungen bietet. Man kann eine entity
Tabelle mit einem type
Feld partitionieren entity_revision
, während man eine Partition mit seinem state
Feld erstellt. Dies wird die SELECT
Abfragen bei weitem beschleunigen und gleichzeitig das Design einfach und sauber halten.