Moin!
Aber so nehmen die Daten ziemlich viel Platz ein. Ich habe den Tipp bekommen, zu normalisieren. Dazu habe ich viele Webseiten besucht und gelesen, aber die sagen ausschließlich theoretisch, wie das Endergebnis aussieht, aber nicht, wie man dorthin kommt. :(
Die Frage ist doch: Was willst du aus den Daten am Ende wissen? Es muß ja einen Sinn haben, dass du Tolkien-Texte in eine Datenbank packst.
Sofern du beantwortet haben willst, welche Worte in welchen Zeilen stehen, gibts hinsichtlich der Normalisierung in meinen Augen diese Stufen:
1. Jedes Wort wird mit jeder Zeilennummer separat gespeichert - so ist es in deiner Raw-Datei.
2. Jedes Wort wird mit einer Liste von Zeilen, in denen es vorkommt, verknüpft. Das spart den Speicherplatz, jedes Wort immer und immer wieder zu speichern, benötigt aber zusätzlichen Speicherplatz, um eine Wort-ID mit der Zeilennummer zu verknüpfen.
Tabellendesign wäre dann: 1. Tabelle: Wort und Wort-ID. 2. Tabelle Wort-ID und Zeilennummer.
Im Prinzip ist die zweite Tabelle genau dasselbe, wie deine jetzige Liste - nur dass anstelle der Worte jetzt IDs stehen, deren Bedeutung in einer separaten Tabelle nachgeschlagen werden kann.
3. Natürlich kann man auch noch die Zeilennummern, die möglicherweise ja nicht bloß Zahlen sind, sondern evtl. lexikalische Verweise (Verlag, Buch, Band, Seite, Zeile), in IDs umsetzen. Das bedeutet eine dritte Tabelle, die genauso aufgebaut ist, wie die Wortliste - und die Zuordnung findet dann nicht mehr zwischen Wort-ID und Zeilennummer statt, sondern zwischen Wort-ID und Zeilen-ID.
Sofern aber die Zeilennummer in deinem Ausgangsmaterial eindeutig ist und nur aus einer Zahl besteht, ist dieser Zusatzaufwand entbehrlich.
Zur Befüllung dieser Tabelle ist es nun bei jedem Wort in der Wortliste notwendig, zu prüfen, ob das Wort in der Worttabelle schon vorkommt. Wenn ja, ermittle die Wort-ID und schreibe Wort-ID und Zeilennummer in die Tabelle. Wenn nein: Schreibe das neue Wort in die Wortliste, ermittle dessen neue ID und schreibe sie dann zusammen mit der Zeilennummer in die Tabelle.
Bei diesem Vorgang wäre eventuell auch die Anwendung einer Stoppwortliste hilfreich, die typische und sehr häufig vorkommende Worte herausfiltert.
Ob das Ergebnis in der Datenbank dann aber tatsächlich weniger Speicherplatz in Anspruch nimmt, würde ich mal bezweifeln. Insbesondere wenn du hinterher einigermaßen schnelle Abfragen haben willst, mußt du Indexe einsetzen, die ihrerseits eine Menge Speicherplatz verbrauchen können - oftmals mehr, als an Nutzdaten enthalten ist. Für den großen Speicherplatzaufwand, den man hat, erhält man im Gegenzug schnelle Datenbankabfragen.
- Sven Rautenberg
"Love your nation - respect the others."