Möglichkeiten zur Versionierung von benutzergenerierten Dokumenten

8

Ich habe ein Online-Dokument, das im Wesentlichen als XML-Zeichenfolge in der Datenbank gespeichert wird.

Ich denke über eine Möglichkeit nach, die Versionierung des Dokuments für den Benutzer zu implementieren. Damit kann der Benutzer zu früheren Versionen des Dokuments zurückkehren.

Update In meinem Fall handelt es sich um eine Webanwendung mit Hunderttausenden von Benutzern. Ein Benutzer kann eine unbegrenzte Anzahl von Dokumenten speichern. Das XML für Dokument wird im MySQL-Blob-Feld gespeichert, sodass es nicht klein ist. Irgendwann muss ich die Grenzen irgendwie begrenzen, aber das ist alles in allem ein anderes Thema.

Gibt es einen Standardweg, um dies zu erreichen? Soll ich nur die Unterschiede zwischen den Versionen speichern? Was sind andere Dinge, die ich beachten muss?

Entwickler
quelle
1
Die interessante Frage hier ist: Haben Sie einen vorhandenen MYSQL DB-Infrastrukturspeicher, in den die Daten integriert werden müssen (insbesondere ein System, das auf so viele Benutzer skaliert ist)? Der RCS-Vorschlag von Crazy Eddie scheint nicht einfach in ein solches System integriert zu werden.
Doc Brown
Was ist das Sicherheitsmodell - ich gehe davon aus, dass die Dokumente jedes Benutzers privat sind?
Michael
@ Michael Ja, jeder Benutzer Dokumente sind privat
dev.e.loper
@DocBrown Ja, ich habe eine vorhandene MySQL-DB-Tabelle, in der diese XML-Dokumente gerade gespeichert sind.
dev.e.loper
@ dev.e.loper: Ich denke, der Datenschutz wird vom DB-Server nicht erzwungen, oder? Die Anzahl der von Ihnen genannten Benutzer gibt an, dass es sich um eine skalierte Webserverlösung handelt. Die hier gestellte Frage lautet: Möchten / müssen Sie die XML-Daten in der Datenbank behalten, oder können Sie für diesen Teil der Daten eine andere Technologie auswählen?
Doc Brown

Antworten:

13

Warum nicht ein Quellcodeverwaltungs-Repository verwenden? Es benötigt weniger Speicherplatz, erledigt alles, was Sie derzeit möchten, und ermöglicht es Ihnen, das Konzept problemlos auf Zweige, Tags usw. auszudehnen - all das, was Sie von einem RCS erhalten. Warum das Rad neu erfinden?

Edward Strange
quelle
Wie genau meinst du? Wollen Sie damit sagen, dass Sie SVN auf meinem Server installieren und die API zum Speichern dieser Dateien verwenden?
dev.e.loper
Gibt es irgendwo in diesem Ansatz einen Flaschenhals? Zum Beispiel, wenn ich 50.000 Benutzer habe, die ihre Arbeit speichern / versionieren. Das Quellcodeverwaltungs-Repository muss die Versionierung für die 50.000 richtigen verarbeiten?
dev.e.loper
Das OP spricht von einer Datenbank (ich denke, einer vorhandenen). Ich kenne kein Versionsverwaltungssystem, das sich leicht in ein vorhandenes Datenbankschema integrieren lässt.
Doc Brown
@ dev.e.loper - Ein anständiger RCS, einschließlich SVN, sollte in der Lage sein, mit so vielen Benutzern umzugehen.
Edward Strange
5

Da Sie dies in einer Datenbank tun, können Sie Ihre XML-Zeichenfolge am einfachsten versionieren, indem Sie eine neue Verlaufstabelle mit den folgenden Spalten erstellen:

  • Verlaufs-ID
  • Neue XML-Zeichenfolge (optionale Spalte)
  • Alte XML-Zeichenfolge
  • Zeitstempel einfügen

Fügen Sie eine Zeile in diese Verlaufstabelle ein, bevor Sie die Zeile in der XML-Zeichenfolgentabelle aktualisieren.

Gilbert Le Blanc
quelle
Wenn Sie die Zeile in der XML-Zeichenfolgentabelle aktualisieren, können Sie die vorherige Version nicht herausholen. Sie können lediglich einen Verlauf der Änderungsdaten anzeigen. Sie müssten eher Einfügungen als Aktualisierungen vornehmen ... vorzugsweise von Diffs.
Edward Strange
@CrazyEddie: Die vorherige Version (alte Version) befindet sich in der Verlaufstabelle. Diffs sind für ein Dokument nicht erforderlich.
Gilbert Le Blanc
"Diffs sind nicht erforderlich" - Sie wissen nicht, wie groß das Dokument ist, wie oft es geändert wird und ob das OP möglicherweise nicht "ein Dokument pro Benutzer" bedeutet. "Keine Unterschiede nötig" ist also nur eine wilde Vermutung. Trotzdem habe ich dir +1 gegeben, da ich denke, dass deine Antwort in die richtige Richtung weist. Sie können es jedoch verbessern, indem Sie besser erklären, was diese Spalten "neue Version" und "alte Version" enthalten sollen (XML-Zeichenfolgen, Verweise auf frühere Verlaufs-IDs oder etwas anderes?)
Doc Brown,
@Doc Brown: Und Sie wissen nicht, wie oft die alte Version der XML-Zeichenfolge benötigt wird, ganz zu schweigen von der Zeit und dem Aufwand, eine Diff-Engine zu schreiben, die auch undiffieren muss. Sie wissen nicht einmal, ob die Datenbank Textzeichenfolgen komprimiert. Ich habe die Spaltenreferenzen korrigiert.
Gilbert Le Blanc
@GilbertLeBlanc: Das wussten wir beide nicht (als das OP seine erste Version der Frage schrieb) - und deshalb hätte ich hier nicht "Unterschiede sind notwendig" oder "Unterschiede sind nicht notwendig" geschrieben. Ich würde nur empfehlen, nicht mit einer komplizierteren Diff-Lösung zu beginnen, wenn eine einfachere Nicht-Diff-Lösung ausreicht. Ich denke, das hast du gemeint.
Doc Brown
3

Gibt es einen Standardweg, um dies zu erreichen?

Schauen Sie sich für einen standardbasierten Ansatz die Delta-V-Erweiterung für WebDAV an (selbst eine weit verbreitete Erweiterung für HTTP). Delta-V fügt WebDAV eine Versionierung hinzu und wird in RFC 3253 beschrieben .

Caleb
quelle
1

Eine relativ einfache Möglichkeit besteht darin, bei jedem Speichern eine Revisions-ID zu erhöhen und das neue XML-Dokument unter dieser neuen Revisions-ID zu speichern.

Tabelle: docs

doc_id | name          | current_revision
   1   | Shopping List |       5         

Tabelle: doc_revisions

doc_id | revision | timestamp | xml_blob
  1    |    1     | 2012...   |
  1    |    2     | 2012...   |
  1    |    3     | 2012...   |
  1    |    4     | 2012...   |
  1    |    5     | 2012...   |

Sie können die XML-Dateien auch separat im Dateisystem speichern. Sie können die Tabelle doc_revisions mit einer URL / einem Pfad zur Datei anstelle eines Blobs ändern. Auf diese Weise kann Ihre Datenbank weitaus höhere Volumes auf einem einzelnen Server verarbeiten, da die Datenbank physisch nicht so groß ist (Sie könnten die Dokumente auf einen anderen Server verschieben) und Sie die Last für das Abrufen von Dokumenten vom Datenbankserver nehmen würden.

Persönlich würde ich die Dateiunterschiede nicht speichern. Vielmehr würde ich jedes Mal die vollständige neue Version der Datei speichern. Speicher ist billig und keine Notwendigkeit, Dinge zu komplizieren. Die 'diff'-Funktionalität könnte später implementiert werden, wenn sich herausstellt, dass Sie sie wirklich brauchen. Beachten Sie beim Speichern von Unterschieden, dass dies zu unerwarteten Komplexitäten führen kann, z. B. wenn Sie den Text der Dokumente durchsuchen müssen.

GroßmeisterB
quelle
Was das Speichern von Dateidifferenzen betrifft, beschäftige ich mich mit dem Speichern von Differenzen mithilfe der Diff-Match-Patch-Bibliothek code.google.com/p/google-diff-match-patch
dev.e.loper
1

Warum nicht ein Datenbankprotokoll nachahmen?

Grundsätzlich werden Änderungen chronologisch als Transaktionen gekennzeichnet. Für eine Dokument-DB würde eine Transaktion aus einem Diffs-Blob + Zeitstempel anstelle eines Tabellenzeileneintrags bestehen, aber das Konzept funktioniert genauso. Ähnlich wie Versionskontrollsysteme.

Um die Dinge auf dem Laufenden zu halten, bewahren Sie eine zwischengespeicherte Kopie der aktuellen Version auf. Wenn jemand in der Zeit zurückgehen muss, kann er die Transaktionen zurücksetzen (dh rückgängig machen), bis er den von ihm benötigten Verlauf erreicht hat. Die Idee ist, dass sich die zwischengespeicherte Kopie erst ändert, wenn ein Speichervorgang ausgeführt wird.

Um die Konsistenz zu gewährleisten, müssen Sie auch Rollbacks berücksichtigen. Nehmen wir an, der Benutzer geht nach dem, was ich bereits beschrieben habe, auf 5 Versionen zurück. 5 Transaktionen würden in umgekehrter chronologischer Reihenfolge auf die aktuelle Version umgekehrt angewendet, aber wenn dieser Status gespeichert wird, wird die Transaktion als Abweichung von diesem Status im Vergleich zur aktuellen Version gespeichert.

Grundsätzlich wird der Verlauf nie neu geschrieben, sondern nur zum Erstellen neuer Versionen verwendet.

Evan Scholle
quelle