Datenbank tabellenweise archivieren

Hallo zusammen,

ich habe eine eigene kleine Datenbank für eine Spezialanwendung auf einem SQL-Server 2008. Diese Datenbank greift mit Sichten bzw. gespeicherten Prozeduren auf eine globale Quell-Datenbank (gleicher Server) zu. Nun habe ich das Problem, dass sich in der Quell-Datenbank monatlich bestimmte Stammdaten (Zuordnungen) ändern können. In den entsprechenden Tabellen werden nicht mehr gültige Datensätze mit einem Flag (0 oder 1) versehen und ein neuer Datensatz angelegt. Ich kann also ermitteln, was jetzt gerade gilt, aber ich kann nicht rekonstruieren, wie die Tabelle z.B. Ende September aussah. (Ich benötige die Daten immer nur monatlich, bzw. die jetzt gerade aktuellen Daten.)

Nun kommt es recht oft vor, dass ich meine kleine Datenbank anpassen muss, weil sich beispielsweise bestimmte, durch das Management vorgegebene, Kriterien ändern. Leider gelten die Änderungen oft auch noch für ein paar Monate rückwirkend. Naja, wie soll ich es ausdrücken? Meine Datenbank ist aufgrund der vielen Änderungswünsche mittlerweile so kompliziert, dass ich selbst kaum noch durchblicke. Auch wenn sich nur ein winziger Teil geändert hat, lasse ich lieber alle Prozeduren durchlaufen und verzichte darauf einzelne Werte gezielt zu updaten, weil es mir einfach zu heikel ist. Für den aktuellen Monat ist das natürlich kein Problem. Will ich aber für die Vergangenheit das Gleiche tun, muß ich, aufgrund der oben beschriebenen Problematik, die Quell-Datenbanken aus den Vormonaten aus den Backups einspielen lassen, was natürlich nicht sofort möglich ist bzw. entsprechenden Aufwand verursacht.

Mein Lösungsansatz:
Um das Problem in den Griff zu bekommen, könnte ich die Tabellen mit den Stammdaten, auf Monatsebene gruppiert, archivieren. Ich würde in den neu zu erstellenden Archivtabellen ganz einfach jeden Tag die Daten des aktuellen Monats löschen und die jetzt aktuellen Datensätze einfügen. Gebenüber den Original-Tabellen gäbe es noch eine weitere Spalte, in der ich einen Indexwert für den Monat schreibe.
Ergebnis: Ich habe die Stammdaten der letzten Monate und die aktuellen Daten und kann ganz einfach per Filterkriterium einen bestimmten Monat simulieren.

Hört sich eigentlich ganz ok an, aber was ist, wenn man dieses „Konzept“ nicht nur auf zehn „Tabellchen“ anwenden möchte, sondern auf alle Tabellen der Quelldatenbank? Meine Befürchtung: Nicht nur die Stammdaten können sich gegenüber den Vormonaten, geändert haben, sondern auch die Nutzdaten.

Deshalb meine Frage: Wie könnte man die Daten intelligenter speichern? Wenn ich Beispielsweise einen Stammdatensatz habe, der sich in den ersten 5 Monaten nicht verändert hat, dann geändert wurde und seit 3 Monaten immer noch gültig ist, dann würde ich gerne anstatt 8 Datensätze (für jeden Monat einen) nur 2 Datensätze speichern. Allerdings möchte ich dann eine einfach Sicht programmieren, die mir für jeden Monat den Datensatz mit den ensprechenden Daten zurückliefert.

Wie geht man das am besten an? Habt Ihr mal ein paar Tips für mich?

Vielen Dank im Voraus.

MfG
Stephan

Hallo Stephan,

das Thema Archivierung hilft Dir nicht besonders weiter, da Du dann die Abfragen immer neu schreiben musst (wenn Du innerhalb der Daten archivierst) oder die Datenbank für jeden zu modifizierenden Moant recovern musst. Ohne Notiztabelle welchen gültigen Monat Du gerade verwendest gibt das nur Chaos.

Also hilft nur eine Datenmodelländerung. Füge statt der Spalte gueltig (1/0) zwei Spalten mit der Bedeutung gueltig_ab und gueltig_bis (Datumsformat oder YYYYMM) dazu. Gueltig_bis wird nur gefüllt, wenn der Datensatz nicht mehr gültig ist. Das kannst Du auch nutzen, um erstmal eine View auf Deine Tabelle zu legen, der Dir gerade gelöschte Spalte simuliert (wenn gueltig_bis is not null dann 0 sonst 1). Dann ergänzt Du mit der Zeit alle Deine Abfragen mit dem Zeitstempel für den aktuell abzufragenden Monat / Zeitpunkt.

MfG Georg V.