Schlagwortverzeichnis organisieren
Horst
- programmiertechnik
0 Don P0 Stefan Eickhoff0 Horst
Hallo,
mit Perl habe ich ein Schlagwortverzeichnis erstellt, es enthält knapp 17.000 Stichworte aus 160 html-Dateien (jaja, fleißig getippt), wobei ich die üblichen Stopworte (der die das ...) schon rausgenommen habe.
Das Script schreibt in wenigen Sekunden einen Index als iniFile, sieht so aus
[stichwort]
url_1 = title_1
url_2 = title_2
usw. Diese ini hat 3 MB, logisch, sind ja auch eine ganze Menge Redundanzen drin, bspw., kann eine url mehrfach, also unter verschiedenen [stichwort] vorkommen.
Das Problem ist letztendlich die Größe der ini, mit dem Perl-Modul Config::IniFile dauert es Minuten allein, bis das $cfg-Objekt erstellt ist. Das ist für ein CGI, was auf die ini aufsetzen soll unbrauchbar.
Wie kann ich ein Schlagwortverzeichnis besser organisieren, so dass der Zugriff in akzeptablen Zeiten (Sekundensache) erfolgt?
Vielen Dank für Vorschläge,
Horst Haselhuhn
Hallo,
[stichwort]
url_1 = title_1
url_2 = title_2
Wie kann ich ein Schlagwortverzeichnis besser organisieren, so dass der Zugriff in akzeptablen Zeiten (Sekundensache) erfolgt?
Mit Hilfe einer relationalen Datenbank.
Gruß, Don P
Hallo,
[stichwort]
url_1 = title_1
url_2 = title_2
Meine Tabelle sieht so aus:
word varchar, links text
text ist
url_1 = title_1
url_2 = title_2
usw. Den Text kann ich ja im Script parsen...
Sollte ich besser zwei tabellen machen?
table words hat dann nur ein Feld: word (primkey)
table links hat dann drei Felder: wordref(foreignkey), url, title
Oder ist das übertriebene "Normalisierung"? Btw., so ganz "normal" wäre das mMn auch nicht, es gäbe viele Redundanzen...
Bitte mal Feedback.
Hotte
Hallo,
Meine Tabelle sieht so aus:
word varchar, links text
Wie jetzt? Ein Feld namens "word" für Stichworte, ein weiteres namens "links" für URLs und ein drittes Feld namens "text" mit folgenden Inhalten:
text ist
url_1 = title_1
url_2 = title_2usw. Den Text kann ich ja im Script parsen...
Meist du es so? Wenn ja, dann taugt das nicht viel, und meine Antwort auf
Sollte ich besser zwei tabellen machen?
table words hat dann nur ein Feld: word (primkey)
table links hat dann drei Felder: wordref(foreignkey), url, title
wäre "eher drei":
Wenn aber eine URL nicht mehrere titles haben kann, oder ein title nicht mehrere URLs, dann kannst du URLs und titles in derselben Tabelle halten, dann aber in separaten Feldern.
Gruß, Don P
Hallo,
Meine Tabelle sieht so aus:
word varchar, links textWie jetzt? Ein Feld namens "word" für Stichworte, ein weiteres namens "links" für URLs und ein drittes Feld namens "text" mit folgenden Inhalten:
text ist
url_1 = title_1
url_2 = title_2usw. Den Text kann ich ja im Script parsen...
Meist du es so?
Nein, es sind nur zwei Felder: word, text
im Textfeld steht
url1=title2
url2=title3
usw. passend zum Schlagword im word-Feld.
Wenn ja, dann taugt das nicht viel, und meine Antwort auf
Sollte ich besser zwei tabellen machen?
table words hat dann nur ein Feld: word (primkey)
table links hat dann drei Felder: wordref(foreignkey), url, titlewäre "eher drei":
- Eine, die nur Stichworte enthält, ohne Redundanz
- Eine, die nur URLs enthält, ohne Redundanz
- Eine, die nur titles enthält, ohne Redundanz
Wenn aber eine URL nicht mehrere titles haben kann, oder ein title nicht mehrere URLs, dann kannst du URLs und titles in derselben Tabelle halten, dann aber in separaten Feldern.
Ok, das ist der Fall.
words hat ein Feld: word (primary key)
anton
berta
links hat drei Felder: word, url, title
anton, freund.html, Über Anton, meinen Freund
berta, freundin.html, Über Berta, meine Freundin
anton, alphabet.html, Das Buchstabieralphabet
berta, alphabet.html, Das Buchstabieralphabet
links.word als foreign key von words.word, ansonsten hat die Tabelle links keinen primary key, jedoch einen Index auf links.word wegen der Performance.
Also doch zwei Tabellen?
Hotte
Hallo,
words hat ein Feld: word (primary key)
anton
bertalinks hat drei Felder: word, url, title
anton, freund.html, Über Anton, meinen Freund
berta, freundin.html, Über Berta, meine Freundin
anton, alphabet.html, Das Buchstabieralphabet
berta, alphabet.html, Das Buchstabieralphabet
Sorry, ich hab's noch immer nicht ganz begriffen: Kann es vorkommen, dass derselbe URL verschiedene Titel hat bzw. derselbe Titel verschiede URLs, oder nicht? Ich meine so ähnlich:
anton, alphabet.html, Das Buchstabieralphabet
a-z, alphabet.html, Das ganze Alphabet
z-a, alphabetrueckwarts.html, Das ganze Alphabet
Wenn ja, brauchst du drei Tabellen, sonst reichen zwei.
Du musst einfach so viele Tabellen anlegen, bis keine Redundanz mehr vorkommt.
links.word als foreign key von words.word, ansonsten hat die Tabelle links keinen primary key, jedoch einen Index auf links.word wegen der Performance.
Mit den keys kenne ich mich nicht so aus (bin mySQL-Dummi, bis jetzt), aber vom Prinzip her scheint mir das ok.
Gruß, Don P
Hallo,
Sorry, ich hab's noch immer nicht ganz begriffen: Kann es vorkommen, dass derselbe URL verschiedene Titel hat bzw. derselbe Titel verschiede URLs, oder nicht? Ich meine so ähnlich:
S'is mittlerweile fertig:
http://rolfrost.de/cgi-bin/words.cgi
Schön wäre es, wenn mit einem Klick auf [+][-] neben dem Schlagwort die Liste mit den dazugehörigen URL/Title per Ajax nachgeladen wird. In einem solchen Fall bin ich absolut dafür, mehrere Tabellen einzusetzen.
So wie ich jetzt habe, werden url/title beim fetchen der Datensätze zum Schlagwort gleich mitgeladen, aus einer Tabelle. Btw., mein EDV-Lehrer hat auch mal gesagt, dass Normalisierungen nicht zum Selbstzweck sind.
Viele Grüße,
Hotte
Hallo Horst,
Wie kann ich ein Schlagwortverzeichnis besser organisieren, so dass der Zugriff in akzeptablen Zeiten (Sekundensache) erfolgt?
Du könntest die Datei aufteilen.
Z.B. für jeden Anfangsbuchstaben eine eigene Datei anlegen.
Dann hättest Du 27 ini-Dateien (a-z und sonstige).
Wenn das noch nicht reicht könntest Du auch die ersten beiden Buchstaben bei der Aufteilung berücksichtigen.
Viele Grüße
Stefan
Hallo,
Wie kann ich ein Schlagwortverzeichnis besser organisieren, so dass der Zugriff in akzeptablen Zeiten (Sekundensache) erfolgt?
Du könntest die Datei aufteilen.
Jow, hab ich mir auch schon überlegt, ist aber nicht so schön... Wie auch immer, mit einer einzigen ini-Datei geht es schon, sofern ich die Datei händisch auf einen hash lese, aber es dauert immer noch zu lange. Nach einigem hin-und-her hab ich mich nun doch entschlossen, den Index nicht in eine ini zu schreiben, sondern in eine MySQL-Tabelle.
Unter der Bedingung, dass das ein CGI-Script remote auf dem Webserver machen kann, und das funktioniert nun auch mit Lichtgeschwindigkeit.
Somit isses kein Problem mehr, ein CGI auf die Tabelle zu setzen mit akzeptablen Zugriffszeiten (danke Don P).
Viele Grüße an alle und schönen Dank nochmal für Hilfestellungen,
Horst Haselhuhn