n'abend,
Worum's mir aber eher geht: Sind solche Tabellenstrukturen vertretbar?
In zwei unterschiedlichen Projekten verwenden wir zwei unterschiedliche Ansätze.
-
Eine Tabelle:
Alle Daten, auch die alten Versionen, werden in der selben Tabelle gespeichert. Dabei hat die Tabelle die Spalten recfrom und rectill, welche Timestamps enthalten. recfrom gibt dabei an wann der Datensatz erstellt wurde, rectill gibt an wann der Datensatz durch einen neuen ersetzt wurde. Der aktuellste Datensatz hat dabei immer rectill = 0. Für einen einfacheren Umgang (lesen) gibt es einen VIEW: SELECT * FROM table WHERE rectill = 0; Man spart sich also das lästige und langsame Suchen nach der aktuellsten Versionsnummer. -
Drei Tabellen
Die aktuellen Daten sind in einer Tabelle gespeichert. In einer Tabelle sind die Versionsnummern, Autor der Änderung, Kommentare, etc gespeichert. Die veralteten Datensätze sind wiederum in einer eigenen Tabelle mit Referenz auf die Versions-Tabelle gespeichert. Für die Versionen wird eine eigene Tabelle eingesetzt, weil es viele versionierte Tabellen gibt und multiple Datensätze in der selben Revision verändert werden können.
Der erste Ansatz hat den großen Vorteil, dass die Datenbank überschaubar klein bleibt. Allerdings hat sie den Nachteil, dass das Spiel mit der referentiellen Integrität nicht so wirklich toll funktioniert. Was für eine saubere Datenstruktur irgendwie untragbar ist.
Der zweite Ansatz hat zwar den Nachteil, dass man auf einmal viel mehr Tabellen hat, bringt aber mehrere Vorteile mit sich. Zunächst ist die referentielle Integrität kein Problem. Auf den zweiten Blick kann man mit dieser Struktur viele Änderungsoperationen unter einer Revisionsnummer (mit lauter tollen Metadaten) ablegen (und notfalls wiederherstellen).
Datenbanksysteme, die Schemas kennen (z.B. PostGreSQL), sind für den zweiten Ansatz besonders geeignet. Praktisch die gleiche Struktur kann in getrennten Schemas abgelegt werden. Organisatorisch ist das ein Traum...
weiterhin schönen abend...
#selfhtml hat ein Forum?
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|