Horst: Schlagwortverzeichnis organisieren

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

  1. 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

    1. 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

      1. 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_2

        usw. 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":

        • 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.

        Gruß, Don P

        1. 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_2

          usw. 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, title

          wä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

          1. Hallo,

            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

            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

            1. 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

  2. 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

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. 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