2014-10-12 2 views
5

Dies ist nur eine zufällige Idee, über die ich mich wunderte. Gibt es ORMs oder Datenbanken, die den Tracking-Verlauf nativ unterstützen? Ich stelle mir etwas vor, wo jede Zeile einen zusammengesetzten Primärschlüssel mit einer ID und einer Version hat. Ein Update würde eine neue Zeile mit der gleichen ID und der nächsten verfügbaren Versionsnummer "anhängen". Eine normale Auswahl gibt nur die aktuellste Version einer eindeutig identifizierten Zeile zurück, aber "SelectHistory" würde alle Zeilen zurückgeben. Löschen wäre nativ ein Soft-Delete.ORM oder Datenbank, die wie Versionskontrolle funktioniert und verfolgt Geschichte

Da dies kein neues Problem ist und dass es nichts Neues unter der Sonne gibt, ist mir aufgefallen, dass es eine hohe Wahrscheinlichkeit gibt, dass jemand bereits eine elegante Lösung entworfen hat, die die harten Teile davon abstrahiert und das könnte entweder auf der Datenbankschicht oder der ORM-Schicht durchgeführt werden.

Ich habe eine bestehende Anwendung, die auf Entity Framework aufgebaut ist. Sie überschreibt die SaveChanges-Methode des DbContext, um für jede neue/geänderte Entität die Eigenschaften CreatedBy/CreatedDate/ModifiedBy/ModifiedDate festzulegen. Der Client hat kürzlich gefragt, wie viel Arbeit erforderlich wäre, um die vollständige Verlaufsverfolgung hinzuzufügen. Ich habe ihnen basierend auf früheren Erfahrungen mit ähnlichen Systemen eine angemessene Schätzung gegeben. Meine Schätzung umfasste das Hinzufügen zusätzlicher Entitäten zur Logik des Modells und der Business-Schicht, um diese Entitäten zu füllen. Der Kunde beschloss, diese Arbeit nicht weiter zu verfolgen, aber es brachte mich dazu, mich zu fragen, ob es einen besseren Weg gab. Gibt es eine bessere Lösung mit Entity Framework? Gibt es bessere Lösungen mit anderen Architekturen?

+0

Ich nahm einen anderen Ansatz für die Versionierung unserer Wordpress-Datenbanken. Was ich getan habe, war ein nächtlicher mysqladmin-Dump in ein versioniertes Arbeitsverzeichnis. Nachdem der Speicherauszug fertig war, würde ich einfach die Änderungen bestätigen. – B2K

Antwort

0

Was Sie beschreiben, ist eine Form von multi-version concurrency control. In der Regel wird MVCC im Hintergrund von einer Datenbankimplementierung verwendet, um zu vermeiden, dass Sperren während schreibgeschützter Transaktionen erforderlich sind. Es kann jedoch auch explizit angegeben werden, wie Sie es vorschlagen. Es gibt eine Diskussion über verschiedene Optionen zum Implementieren von expliziten MVCC in this question. Wenn Sie für jede Version auch ein CreatedDate verfolgen, haben Sie alles, was Sie für eine temporal database benötigen.

Verwandte Themen