Ich entwerfe eine Datenbank zur Speicherung von Produktinformationen und möchte mehrere Monate historischer (Preis-)Daten für zukünftige Referenzen speichern. Ich möchte jedoch nach einem bestimmten Zeitraum damit beginnen, die ursprünglichen Einträge mit minimalem Aufwand zu überschreiben, um die ursprünglichen Einträge zu finden. Hat jemand eine gute Idee, wie man dieses Problem angehen kann? Mein ursprünglicher Entwurf sieht eine Tabelle mit dem Namen "Historische Daten" vor, aus der ich jeden Tag die aktiven Daten ziehe und sie mit einem Zeitstempel in der historischen Datenbank speichere. Hat jemand eine bessere Idee? Oder kann sehen, was an meinem Entwurf falsch ist?
Antworten
Zu viele Anzeigen?Zunächst möchte ich mich zu Ihrem Lösungsvorschlag äußern. Die Schwachstelle ist natürlich, dass es tatsächlich mehr als eine Änderung zwischen Ihren Intervallen geben kann. Das heißt, der Datensatz wurde im Laufe des Tages dreimal geändert, aber Sie archivieren nur die letzte Änderung.
Es ist möglich, die bessere Lösung zu haben, aber sie muss ereignisgesteuert sein. Wenn Ihr Datenbankserver Ereignisse oder Trigger unterstützt (wie MS SQL), sollten Sie einen Triggercode schreiben, der einen Eintrag in der Historientabelle erstellt. Wenn Ihr Server keine Trigger unterstützt, können Sie den Archivierungscode zu Ihrer Anwendung hinzufügen (während des Speichervorgangs).
Das Thema ist viel umfassender, als es zunächst scheint. Martin Fowler hat einen schönen Erzählung über "Dinge, die sich mit der Zeit verändern".
IMO scheint Ihr Ansatz vernünftig zu sein, wenn Ihre benötigten Verlaufsdaten eine Momentaufnahme der Daten am Ende des Tages sind - in der Vergangenheit habe ich einen ähnlichen Ansatz mit Nachtaufträgen (SPs) verwendet, die die neuen Daten des Tages aufnehmen, sie mit einem Zeitstempel versehen und dann ein "Löschen aller Daten mit einem Zeitstempel < heute - x" verwenden, wobei x die Zeitspanne der Daten ist, die ich behalten möchte.
Wenn Sie alle Verlaufsänderungen verfolgen müssen, sollten Sie sich mit Triggern befassen.
Ich möchte, dass nach einer bestimmten Zeit die ursprünglichen Einträge überschrieben werden, ohne dass ich die ursprünglichen Einträge finden muss.
Wir speichern Daten in Archivtabellen unter Verwendung eines Triggers, wie andere vorgeschlagen haben. Unsere Archivtabelle hat eine zusätzliche Spalte für AuditDate und speichert die "gelöschten" Daten - d.h. die vorherige Version der Daten. Die aktuellen Daten werden nur in der eigentlichen Tabelle gespeichert.
Wir bereinigen die Archivtabelle mit einer Geschäftsregel nach dem Muster "Löschen Sie alle Archivdaten, die älter als 3 Monate sind, wenn mindestens ein Archivdatensatz vorhanden ist, der jünger als 3 Monate ist; löschen Sie alle Archivdaten, die älter als 6 Monate sind".
Wenn also in den letzten 3 Monaten keine Preisänderung stattgefunden hat, gibt es immer noch einen Preisänderungsdatensatz für den Zeitraum vor 3-6 Monaten.
(Fragen Sie, wenn Sie ein Beispiel für die selbstreferenzierende Verknüpfung zum Löschen oder den Trigger zum Speichern von Änderungen in der Archivtabelle benötigen)
0 Stimmen
Ich stimme mit htaler überein, ich verwende normalerweise auch den Update-Trigger für die Live-Tabelle. Bei der Aktualisierung fügen Sie einen neuen Datensatz in die historische Tabelle ein. Dann können Sie einen Sql-Job planen lassen, um zu alte historische Daten zu bereinigen.