2009-06-12 5 views
2

Ich schreibe eine Web-Anwendung, die eine Benutzeroberfläche zum Bearbeiten von Dokumenten hat. Was ist der beste Weg, um ein History-Feature wie Wikipedia zu implementieren, wo Änderungen an einem Dokument angezeigt werden können?Implementierung einer History-Funktion à la Wikipedia

+1

Der "beste Weg" hängt wahrscheinlich von einer Anzahl von Faktoren ab: wie viele Benutzer, wie viele Dokumente, wie viel gemeinsame Autorschaft, wie viele Revisionen werden erwartet, etc. – cheduardo

Antwort

3

Nun müssen Sie das aktuelle Dokument speichern und Änderungen archivieren, um zu vergleichen. Normalerweise ist das Hauptdokument das in der Datenbank, dann werden ältere Versionen beim Speichern in einer anderen Archivdatenbank oder einem anderen Dienst gespeichert.

Dann können Sie die neueste und die neueste archivierte Version abrufen und vergleichen Sie sie mit einem Diff-Algorithmus.

Python hat ein Diff-Algorithmus Werkzeug difflib: http://docs.python.org/library/difflib.html auch ein Verzeichnis und eine Datei vergleichen Werkzeug: http://docs.python.org/library/filecmp.html#module-filecmp

Viele andere Sprachen auch diff-Algorithmus-Implementierungen haben.

Sie können die Deltas bei Änderung speichern und wie eine Berkley DB wie Subversion neu erstellen, aber ich empfehle der Einfachheit halber, eine Kopie des Inhalts zu speichern und dann jeweils die neuesten oder die vom Benutzer ausgewählten zu vergleichen.

+0

Ja, das ist einfacher, wenn Sie sich selbst speichern. Das offensichtliche Problem ist natürlich der Platzbedarf. Wenn es nicht zu viele Seiten und zu viele Überarbeitungen gibt, funktioniert das gut. – Makis

+0

Wahr, es wäre projektspezifisch. Das Erstellen eines Deltadiffs wie BerkeleyDB oder die Verwendung von BDB selbst ist viel komplexer als ein einfacher vollständiger Inhaltsvergleich. Aber vereinbart, da gibt es ein Gleichgewicht. Offensichtlich für Apps wie Subversion oder Git möchten Sie Delta-Änderungen gespeichert, für eine einfache Todo-Task-App vollen Inhalt als Beispiel. –

1

Verwenden Sie ein Versionskontrollsystem als Grundlage (speichern Sie jede Version in einem VCS), sie speichern Änderungen in Deltas. Sie könnten dann ihre Diff-Funktionen verwenden, um die Unterschiede zu erhalten, aber dann müssten Sie die Ausgabe analysieren. In Git zum Beispiel können Sie die Ausgabe von zwei verschiedenen Revisionen erhalten, indem Sie einfach ihren Hash als Parameter an git-diff übergeben.

Das heißt, wenn Sie nicht bereit sind, ein vorhandenes System zu verwenden.

+0

Eine einfachere Lösung ist CVS zu verwenden, was Rock ist solide, klein und kompakt. Sie können es auch für viele Plattformen finden. Andere Optionen können sein: + SVN (Subversion) + Mercurial (für Python Jungs) – daitangio

+0

Git ist viel schneller, sehr klein und kompakt. Ich weiß nicht, wie CVS das einfacher machen würde. – Makis

0

Ohne zu wissen, welchen Rahmen und was Sie nicht verwenden, ist dies eine schwierige Frage gut zu beantworten.

Verwenden Sie eine Datenbank für Ihren Speicher? Nehmen wir an, Sie haben eine pages Tabelle in Ihrer Datenbank, warum erstellen Sie keine pages_versions Tabelle für alte Revisionen?

Wenn Sie etwas in die Tabelle pages speichern, fügen Sie zuerst eine Kopie in pages_versions ein. Das Abrufen der alten Versionen ist dann nicht schwieriger als das Laden von Daten über eine beliebige andere Beziehung. Sie können die Daten zu diesem Zeitpunkt mit einem farbigen Diff oder was nicht verschönern.

Ich glaube, dass einige Frameworks jetzt Unterstützung für die Verwendung eines Versionskontrollsystems als Speicher-Backend haben, so dass es auch eine Untersuchung wert sein könnte.

0

Beziehen Sie sich auf das Back-End-Setup oder das Front-End mit den einzelnen hervorgehobenen Änderungen?

Ich kann Ihnen nicht mit dem Front-End-Bit helfen, aber ...

Wenn es das Back-End ist, was Sie brauchen, ist:

  1. eine Tabelle 'Dokumente' mit Mitsprache , ID- und Titelspalten.
  2. Tabelle ‚Versionen‘ mit Spalten für document_id (FK), body_text, edit_date, Autor, Version
  3. in Ihrer Anwendung wird ein neues Dokument Bezug zuerst in der Dokumenten-Tabelle erstellt, dann werden die Daten als neue gespeicherte Version in der Versionstabelle. Wenn ein Benutzer ein altes Dokument aktualisiert, wird eine neue Version mit demselben Dokumentverweis in document_id erstellt.

(ich glaube, ich habe das wahrscheinlich nicht sehr gut erklärt, so traurig über das!)

BTW, wenn Sie Rails gibt es mehrere Plug-ins verwenden die meisten dies tun, werden für Sie. Acts_As_Versioned ist das erste, was mir in den Sinn kommt.