Ich ging durch post für die Versionierung von Tabellen auf Datensatzebene. Ich habe bemerkt, dass die Architektur die Verwendung von History-Tabellen behandelt. Mein Szenario erfordert jedoch kein Rollback, sondern das Abrufen von Zeitpunktzahlen. Hier habe ich mit einem Entwurf versucht, eine einzige Tabelle für die Versionierung zu verwenden. Beachten Sie, dass es sich um reine Basket-Tabellendaten handelt (keine Einschränkungen, Indizes usw.). Ich beabsichtige, basierend auf ID zu indizieren, da dies eine Gruppierung nach Klausel in der Spalte beinhaltet.Datenbankversionierung ohne Protokolltabellen
Zum Beispiel habe ich eine Tabelle Test bekam, wo
id die Kennung,
modstamp ist der Zeitstempel der Daten (nie null)
Neben der Spalten darüber, die Tabelle enthält Buchhaltungsspalten
local_modstamp ist die t imestamp, bei der die Aufzeichnung, bei der
del_modstamp ist der Zeitstempel aktualisiert wurde der Datensatz
Während der Sicherung werden alle Datensätze erhalten werden von der Quelle und eingefügt, wo die Datensätze, die Werte würden local_modstamp = gelöscht null und del_stamp = null.
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
Sobald die Datensätze erhalten werden, das sind die Szenarien für die Datenverarbeitung (vorausgesetzt, die Referenzzeit [ref_time] wird die Zeit, zu der der Prozess ausgeführt wird):
Insert wie normal.
Aktualisierung: Aktualisiere den letzten Datensatz mit local_modstamp = ref_time. Dann fügen Sie den neuen Datensatz ein. Die Abfrage wäre: Update Testset local_modstamp = wobei id = und local_modstamp nicht null ist und del_modstamp ist nicht null Einsatz in Testwerte (...)
Löschen: mit del_modstamp den letzten Datensatz aktualisieren, = ref_time. Update Testset del_modstamp = wobei id = und local_modstamp ist nicht null und del_modstamp ist nicht null
Der Entwurf zielt darauf ab, die neuesten Aufzeichnungen bekommen, wo local_modstamp nicht null ist und del_modstamp ist nicht null. Allerdings lief ich in ein Problem, wo ich beabsichtige, die Abfrage (am weitesten innen Abfrage) abrufen Zeitpunkt mit:
select id, max(modstamp) from test where modstamp <= <ref_time> and (del_modstamp is null || del_modstamp <= <ref_time>) group by id;
Es scheint, dass ich einen Fehler gemacht habe (habe ich?) Die Verwendung von null als ein Platzhalter, um die neuesten Datensätze der Tabelle zu identifizieren. Gibt es eine Möglichkeit, das vorhandene Design zu verwenden, um die Zeitpunkte zu erhalten?
Wenn nicht, denke ich, dass die wahrscheinliche Lösung darin besteht, den local_modstamp auf die neuesten Datensätze zu setzen. Dies würde erfordern, die Logik mit max (local_modstamp) im Falle von Updates zu aktualisieren. Kann ich auf meiner bestehenden Architektur bestehen bleiben, um die Zeitpunktzahlen zu erhalten?
Ich benutze SQL-Server jetzt, aber dieses Design kann auch auf andere Datenbankprodukte erweitert werden. Ich beabsichtige, einen allgemeineren Ansatz zu verwenden, um die Daten abzurufen, anstatt herstellerspezifische hacks zu verwenden.
Wenn ich eine Löschung durchführe, wird die neueste Version mit 1 markiert oder wird sie eingefügt und dann mit 1 gelöscht? Dies betrifft die Abfrage 'und v.IsDeleted = 0;' in der Abfrage. Zum Beispiel, Sally verlässt das Unternehmen am 2016-10-01, aber ich muss abfragen, was ist der Staat am 2016-06-01, wird ignoriert werdenDeleted in der Klausel den Zweck zu erreichen? Ich bin in einem Rätsel, ob ich die Tische normalisieren soll. Ich speichere ein paar Tausend in einem Schema, und ob sie zu zweien normalisiert werden, wird den Tisch nicht aufblähen. Kann dies portiert werden, um auf dem gleichen Tisch zu erfolgen? – dmachop
Wenn keine statischen Daten vorhanden sind und jede Spalte in der Versionstabelle versioniert ist, kann die obige Lösung mit einer einzelnen Tabelle durchgeführt werden. Wann immer Sie den Zeitpunkt oder die neuesten Daten auswählen, müssen Sie eine temporäre Tabelle erstellen (wählen Sie eine eindeutige ID von der Version aus) und führen Sie dann die Verknüpfung nach Bedarf durch. – dmachop
Die PK ist statisch und die Erfahrung zeigt, dass es selten andere statische Attribute gibt. Sie benötigen jedoch immer noch zwei Tabellen, selbst wenn die Haupttabelle nur die PK enthält. Sie benötigen eine nicht versionierte Master-Tabelle als Ziel von FKs aus anderen Tabellen. Wenn Sie die verschiedenen Versionierungsschemata durchlesen, war das große, unüberwindbare Problem immer der Mangel an referenzieller Integrität. Dies (vnf) löst dieses Problem. – TommCatt