2009-04-14 8 views
0

Ich habe ein Projekt mit einem Web-Voting-System. Die aktuellen Werte und zugehörigen Daten sind in mehreren Tabellen gespeichert. Historische Daten werden ein wichtiger Aspekt dieses Projekts sein, daher habe ich auch Audit-Tabellen erstellt, auf die die aktuellen Daten regelmäßig übertragen werden.Versionskontrollierte Datenbank mit effizienter Verwendung von Diff

Ich finde diese Strategie sehr ineffizient. Selbst wenn ich nur täglich Daten archiviere, wird die Anzahl der Zeilen sehr groß, selbst wenn nur 1 oder 2 Benutzer an einem bestimmten Tag Updates vornehmen.

Die nächste Alternative, die ich mir vorstellen kann, ist das Speichern von Einträgen, die sich geändert haben. Dies bedeutet, dass Logik erstellt werden muss, um automatisch eine Ansicht eines bestimmten Tages zu erstellen. Dies bedeutet weniger gespeicherte Zeilen, aber erhebliche Komplexität.

Meine letzte Idee ist ein bisschen weniger konventionell. Da die Protokolldaten für die Berichterstellung verwendet werden, müssen Webbenutzer keinen schnellen Zugriff haben. Ich denke, dass meine Datenbank keine historischen Daten enthalten könnte. DB repräsentiert nur den aktuellen Zustand. Dann könnte täglich die gesamte db in Objekte geladen werden (Anzahl der Benutzer/Daten ist relativ niedrig) und dann zu etwas wie XML oder JSON serialisiert werden. Diese Dateien können mit dem vorherigen Tag verglichen und gespeichert werden. In der Tat könnte SVN das für mich tun. Wenn ich die Daten für einen bestimmten vergangenen Tag haben möchte, muss das System die Version für diesen Tag abrufen und in Objekte deserialisieren. Dies ist offensichtlich eine kostspielige Operation, aber Leistung ist hier nicht so wichtig. Ich überlege, LINQ dafür zu verwenden, was meiner Meinung nach die Dinge vereinfachen würde. Die Serialisierungsprozedur müsste ziemlich gut organisiert sein, damit das Diff gut funktioniert.

Welchen Ansatz würden Sie wählen?

Dank

Antwort

0

Alles, was Sie uns über Ihr System erzählt haben, ist, dass es Stimmen enthält. Solange Sie Zeitstempel für das Abgeben von Stimmen speichern, sollten Sie in der Lage sein, zu jedem Zeitpunkt einen Bericht zu erstellen, der die Stimmrechtsstatistik beschreibt. Nein?

Zum Beispiel sagen, ich habe ein System, das Lieblingsmerkmale (Augen, Lächeln, Po, ...) zählt. Wenn ich wissen möchte, wie viele Stimmen für ein bestimmtes Feature zu einem bestimmten Datum abgegeben wurden, würde ich einfach alle Stimmen für das Feature mit einem Zeitstempel vergleichen, der kleiner oder gleich diesem Datum ist.

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

Ich denke, das ist die Art, wie es gemacht wird.

alt text http://i41.tinypic.com/xer5zn.jpg

+0

Voting ist eine fortlaufende Sache. Stimmen können von Benutzern entfernt oder von Administratoren zurückgegeben werden. Weitere Details zu den Elementen, über die Nutzer abstimmen, ändern sich ebenfalls mit der Zeit. Es gibt 4 Tabellen und insgesamt ca. 20 Datenzeilen zum Archivieren. –

+0

Meine Frage wurde etwas allgemein formuliert, weil ich finde, dass dies ein ziemlich allgemeines Problem ist: Was ist die eleganteste Art, Versionskontrolle und Zeilenoperationen zu mischen? –

0

Haben Sie darüber nachgedacht, ein echtes Versionskontrollsystem verwenden, anstatt zu versuchen, eine Datenbank in seinem Platz Schuhanzieher? Ich selbst bin ziemlich voreingenommen, aber es gibt viele Möglichkeiten. Sie haben alle eine gute Unterstützung für die Unterschiede zwischen den Versionen und sind tendenziell für diese Art von Workload optimiert.

+0

Also Sie vorschlagen, ich Serialisierung/Deserialisierung und Commit-Daten zu git on the fly? –

+0

Ich verstehe nicht wirklich Ihre Problemstellung, aber Git ist mit Leistung als einer der primären Design-Ziele entwickelt - es ist wahrscheinlich schneller als alles andere, was Sie versuchen könnten, wenn es eine gute Übereinstimmung für Ihre Anwendung ist –

1

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

Bei Wikis geht es immer darum, detaillierte Überarbeitungshistorien zu führen. Sie verwenden einfache relationale Datenbanken für die Speicherung.

Betrachten Wikipedia-Datenbank schema.