Design Textverwaltung
-
Hallo,
ich arbeite gerade an einem Projekt, wo es darum geht viele verschiedene Texte zu verwalten. Da Texte werden auf einem zentralen Server abgelegt. Nun soll der Benutzer die Möglichkeit haben, in diesen Texten bestimmte Bereiche mittels Tags zu markieren. Soweit so gut. Meine Frage ist nun, wie ich sowas am besten realisiere, wobei mir Effizienz wichtiger ist als der Speicherverbrauch. Ich selber könnte mir 3 Varianten vorstellen:
- Die Texte werden in einer relationalen Datenbank abgelegt. In einer anderen Tabelle werden die markierten Textstellen gespeichert. Die Textstellen werden auf Clientseite markiert (z.B. mittels JavaScript, Rechenlast liegt beim Client). Der Nachteil ist natürlich offensichtlich. Sollte sich ein Text ändern, wird es schwierig die Textstellen anzupassen. Außerdem ist der Speicherbedarf suboptimal, da Texte im Zweifelsfall doppelt gespeichert werden. Vorteil ist jedoch, dass die Aufzählung aller markierten Textstellen in Listenform recht simpel ist.
- Eine weitere Variante wäre die Textstellen direkt im Text zu codieren, z.B. indem die Texte als XML-Dateien gespeichert werden. Wäre natürlich auf den ersten Blick eine sehr schöne Variante. Jedoch kann ich mir vorstellen, dass gewisse Operationen eine schlechte Performance haben. Z.B. wenn eine Liste aller Textstellen aus allen Texten mit einem gegebenen Tag aufgestellt werden muss. Hat jemand eventuell Erfahrungen mit XML-Datenbanken oder dokumentenorientierten Datenbanken? Wäre sowas eine Lösung und wie schaut es da mit der Performance aus?
- Meine bisher favorisierte Lösung ist es, die Texte als Dateien abzulegen. In der Datenbank werden nur die Textstellen gespeichert, an dem ein Tag beginnt und endet. Sollte sich ein Text ändern, so sollte sich rekonstrieren lassen, um wieviele Zeichen sich die entsprechenden Textstellen verschieben müssen. Interessant wäre hierbei, welche Performance solch eine Lösung hat. Die Dateien müssen ja geöffnet werden und zur entsprechenden Textstelle gesprungen werden, um sie auszulesen.
Wie gesagt, ich tendiere zur letzten Variante. Jedoch freue ich mich über Feedback zu allen verschiedenen Lösungsansätzen. Vielleicht gibt es ja auch eine Möglichkeit, die ich bisher nicht in Betracht gezogen habe? Auch würde mich interessieren, ob XML-Datenbanken und Dokumentorientierte Datenbanken ein möglicher Weg wären.
Danke bereits im Voraus.
p.s. Die Frage passt nicht wirklich ins Datenbank-Forum, da ja nicht klar ist, ob eine Datenbank zur Verwaltung der Texte eingesetzt wird.
-
Variante 3 ist schlechter als Variante 1, da du ja immernoch das Problem hast, weitreichende Änderungen nachzuvollziehen. Zusätzlich aber musst du darauf aufpassen, dass Filesystem und Datenbank konsistent bleiben.
Warum nicht ähnlich machen wie bei Forensystemen? Einfach an der markierten Stelle einen Tag einfügen und zusammen mit dem Text abspeichern. In einer zweiten Tabelle pflegst du die Position der Tags, um sie schneller finden zu können (text_id, tag_id, von, bis)
-
Vielleicht sollte ich erwähnen, dass Änderungen der Texte eigentlich nicht vorkommen sollen nach aktueller Spezifikation. Ich sehe einen großen Nachteil bei deiner Lösung: Es handelt sich um große Texte, zum Teil auch ganze Bücher. Füge ich einen "Tag" ganz am Anfang des Textes ein, muss ich alle Referenzen auf dahinter liegende "Tags" ändern. Außerdem sehe ich keinen Vorteil, die Tags direkt im Text zu haben.
Hat hier wirklich noch niemand Erfahrungen mit XML- oder dokumentenorientierten Datenbanken gemacht?
-
Michamab schrieb:
Vielleicht sollte ich erwähnen, dass Änderungen der Texte eigentlich nicht vorkommen sollen nach aktueller Spezifikation.
Wenn sich die Texte nicht ändern (sollen), warum machst du dir dann über Änderungen Sorgen?
Ansonsten:
So wie ich deine Variante 3 verstehe, hättest du das Problem die Position wiederzufinden (kommt darauf an, wie viel Kontext um die Marken-Position herum du speicherst, bei zu wenig gibt es Mehrdeutigkeiten, bei zu viel wird diese Umgebung möglicherweise mit geändert).
Ich würde im Zweifelsfall die Position des Markierungs-Anfangs und -Endes speichern (per fgetpos()/ftell() aus der Datei gezogen).
-
Entschuldigung, falls ich mich missverständlich ausgedrückt habe, aber genau die von dir beschriebene Methode meinte ich in Variante 3. Also in der Datenbank die Start- und End-Position zu speichern.
Bzgl. der Änderung der Texte ist es so, dass dies in der Spezifikation nicht vorgesehen ist. Allerdings kann ich mir vorstellen, dass es in Ausnahmesituationen nötig sein könnte. Deshalb will ich das vom Design zum mindestens am Rande beachten.
-
Warum Speicherst du nicht ein kleinen XML Baum zu den text statt hinein?
"bla, bla, blubb und fasel" <Tags> <IsBold From="0" To="2" /> <IsItalic From="5" To "8" /> </Tags>
usw.
Änderungen sind dann auch relativ Simpel da du diese Bäume leicht in Objekte abbilden kannst und From/To immer nur um die Änderung verschieben musst.
//Dazu
Sehe grad das ist deine Variante 3, aber ich würde nicht mit Dateien arbeiten sondern den Text auch in der Datenbank halten.Es besteht ja auch die Möglichkeit den Text
1. Zu Splitten (Nach Absätze)
2. Eine weitere Spalte zu haben welche nur die ersten 50 Zeichen des Strings beinhaltet, dadurch kannst du schnell eine Übersicht aufbauen und hast schnellen Zugriff, und ziehst den Langen Text erst wenn du es brauchst.