2008-11-06 7 views
5

Ich möchte mit versionierten ActiveRecord-Assoziationen arbeiten. Zum Beispiel, ich möchte das Objekt finden, dass ein anderes Objekt zu einem bestimmten vergangenen Datum gehört, oder zu dem, dem es vorher gehörte. Gibt es bereits eine Bibliothek, die ActiveRecord von Rails untergliedert, um relationierte Beziehungen bereitzustellen? Oder eine andere Ruby-Bibliothek, die persistente relationale Beziehungen bietet?Wie erreichen versionierte ActiveRecord-Verknüpfungen?

Antwort

1

Die Unterstützung des historischen Zustands in einer transaktionalen Anwendung ist eine gute Möglichkeit, die Komplexität massiv zu erweitern, die DB-Leistung zu verlangsamen und das Leben für Sie selbst zu erschweren. Wenn Sie den historischen Status nur anzeigen oder berichten müssen und ihn nicht bis zur Minute benötigen, sollten Sie ein Sternschema mit Type-II slowly changing dimensions und einen periodischen Prozess erstellen, der es aktualisiert.

Dies ist wesentlich weniger komplex als der Aufbau einer Anwendung mit systematischer Ad-hoc-Verlaufsverfolgung über die Codebasis. Wenn dieser Ansatz das tut, was Sie von der Anwendung benötigen, werden Sie wahrscheinlich besser dran sein. Es bedeutet auch, dass die Anwendungsdatenbank gut mit den Vanilla-Datenbankzugriffsmechanismen, die mit dem System geliefert werden, spielt.

Wenn Sie eine relativ häufige Aktualisierung benötigen, können Sie ein geändertes Datenerfassungssystem in der Datenbank implementieren, was relativ einfach ist, wenn die Anwendung nur den aktuellen Status betreffen muss. Bei einem CDC-Mechanismus muss der Ladeprozess nur aufgrund von Änderungen aktualisiert werden und läuft relativ schnell.

2

Vorausgesetzt, Sie sind nicht mit großen Datenmengen, und die zusätzliche zeitliche Dimension über die Kante nicht schieben Sie Ihre db tun haben, gibt es keine großen Nachteile zu historisch versioniert Daten. Die zusätzliche Abfragekomplexität kann ein kleiner Schmerz sein, aber es ist nichts Wichtiges.

In meinem Fall habe ich ein Schienen-Plugin geschrieben, die Versionierung Griffe, fügt es 5 Spalten zu jeder versioniert Tabelle (und hilft behandeln Abfragen/Manipulation etc.):

valid_from - Datumzeit - die Datetime, die diese Version war bei

valid_to erstellt - Datumzeit - die Datetime, die diese Version gültig

root_id ist gestoppt - integer - die ID des ursprünglichen Zeile (dass dies eine spätere Version)

created_by - integer - Die Benutzer-ID des Benutzers, die die Erstellung dieser Version durchgeführt

retired_by - integer - die Benutzer-ID des Benutzers, Diese Version wurde zurückgezogen

Für derzeit aktive Zeilen ist valid_to null. Das Hinzufügen eines Indexes zu valide_to hilft dabei, die Leistung bissig zu halten.

+0

Nicht mit 'gering' übereinstimmen. Bei einem Versicherungstechnischen System bin ich mit den Schätzungen einigermaßen vertraut, dass das in einer bestimmten Version hinzugefügte Historien-Tracking ungefähr 70% des Entwicklungsaufwands ausmacht. – ConcernedOfTunbridgeWells

+0

Interessant, meine persönliche Erfahrung schwankt etwas anders, aber ich habe das System so konzipiert, dass es von Grund auf versioniert wird. Ich würde mir lieber nicht vorstellen, wie viel Schmerz nötig wäre, um es in einer späteren Version hinzuzufügen. Das System hatte ca. 20 versionierte Tabellen, 10 nicht versioniert. – Michael

+1

Hm, das klingt sehr interessant! Hast du dein Plugin irgendwo veröffentlicht?Könnten Sie es auf GitHub hochladen? Ich würde es gerne sehen, um ein paar Ideen zu bekommen usw. – reto

Verwandte Themen