Frage

Ich habe ein Projekt ein Web-Voting-System beteiligt ist. Die aktuellen Werte und die zugehörigen Daten in mehreren Tabellen gespeichert. Historische Daten wird ein wichtiger Aspekt dieses Projekts sein, damit ich auch Audit erstellt haben Tabellen zu denen aktuelle Daten in regelmäßigen Abständen bewegt werden.

Ich finde diese Strategie sehr ineffizient. Auch wenn ich nur Archivdaten auf einer täglichen Basis, die Anzahl der Zeilen wird riesig werden, selbst wenn nur 1 oder 2 Benutzer Updates an einem bestimmten Tag zu machen.

Die nächste Alternative, die ich denken kann, ist nur Einträge speichern, die sich geändert haben. Dies wird mit meiner Logik zu bauen, um automatisch eine Ansicht von einem bestimmten Tag zu erstellen. Dies bedeutet weniger gespeicherten Zeilen, aber einen erheblichen Aufwand.

Meine letzte Idee ist ein bisschen weniger konventionell. Da die historischen Daten für Zwecke der Berichterstattung sein wird, gibt es keine Notwendigkeit für Web-Benutzer einen schnellen Zugriff haben. Ich denke, dass mein db keine historischen Daten darin haben könnte. DB stellt nur aktuellen Zustand. Dann, täglich, könnte die gesamte db in Objekte geladen wird (Anzahl der Benutzer / Daten relativ niedrig ist) und dann serialisiert so etwas wie XML oder JSON. Diese Dateien können mit dem Vortag werden diffed und gespeichert. In der Tat, dies zu tun SVN für mich könnte. Wenn ich die Daten für einen bestimmten letzten Tag will, hat das System die Version für diesen Tag abrufen und in Objekte deserialisieren. Das ist natürlich ein kostspieliger Vorgang aber die Leistung ist nicht so sehr ein Problem hier. Ich erwäge LINQ mit diesem für die ich denke, würde die Dinge vereinfachen. Die Serialisierung Verfahren müßten ziemlich organisiert sein, dass der diff gut funktionieren.

Welche Vorgehensweise würden Sie nehmen?

Danke

War es hilfreich?

Lösung

Alles, was Sie uns über Ihr System gesagt haben ist, dass es sich um Stimmen. Solange Sie speichern die Zeitstempel für wenn Stimmen abgegeben wurden Sie in der Lage sein sollten, einen Bericht zur Abstimmung Zustand tally an jedem beliebigen Punkt in der Zeit zu erzeugen ... nein?

Zum Beispiel, sagen, dass ich ein System, das Lieblings-Features deckt (Augen, Lächeln, Po, ...). Wenn ich wissen will, wie viele Stimmen es für ein bestimmtes Merkmal ab einem bestimmten Zeitpunkt wäre, dann würde ich einfach alle Tally die Stimmen für die Funktion mit einem Zeitstempel kleiner oder gleich diesem Datum.

Wenn Sie eine Geschichte von anderen Dingen haben wollen, dann würden Sie einen ähnlichen Ansatz verfolgen.

Ich denke, das ist so, wie es gemacht wird.

Andere Tipps

Wenn Sie im Grunde mich fragen, wie Revisionen von Daten in relationalen Datenbanken gespeichert sind, dann würde ich prüfen, wie Wikis es tun.

Wikis sind alle über detaillierte Revisionsgeschichte zu halten. Sie verwenden einfach relationale Datenbanken für die Speicherung.

Betrachten Wikipedias Datenbank Schema .

Haben Sie ein echtes Versionskontrollsystem betrachtet Verwendung anstatt zu versuchen, eine Datenbank in seinem Platz Schuhanzieher? Ich selbst bin ziemlich teilweise git, aber es gibt viele Möglichkeiten. Sie alle haben eine gute Unterstützung für Unterschiede zwischen den Versionen, und sie sind in der Regel gut für diese Art der Arbeitsbelastung optimiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top