Frage

Ich habe eine Verpflichtung, alle Versionen eines Unternehmens zu speichern, in einer leicht indizierte Weise und wurde gefragt, ob jemand Eingang hat, welches System zu verwenden.

Ohne das System der Versionsverwaltung ist einfach eine relationale Datenbank mit einer Zeile pro zum Beispiel Person. Wenn der Staat die Person ändert diese Zeile geändert wird, dies zu reflektieren. Mit dem Eintrag Versionierung sollte so aktualisiert werden, so dass wir immer wieder auf eine frühere Version gehen können. Wenn ich eine zeitliche Datenbank verwenden könnte dies wäre frei, und ich wäre in der Lage zu fragen, ‚was der Zustand aller Menschen als von gestern um 14.00 Uhr wohnhaft in Dublin und im Alter von 30 ist‘. Leider scheint es keine ausgereiften Open-Source-Projekte zu sein, die zeitliche tun können.

Eine wirklich böse Art und Weise, dies zu tun, ist nur eine neue Zeile pro Zustandsänderung einzufügen. Dies führt zu einer Verdoppelung, wie eine Person viele Felder, aber nur einen Wechsel pro Update hat. Es ist auch dann ganz langsam, um die richtige Version für jede Person ein Zeitstempel gegeben zu wählen.

In der Theorie sollte es möglich sein, eine relationale Datenbank und ein Versionskontrollsystem zu verwenden, um eine zeitliche Datenbank zu imitieren, aber das klingt ziemlich horrend.

Also ich frage mich, ob jemand über etwas ähnliches gekommen ist, bevor und wie sie sich näherten sie?

Aktualisieren Wie von Aaron schlug hier ist die Abfrage, die wir zur Zeit (in mysql) verwenden. Es ist auf jeden Fall langsam auf dem Tisch mit> 200 k Zeilen. (Id = Tabellenschlüssel, person_id = id pro Person dupliziert, wenn die Person viele Revisionen hat)

  

select name from Person p wo p.id = (select max (id) von Person, wo person_id = p.person_id und Zeitstempel <=: Zeitstempel)

Aktualisieren Es sieht aus wie der beste Weg, dies zu tun, mit einer zeitlichen db ist aber da es keine Open-Source-diejenigen da draußen die nächste beste Methode ist, um eine neue Zeile pro Update zu speichern. Das einzige Problem ist, Duplikation von unverändert Spalten und eine langsame Abfrage.

War es hilfreich?

Lösung

Es gibt zwei Möglichkeiten, dies zu bewältigen. Beide gehen davon aus, dass Sie immer neue Zeilen einfügen. In jedem Fall müssen Sie einen Zeitstempel (created) einfügen, die Sie sagt, wenn eine Zeile wurde „modifiziert“.

Der erste Ansatz nutzt eine Reihe zu zählen, wie viele Instanzen, die Sie bereits haben. Der Primärschlüssel ist der Objektschlüssel und die Versionsnummer. Das Problem bei diesem Ansatz scheint zu sein, dass Sie ein select max(version) benötigen, um eine Änderung zu machen. In der Praxis ist dies selten ein Problem, da für alle Updates von der App, müssen Sie zunächst die aktuelle Version der Person laden, modifizieren (und erhöhen die Version) und dann die neue Zeile einzufügen. So ist das eigentliche Problem ist, dass dieses Design macht es schwer Updates in der Datenbank ausgeführt werden (zum Beispiel zuweisen eine Eigenschaft für mehrere Benutzer).

Der nächste Ansatz verwendet Links in der Datenbank. Anstelle eines zusammengesetzten Schlüssel, geben Sie jeweils einen neuen Schlüssel-Objekt und Sie haben ein replacedBy Feld, das den Schlüssel der nächsten Version enthält. Dieser Ansatz macht es einfach, die aktuelle Version (... where replacedBy is NULL) zu finden. Updates sind ein Problem, obwohl, da Sie eine neue Zeile einfügen müssen und aktualisieren Sie einen vorhandenen.

Um dies zu lösen, können Sie einen Rückzeiger hinzufügen (previousVersion). Auf diese Weise können Sie die neuen Zeilen einfügen und dann den Rückzeiger verwenden, um die vorherige Version zu aktualisieren.

Andere Tipps

Hier ist ein (etwas veraltet) Überblick über die Literatur auf zeitliche Datenbanken: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.6988&rep=rep1&type=pdf

würde ich empfehlen, ein gutes zu verbringen, während sie mit diesen Referenzen Hinsetzen und / oder Google Scholar , um zu versuchen zu finden einige gute Techniken, die Ihr Datenmodell passen. Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top