split.s: Interessensfelder wie bei studivz usw.

Hi!

Es gibt ja bei studivz, myspace, flickr usw. diese Textarea's wo man Interessen durch Kommas getrennt eingeben kann.
Meine Frage an Euch: Wie speichert man das in der Datenbank?

Wird das in einem TEXT-Feld gespeichert, so wie es eingegeben wurde?

-oder-

wird der Text nach Kommas gesplittet und die einzelnen Teile dann in eine Tabelle gepackt?

Es muss ja hinterher irgendwie möglich sein, Leute abzufragen, die gerne "Segeln".

  1. Tach.

    Es gibt ja bei studivz, myspace, flickr usw. diese Textarea's wo man Interessen durch Kommas getrennt eingeben kann. Meine Frage an Euch: Wie speichert man das in der Datenbank?
    [...]
    Es muss ja hinterher irgendwie möglich sein, Leute abzufragen, die gerne "Segeln".

    Das kannst Du prinzipiell in beiden von Dir genannten Formen der Speicherung erreichen. Mit einem großen Textfeld in der Datenbank müßtest Du allerdings für jeden Eintrag mit Hilfe von Stringfunktionen erstmal die Liste in ihre Bestandteile zerlegen, um rauszukriegen, ob das gesuchte Wort drin vorkommt (in MySQL beispielsweise per FIND_IN_SET). Abfragen mit mehreren Begriffen machen das Ganze dann noch aufwendiger.

    Die Alternative sieht erstmal kompliziert aus, ist aber flexibler und bei Abfragen weniger aufwendig, weil das ständige Rumgewurschtel mit den Strings entfällt. Anstatt die Hobbies mit in die Tabelle der Benutzer zu stecken, legst Du eine eigene Tabelle dafür an. Jedes Hobby steht dort als eigener Eintrag drin – keine kommaseparierte Liste. Da zwischen Benutzern und Hobbies eine n:m-Beziehung herrscht (jeder Benutzer kann mehrere Hobbies haben und gleichzeit auch mehrere Benutzer das gleiche Hobby), benötigst Du noch eine dritte Tabelle, die Benutzer und Hobbies miteinander verknüpft:

    +------------+     +------------+     +------------+
    | user       |--+  | user_hobby |  +--| hobby      |
    +------------+  |  +------------+  |  +------------+
    | id         |  +->| userid     |  |  | id         |
    | username   |     | hobbyid    |<-+  | name       |
    | ...        |     |            |     |            |
    +------------+     +------------+     +------------+

    --
    Once is a mistake, twice is Jazz.
    1. Letzteres scheidet aus, weil ich die Hobbies eben NICHT vorgeben möchte. Das ist ja auch bei studivz so, dort kannst du im Prinzip alles mögliche reinschreiben.
      Ein weiterer Nachteil der letzten Methode ist der, dass man bei jedem INSERT erstmal gucken müsste ob das hobby nicht bereits schon vorhanden ist.

      Gabs da nicht mal sowas wie FULLTEXT oder sowas für?

      1. Tach.

        Letzteres scheidet aus, weil ich die Hobbies eben NICHT vorgeben möchte.

        Dann darf sich bei Dir auch keiner neu anmelden, weil Du die Benutzernamen eben nicht vorgeben möchtest? ;)

        Das ist ja auch bei studivz so, dort kannst du im Prinzip alles mögliche reinschreiben.

        Das kannst Du doch auch mit den getrennten Tabellen machen. Die halten Dich ja nicht davon ab, neue Datensätze hinzuzufügen, wenn jemand bisher nicht vorhandene Hobbies angibt. Du mußt nur eben die zweite Tabelle (user_hobby im Beispiel) mit aktualisieren.

        Ein weiterer Nachteil der letzten Methode ist der, dass man bei jedem INSERT erstmal gucken müsste ob das hobby nicht bereits schon vorhanden ist.

        So what? Kein großes Ding für die Datenbank. Außerdem kann man wohl davon ausgehen, daß die Hobbies häufiger ausgelesen als bearbeitet werden. Du betreibst also beim Aktualisieren der Profile (oder wo auch immer die Hobbies eingetragen werden können) *einmal* Aufwand anstatt bei *jedem* Auslesen der Profile. Das klingt doch ganz vernünftig.

        --
        Once is a mistake, twice is Jazz.
      2. Letzteres scheidet aus, weil ich die Hobbies eben NICHT vorgeben möchte.

        Hi,
        ich denke, das von Blaubart beschriebene Konzept ist sinnvoller. Ich weiß jetzt natürlich nicht genau, was die Umgebung ist, in der Du das ganze machen willst. Aber Du solltest an eines denken:
        Wenn Du die Hobbies nicht vorgeben willst, sondern jeder seine Hobbies frei Schnauze eintippen kann, dann macht das strukturierte Suchen SEHR viel schwieriger: der eine schreibt Fußball, der andere Kicken als Hobby. Oder einer segelt gerne, der andere fährt gerne Segelboot. Manche gehen laufen, anstatt zu joggen...
        Wenn Du dann Leute mit dem gleichen Hobby finden willst und vernünftige Ergebnisse erzielen, musst Du schon nen vergleichsweise durchdachten Algorithmus haben, um die Hobbies zu vergleichen, die Leute einfach eingetippt haben.

        Vielleicht wäre es eine Idee, dass man Hobbies nicht eintippen kann, sondern aus einer Liste auswählen, und wenn man sein Hobby nicht findet, dann kann man (unabhängig vom Eintragen seiner persönlichen Hobbies) ein neues Hobby zur Liste hinzufügen.
        Ich weiß nicht, ob sich der Aufwand lohnt, weil ich nicht weiß, um welche Größenordnung es bei der Benutzerzahl der Website geht. Aber wenn Du die Hobbies bei jedem einfach in nem String speicherst, macht das die Speicherung bzw. erforderliche Datenbankstruktur einfacher, aber die Auswertung in jeder Hinsicht schwieriger.

        Viele Grüße,
        der Bademeister