(Das Thema sollte natürlich "Versionsverwaltung ..." sein)
Hallo Zusammen!
Ich habe eine Frage bzgl. der Verwaltung von Datensätzen in unterschiedlichen Versionen. Ich benötige eine Tabelle in der es möglich sein soll Datensätze zu ändern, in welcher der ursp. Datensatz allerdings erhalten bleiben soll. Jeder Datensatz hat eine Nummer über die er von einem Benutzer angesprochen werden kann, und diese Nummer soll der Primärschlüssel sein. Das Problem ist jetzt, dass der neue Datensatz die selbe Nummer haben muss wie der alte Datensatz und damit nicht angelegt werden kann. Ein kombinierter Schlüssel geht auch nicht, denn dann kann ich „references“ nicht mehr verwenden.
Mal ein Beispiel:
Tabelle Personalstamm:
Personalnummer (Primärschlüssel), Vorname, Nachname, Steuerklasse, Timestamp
100 Claudia Fraglich 1 2008-12-12 .....
100 Claudia Musterman 3 2010-04-20 .....
Ich benötige beide Versionen des Datensatzes in der Tabelle (oder wenigstens in der Datenbank), zum einen um Änderungen zu dokumentieren und zum anderen und bei Bedarf auf den alten Datensatz zugreifen zu können wenn in einer Abfrage die Daten vor dem 20.04.2010 benötigt werden (z.B. für Nachdrucke o.ä.).
Außerdem würde bspw. in anderen Tabellen (z.B. Lohn) auf die Tabelle PErsonalstamm referenziert, so dass der Lohn nur für vorhandenen Personalnummern abgerechnet werden kann.
Tabelle Lohn:
Personalnummer (references Personalstamm), Stunden, Stundenlohn
100 180 14,00
Meine Frage ist nun: Wie kann ich das Problem mit dem Primärschlüssel umgehen? Einen kombinierten Schlüssel möchte ich nicht verwenden, denn dann kann ich „references Personalstamm“ nicht mehr verwenden. Gibt es in PostgreSQL evtl. eine eingebaute „Versionsverwaltung von Datensätzen“?
Wenn es das nicht gibt, habt Ihr eine Idee wie man so etwas lösen kann? Ich denke es wäre möglich in dem in der Tabelle Personalstamm nur die jeweils aktuelle Version der Datensatzes stehen würde und die „historischen“ Daten immer in eine zweite Tabelle kopiert werden würden auf die bei Bedarf zugegriffen werden kann.
Oder aber alle Versionen stehen weiterhin in nur einer Tabelle und ich setzte noch eine andere Tabelle davor die nur auf die jeweils aktuelle Version des Datensatzes zeigt. Etwa so:
Tabelle Personalstammgesamt:
Intern (Primärschlüssel), Personaln., Vorname, Nachname, Steuerklasse, Timestamp
10000 100 Claudia Fraglich 1 2008-12-12 .....
10001 100 Claudia Musterman 3 2010-04-20 .....
Tabelle Personalstammaktuell:
Personaln. (Primärschlüssel), Intern (references Personalstammgesamt)
100 10001
Hat jemand dazu eine Idee?
Wirf doch mal einen Blick hier drauf:
10:50:27 < ads> ??tablelog
10:50:27 < pg_docbot_adz> For information about 'tablelog' see:
10:50:28 < pg_docbot_adz> Log Table Changes in PostgreSQL with tablelog - ads' corner
10:50:28 < pg_docbot_adz> PgFoundry: Table Audit: Project Info
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Danke!
Schau ich mich mal an!
Ich habe gute Erfahrungen damit gemacht, solche IDs nicht als Schlüssel zu verwenden, eben weil sich da durch menschliche Eingriffe eigentlich immer Komplikationen ergeben. Meist nutze ich eine Sequence als "Schlüsselgenerator" die vom Nutzer nicht verändert werden kann. Zur Versionsverwaltung kann man dann ein Ungültig-Flag oder ein Datumsfeld benutzen. Das kann man dann auch in einer Tabelle verwalten solange die veralteten nicht sehr viel mehr als die gültigen Daten sind.
Gruß Uwe
Have a lot of fun!
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen