$all->hi,
Zwecks Wortanalyse habe ich etliche Texte auseinanderklamüsert und zeilenweise in eine tabseparierte Datei geschrieben. Auszug:
853 And
853 Beleg
853 answered
853 I
853 will
853 seek
853 Túrin
853 until
853 I
853 find
853 him
853 and
853 I
853 will
853 bring
853 him
853 back
853 to
853 Menegroth
853 if
853 I
853 can
853 for
853 I
853 love
853 him
853 also
854 Then
854 Beleg
854 departed
854 from
854 Menegroth
854 and
854 far
854 across
854 Beleriand
854 he
854 sought
854 in
854 vain
854 for
854 tidings
854 of
854 Túrin
854 through
854 many
854 perils
Das ganze landet in einer Datenbank:
create table raw (line int, word varchar);
copy raw from '/home/pg/data';
Ich kann meine Daten wieder holen:
create index word_index on raw (word);
select line from raw where word = 'Menegroth';
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. :(
http://search.cpan.org/src/GMAX/DBSchema-Normalizer-0.08/docs/Normalizer.html hat Codebeispiele, aber die sind nur in MySQL gültig.
Ich hab natürlich versucht, auf der lokalen Maschine mittels eines Programms jedem einzelnen Wort seine Zeilen zuzuordnen, aber bei einem Hash mit zehntausenden verschiedenen Wörtern geht mir der Arbeitsspeicher aus, das Programm fängt an, zu swappen, und crasht letztendlich. Deshalb brauche ich eine serverseitige Lösung in SQL. Soweit:
create table lines (lineid serial primary key, line int);
insert into lines (line) select distinct line from raw;
create table words (wordid serial primary key, word varchar);
insert into words (word) select distinct word from raw;
create table lines_words (lineid int references lines (lineid), wordid int references words (wordid));
Fragen: Wie kriege ich die letzte Tabelle gefüllt? Wie sieht eine Abfrage nun aus, ist das korrekt?
select line from lines where wordid.word = 'Menegroth' on lines_words.lineid = lines_words.wordid;
Ich kann gut Perl, aber verstehe erst wenig SQL und DB-Theorie. Ich darf Postgres oder SQLite benutzen. Bitte berücksichtigt diese Fakten bei der Beantwortung.