2009-08-13 12 views
4

Ich habe eine Datenbank mit Büchern.Version Tracking mit mysql

Ein Buch hat einen Autor, Publisher. Einige Preise, IDs und Beschreibungen.

Ich möchte Änderungen an einem Produkt verfolgen. Eine Möglichkeit besteht darin, das Produkt mit der Uhrzeit UND der ID als Primärschlüssel zu speichern.

Gibt es andere Möglichkeiten?

Gibt es Datenbanksysteme (ich habe nur mysql verwendet), die automatisch Änderungen verfolgen können?

Grüße ...

Antwort

1

Sie einen Trigger verwenden können (wenn mysql sie hat, ich glaube, es tut), um die ‚update‘ Ereignis zu fangen und eine Reihe von relevanten Informationen in einem ‚log‘ Tabelle eintragen.

Datenbanken haben Transaktionsprotokolle, aber wahrscheinlich ist es für Sie nicht nützlich, da ich glaube, dass es nicht einfach abgefragt werden kann.

1

Eine einfache Lösung besteht darin, ein Änderungsdatum als Feld in Ihre Produkttabelle aufzunehmen.

Aktualisieren Sie Ihre gespeicherten Prozeduren, um immer das Produkt mit der Produkt-ID mit dem spätesten Wirksamkeitsdatum zu ziehen.

Dies würde Ihnen eine separate gespeicherte Prozedur ermöglichen, die alle Versionen eines Produkts auflistet.

+0

Eine Variante davon wären zwei Spalten: 'active-from' und' active-to', mit denen Sie zukünftige Produkte/Angebote/etc. –

4

Ein Ansatz besteht darin, zwei getrennte Tabellen zu haben, z. books und book_versions mit dem gleichen Satz von Feldern (Autor, Herausgeber, Beschreibung usw.).

Wenn Ihre Anwendung ein Einfügen oder Aktualisieren in books durchführt, fügen Sie einen entsprechenden Datensatz in book_versions ein. Dies bedeutet, dass die Tabelle books die neueste Version des Datensatzes enthält und book_versions die neuesten und alle historischen Versionen enthält. Wenn Sie die meiste Zeit nur an der neuesten Version interessiert sind, können Sie einfach aus Büchern nach ID auswählen und den Verlauf nur abrufen, wenn Sie ihn benötigen. Dies ist der Ansatz, den das Plugin acts_as_versioned für Ruby on Rails verwendet.

1

Ich schlage vor, eine Changelog-Tabelle in Ihr System hinzuzufügen. Diese Tabelle wird immer nur geschrieben und hat die Spalten date, subject, predicate, object, wobei subject der Autor/Prinzipal ist, der die Änderung vornimmt, pradikat ist die Art der Änderung (create, update, delete) und object ist Die Sache ist Veränderung. Potenziell können Sie das Objekt noch in ID, Attribut, Wert aufteilen, wobei ID die Buch-ID, Attribut der Zeichenfolgenname des geänderten Attributs und der Wert ist (der neue Wert befindet sich in der entsprechenden Tabelle)).

1

Jede der oben vorgeschlagenen Lösungen funktioniert; Es hängt wirklich von Ihrer Arbeitslast und der Größe des Datensatzes ab.

Wenn Sie viele Datensätze haben und nur ein historisches Archiv als Referenz verwenden möchten, können Sie auch "alte/frühere" Versionen aus der Datenbank entfernen und stattdessen auf einer Festplatte in einer Art verketteten Liste speichern (z.Fügen Sie eine Version ein, die die Adresse der vorherigen Version enthält und somit eine verkettete Liste bildet, und behalten Sie einen Zeiger auf die neueste Version in der DB.

Es gibt Plus und Minus mit diesem Ansatz, aber ein Plus ist, dass Sie Ihre DB klein halten und nur ältere Versionen von der Festplatte ablesen können. Ihre älteren Versionen sollten unveränderbar sein, so dass Sie nicht auf Transaktionen/Nebenläufigkeitsunterstützung von der DB angewiesen sind. Wenn Ihr "aktueller/aktueller" Datensatz z. B. 100G ist und Ihre früheren Versionen 900G, dann können Sie eine Datenbank auf RAID auf dem 100G platzieren und die früheren Versionen auf günstigeren Speicher legen, und ein paar davon kopieren Zeiten (sie sind atomar, also keine Nebenläufigkeitsprobleme beim Replizieren).