ThomasP: Eigenschaften zählen und vergleichen mit MySQL

Hallo Forum!

Mir geht schon seit einigen Tagen ein (zumindest für mich) recht kniffliges Problem in Sachen Datenbankdesign und -abfrage durch den Kopf und bereitet mir schlaflose Nächte:

Ich möchte eine Datenbank erstellen, mit deren Hilfe man Leute finden kann, mit denen man viele gemeinsame Interessen teilt. Viele werden das von Partnersuch-Seiten kennen. Ich frage mich nun, wie man das anstellen könnte, die eingegebenen Hobbys so in der Datenbank zu erfassen, daß sich recht einfach Leute suchen lassen, die mit einem selbst eine bestimmte Anzahl von Eigenschaften oder Hobbies gemeinsam haben. Bis jetzt ist mir nicht wirklich etwas eingefallen, das nicht total viel Zeit für die Verarbeitung benötigen würde. Ich bin nicht sooo der Profi in DB-Design und von daher bin ich mir sicher, daß jemand dieses Problem schon mal hatte und es eine effektive und saubere Lösung gibt.

Vielen Dank im Voraus für Eure Hilfe

Thomas.

  1. Hallo Forum!

    Mir geht schon seit einigen Tagen ein (zumindest für mich) recht kniffliges Problem in Sachen Datenbankdesign und -abfrage durch den Kopf und bereitet mir schlaflose Nächte:

    Ich möchte eine Datenbank erstellen, mit deren Hilfe man Leute finden kann, mit denen man viele gemeinsame Interessen teilt. Viele werden das von Partnersuch-Seiten kennen. Ich frage mich nun, wie man das anstellen könnte, die eingegebenen Hobbys so in der Datenbank zu erfassen, daß sich recht einfach Leute suchen lassen, die mit einem selbst eine bestimmte Anzahl von Eigenschaften oder Hobbies gemeinsam haben. Bis jetzt ist mir nicht wirklich etwas eingefallen, das nicht total viel Zeit für die Verarbeitung benötigen würde. Ich bin nicht sooo der Profi in DB-Design und von daher bin ich mir sicher, daß jemand dieses Problem schon mal hatte und es eine effektive und saubere Lösung gibt.

    Vielen Dank im Voraus für Eure Hilfe

    Thomas.

    lege jeweils eine spalte für hobby bzw. für die eigenschaften an.
    mit der mysql-funktion "select" und dem parameter "where" mit dem platzhalter "%" kannst du in bruchteilen von sekunden ein ergebnis erhalten, bei dem du nicht einmal mehr die datensätze nach dem vorkommen von gemeinsamkeiten durchsuchen mußt. wenn du das richtig anstellst, dann erhällst du nur die datensätze von der datenbank, die diese gemeinsamkeiten enthalten.

  2. Hallo,

    Ich kann mir das so vorstellen, daß Du mit drei Tabellen arbeitest:

    Tabelle Personen:
    personen_id [Primärschlüssel]
    name
    vorname
    ...
    Beispiel:
    1,Huber,Hans
    2,Müller,Anita
    3,Maier,Franz

    Tabelle Eigenschaften
    eigenschafts_id [Primär-Schlüssel]
    bezeichnung
    ...
    Beispiel:
    1,Schach
    2,Musik
    3,Tanzen
    4,Tennis

    Tabelle Personeneigenschaften:
    personen_id      [Primärschlüssel]
    eigenschafts_id  [Primärschlüssel]
    (Beide Felder zusammen sollten u.a. deshalb den Primärschlüssel bilden, damit Du doppelte Einträge vermeidest)

    Beispiel
    1,1
    1,2
    2,3
    3,2
    3,3
    3,4

    Mit einer Anweisung wie

    SELECT p.name,p.vorname,count(e.eichenschafts_id)
      FROM personen p, eigenschaften e, personen_eigenschaften ep
      WHERE p.personen_id = ep.personen_id
        AND e.eigenschafts_id = ep.eigenschafts_id
        AND e.bezeichnung IN ('Schach','Musik')
      GROUP BY p.name,p.vorname

    würdest Du alle Personen finden, welche mindestens eine der angegebenen Eigenschaften haben.
    Performanter würde das sein, wenn Du schon vorher die Eigenschaften an deren ID's bestimmen kannst ( Wie etwa durch ein geeignetes Auswahlfeld).

    SELECT p.name,p.vorname,count(ep.eichenschafts_id)
      FROM personen p, personen_eigenschaften ep
      WHERE p.personen_id = ep.personen_id
        AND ep.eigenschafts_id IN (1,2)
      GROUP BY p.name,p.vorname

    Es gehen dann auch andere Spielarten von Abfragen, aber so im wesentlichen ist das sicherlich eine recht flexible Lösung, so denke ich zumindest.

    Alternativ, falls Dir das zu kompliziert erscheint, kannst Du auch der Personen-Tabelle ein Feld für die Eigenschaften verpassen.
    Beispiel:
    1,Huber,Hans,Schach Musik
    2,Müller,Anita,Tanzen
    3,Maier,Franz,Musik Tanzen Tennis

    Und das so abfragen

    SELECT name, vorname
       FROM personen
       WHERE eigenschaften LIKE '%Schach%'
          OR eigenschaften LIKE '%Musik%'

    Aber das hat doch einige Nachteile, wie etwa daß die Anzahl der Hobbies durch die Größe des Feldes eigenschaften begrenzt ist ( bei char-Feldern i.d.R 255 Zeichen), oder es keine vernünftige Möglcihkeiten gibt, anhand der Anzahl der gefundenen Eigenschaften pro Person eine Reihung durchzuführen (best fit), und noch vieles mehr.

    Anmerkung: Mir ist schon klar, daß einige (viel) Datenbanken auch mit JOIN umgehen können, und daruch auch performanter sein können, aber die obigen Abfragen sind so halbwegs datenbankneutral.

    Mir sind da sicherlich noch einige wirklcih wichtige Dinger nicht eingefallen, aber fürs erste hoffe ich, Dir eine Ausgangsabasis für weiter Gedanken vermittelt zu haben

    Grüße
      Klaus