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?
quelle
Antworten:
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?
quelle
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:
Fügen Sie eine Zeile in diese Verlaufstabelle ein, bevor Sie die Zeile in der XML-Zeichenfolgentabelle aktualisieren.
quelle
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 .
quelle
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
Tabelle: doc_revisions
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.
quelle
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.
quelle