2016-07-28 4 views
0

Ich verwalte Data-Tier-Anwendungen für ein kleines Unternehmen und meine SW wird kritisiert für die Tatsache, dass Informationen für die Teilkalkulation nicht historisch abgerufen werden können. So möchten sie zum Beispiel jederzeit die Kosten eines Teils wie vor 6 Monaten abrufen können.Persistente Daten aus SQL-Tabellen Tag für Tag

Sie taten dies über Tabellenkalkulationen. Sie würden die Teile-Tabelle jeden Tag in eine .xlsx-Datei kopieren und dann, wann immer sie wissen wollten "Hey, was waren die Kosten dieses Teils am 20. Januar des letzten Jahres?", Konnten sie es einfach in Excel hochziehen.

Also haben wir damit begonnen, dasselbe in SQL zu tun, und der bisherige Plan ist, dass wir jedes Mal, wenn die Teilekosten aktualisiert werden, eine neue Tabelle erstellen, die Tabelle mit dem heutigen Datum benennen und in einem fortführen Datenbank für archivierte Informationen. Dann planen wir, den Tisch, den wir brauchen, nach seinem Zeitstempel zu ziehen.

Ich kann nicht helfen, aber denke, das wird sehr unordentlich werden. Ist das ein schlechter Ansatz für die Archivierung von Daten? Gibt es irgendwelche Industriestandards, die ich einhalten kann, um dieses Problem mit möglichst wenigen Kopfschmerzen zu lösen?

+1

Werfen Sie einen Blick hier: http://stackoverflow.com/questions/3874199/how-to-store-historical-data – cha

+2

Sie haben Recht, das ist ein schlechter Ansatz. Dynamisch benannte Tabellen machen das Schreiben von Abfragen schwierig. Stattdessen können Sie den relevanten Tabellen einfach eine Datestamp-Spalte hinzufügen. Sie * könnten * separate Tabellen für aktuelle und vorherige Werte haben (aber immer noch nur die eine Tabelle für alle vorherigen Werte). – Blorgbeard

Antwort

1

So haben wir das gleiche tun in SQL begonnen, und der Plan so weit ist , dass wir eine neue Tabelle jedes Mal die Teilkosten aktualisiert werden schaffen, Name der Tabelle mit dem heutigen Datum und behalte es in einer Datenbank für archivierte Informationen. Dann planen wir, die Tabelle , die wir benötigen, nach ihrem Zeitstempel zu ziehen.

Ich kann nicht helfen, aber denke, das wird sehr unordentlich werden. Ist das ein schlechter Ansatz für die Archivierung von Daten? Gibt es irgendwelche Industriestandards, die ich einhalten kann, um dieses Problem in so wenig Kopfschmerzen wie möglich zu lösen?

Sie haben Recht ... diese Lösung wird chaotisch sein.

Einfachste Sache, die Sie tun können, ist eine Geschichte Tabelle sagen Parts_History, die alle Spalten als Hauptteile Tabelle haben und zusätzliche Zeitstempel Spalte (n) hinzufügen, um Updates zu verfolgen. Jedes Mal, wenn es einen neuen Preis für ein Teil gibt (was hoffentlich durch eine gespeicherte Prozedur geschieht), wird der existierende Preis in die neue Tabelle verschoben und die Haupttabelle wird aktualisiert. ALLE Innerhalb einer Transaktion. Wenn Sie keinen einzigen SP haben, der das Update behandelt, können Sie dies innerhalb eines Triggers tun.

Ich werde versuchen zu sehen, ob es irgendwelche guten Beispiele gibt.

+0

Anstatt die Tabelle jedes Mal zu kopieren, wenn eine Aktualisierung vorgenommen wird, kopieren Sie einfach die alte Version des Teils in 'Part_History' und überschreiben den aktiven Datensatz mit neuen Werten.Die historischen Daten können dann durch einen Zeitstempel abgefragt werden, der beim Erstellen auf den Datensatz angewendet wird. Ich kann nicht glauben, dass ich nicht daran gedacht habe. Vielen Dank. – Jace

+1

@Jace Sie sind willkommen. Werfen Sie einen Blick auf die Reichen mans :) Option für Tracking/Auditing in SQL 2016 verfügbar: https://msdn.microsoft.com/en-us/library/dn935015.aspx – objectNotFound

+0

Ich kann nur träumen .... – Jace

1

Soweit ich jetzt gibt es keinen Standard, aber Ansatz ist ziemlich offensichtlich. Sie haben eine Tabelle sagen part(partid int primary key, price decimal). Erstellen Sie eine Audit-Tabelle part_audit(auditId int identity(1,1) primary key, partId int, price decimal, dateChange datetime default getdate()) und einen Trigger auf part after update, delete. In der Trigger-Überprüfung update(price) und wenn ja, in part_audit von deleted einfügen. Um den historischen Preis zu finden, wählen Sie nach dem Datum des Interesses am nächsten dateChange.

Verwandte Themen