2010-11-15 10 views
10

Können Sie Ihre Gedanken teilen, wie Sie die Datenversionierung in PostgreSQL implementieren würden? (Ich habe ähnliche Frage bezüglich Cassandra und MongoDB gestellt. Wenn Sie irgendwelche Gedanken haben, welche DB für das besser ist teilen Sie bitte)Möglichkeiten zur Implementierung der Datenversionierung in PostreSQL

Angenommen, dass ich Datensätze in einem einfachen Adressbuch versionieren muss. Adressbucheinträge werden zur Vereinfachung in einer Tabelle ohne Beziehungen gespeichert. Ich gehe davon aus, dass die Geschichte:

  • wird selten verwendet werden
  • wird auf einmal verwendet werden, es in einer „Zeitmaschine“ Art und Weise zu präsentieren
  • wird es nicht mehr Versionen als einigen hundert bis ein einzelner Datensatz.
  • Geschichte wird nicht ablaufen.

Ich betrachte die folgenden Ansätze:

  • Erstellen Sie eine neue Objekttabelle Geschichte von Datensätzen mit einer Kopie des Schemas von Adressbuchs Tabelle zu speichern und Zeitstempel und Fremdschlüssel hinzufügen Buchtabelle zu adressieren.

  • Erstellen Sie eine Art Schema-less-Tabelle, um Änderungen an Adressbucheinträgen zu speichern. Eine solche Tabelle würde bestehen aus: AddressBookId, TimeStamp, FieldName, Value. Auf diese Weise würde ich nur Änderungen an den Datensätzen speichern, und ich müsste die Verlaufstabelle und die Adressbuchtabelle nicht synchron halten.

  • Erstellen Sie eine Tabelle zum Speichern von serialisierten (JSON) Adressbucheinträgen oder Änderungen an Adressbucheinträgen. Eine solche Tabelle würde folgendermaßen aussehen: AddressBookId, TimeStamp, Object (varchar). Wieder ist dies ein Schema weniger, so dass ich die Verlaufstabelle mit der Adressbuchtabelle nicht synchron halten müsste. (This is modelled after Simple Document Versioning with CouchDB)

Antwort

1

Ich mache so etwas wie Ihren zweiten Ansatz: Haben Sie die Tabelle mit dem aktuellen Arbeitssatz und einem Verlauf mit Änderungen (timestamp, record_id, property_id, property_value). Dies beinhaltet die Erstellung von Datensätzen. Eine dritte Tabelle beschreibt die Eigenschaften (id, property_name, property_type), die bei der Datenkonvertierung in der Anwendung helfen. So können Sie auch sehr einfach Änderungen einzelner Eigenschaften verfolgen.

Anstelle eines Zeitstempels könnten Sie auch einen int-like haben, den Sie für jede Änderung pro Datensatz-ID inkrementieren, so dass Sie eine tatsächliche Version haben.

2

Sie könnten start_date und end_date haben.

Wenn end_date NULL ist, ist es der tatsächliche Datensatz.

+0

Würde es nicht zusätzlichen Aufwand zu meinem Haupttisch hinzufügen? Ich denke, dass Geschichte selten genutzt wird und ich nicht dafür bezahlen will, wenn sie ungenutzt ist. Ich gehe davon aus, dass ungefähr 100 GB Daten in der Adressbuchtabelle verarbeitet werden. –

+0

Veronning Aufzeichnungen ohne Overhead ist utopisch. Oracle speichert viele Versionen eines Datensatzes mit den Feldern 'start_date' und' end_date'. Ich würde sie zu allen Tabellen hinzufügen, die Sie versionieren möchten. –

+0

Ich bin nicht sicher, warum Sie denken, dass es utopisch ist. Wenn Sie die Tabelle in aktuelle Daten und Verlaufsdaten aufteilen, erhalten Sie fast ohne Kosten die Vorteile der Versionierung, wenn sie nicht verwendet wird. –

2

Ich habe Glossar-Daten versioniert und mein Ansatz war ziemlich erfolgreich für meine Bedürfnisse. Für Datensätze, die Sie versionieren müssen, unterteilen Sie das Feldset grundsätzlich in persistente Felder und versionsabhängige Felder, wodurch zwei Tabellen erstellt werden. Einige der ersten Mengen sollten auch die eindeutigen Schlüssel für die erste Tabelle sein.

Adresse
id [pk]
fullname [uk]
Geburtstag [uk]

Version
id [pk]
address_id [uk]
Zeitstempel [uk]
Adresse

Auf diese Weise erhalten Sie eine Adresssubjekte, die durch Fullname und Geburtstag (sollte nicht durch Versionierung ändern) und eine versionierte Datensätze mit Adressen bestimmt. address_id sollte mit Adresse verknüpft sein: id durch Fremdschlüssel. Mit jedem Eintrag in der Versionstabelle erhalten Sie eine neue Version für das Thema Adresse: id = adresse_id mit einem bestimmten Zeitstempel. Auf diese Weise können Sie eine Verlaufsreferenz erhalten.