Historie in Datentabelle
Jo
- datenbank
Hallo,
ich bin zur Zeit an einem Design eines Datenbankmodells (PostgreSQL) in welchem gefordert wird, das jeder geänderte Datensatz zum Zeitpunk X wieder hergestellt werden soll. Jetzt frage ich mich ob es nicht schon gute Konzepte für die Lösung solch eines Problems gibt. Denn kompletten Datensatz immer wieder neu abzuspeichern und mit einem Timestamp zu versehen schafft auf Dauer ja einen riesigen Overhead.
Hat jemand einen Tipp?
Danke
Jo
Hallo Jo,
ich bin zur Zeit an einem Design eines Datenbankmodells (PostgreSQL) in welchem gefordert wird, das jeder geänderte Datensatz zum Zeitpunk X wieder hergestellt werden soll. Jetzt frage ich mich ob es nicht schon gute Konzepte für die Lösung solch eines Problems gibt. Denn kompletten Datensatz immer wieder neu abzuspeichern und mit einem Timestamp zu versehen schafft auf Dauer ja einen riesigen Overhead.
Hat jemand einen Tipp?
Datenbank-Dump in gewissen Zeitabständen und auf der Festplatte sichern. Wenn du es genauer haben willst, dann eine Kombi aus dem was du sagst und meinem Vorschlag.
ciao
romy
Hat jemand einen Tipp?
Wie wäre es nur mit einer Differenz? (stichwort diff).
Wie wäre es nur mit einer Differenz? (stichwort diff).
Der Ansatz klingt vielversprechend, wie kann ich mir sowas vorstellen, schreibe ich dazu entsprechende Funktionen die bei einer Änderung die Differenz in einer Lookuptabelle abspeichern?
Der Ansatz klingt vielversprechend, wie kann ich mir sowas vorstellen, schreibe ich dazu entsprechende Funktionen die bei einer Änderung die Differenz in einer Lookuptabelle abspeichern?
Anstatt einem vollständigen Datensatz speicherst du einen zweiten Datensatz mit differenzen
ID | timestamp | titel | fliesstext
---+-----------+-------+-----------
1 | 123 | foo | lorem ispsum dolor
2 | 345 | NULL | -lorem +foobar
3 | 789 | NULL | NULL
4 | 012 | bar | NULL
In kleinen Feldern wo das diff-Format mehr bräuchte als der Klartext verwendest du den Klartext, gibt es keine Änderung zum vorherigen Stand fügst du eine leere Differenz ein oder z.B. NULL.
Natürlich kannst du das auch in einer separaten Tabelle machen.
Bei MediaWiki kannst du dir das z.B. ansehen - da gibts eine separate Tabelle für die Versionierung die sich *_revision nennt.
Hi,
Anstatt einem vollständigen Datensatz speicherst du einen zweiten Datensatz mit differenzen
Und dann - bei jedem Auslesen wieder den vollständigen Datensatz aus mehreren Revisionen zusammenbasteln ...?
MfG ChrisB
Und dann - bei jedem Auslesen wieder den vollständigen Datensatz aus mehreren Revisionen zusammenbasteln ...?
Der umgekehrte Weg ist dir nicht in den Sinn gekommen?
Hi,
Und dann - bei jedem Auslesen wieder den vollständigen Datensatz aus mehreren Revisionen zusammenbasteln ...?
Der umgekehrte Weg ist dir nicht in den Sinn gekommen?
Nein - was willst du umkehren?
MfG ChrisB
Moin Moin!
ich bin zur Zeit an einem Design eines Datenbankmodells (PostgreSQL) in welchem gefordert wird, das jeder geänderte Datensatz zum Zeitpunk X wieder hergestellt werden soll. Jetzt frage ich mich ob es nicht schon gute Konzepte für die Lösung solch eines Problems gibt. Denn kompletten Datensatz immer wieder neu abzuspeichern und mit einem Timestamp zu versehen schafft auf Dauer ja einen riesigen Overhead.
Wenn Du jederzeit auf alte Zustände zurückgreifen können willst, wird Dir außer Timestamps nichts anderes übrig bleiben.
Ein Rollback der gesamten Datenbank durch Einspielen eines alten Backups dauert verglichen damit ewig, Du verlierst alle aktuellen Daten seit dem letzten Backup, und so manche Anwendung könnte etwas irritiert sein, wenn Du ihr im laufenden Betrieb die Datenbank unter dem Hintern wegschießt.
Mit großen Datenmengen kann PostgreSQL ohne weiteres umgehen, das sollte Deine geringste Sorge sein. Sieh zu, dass Dein Schema mindestens die dritte Normalform hat, dann hast Du auch keinen Ärger mehr mit redundanten Daten.
Alexander