phpbar.de logo

Mailinglisten-Archive

WG: Wie realisiere ich das?

WG: Wie realisiere ich das?

Julian Daniel Jimenez Krause mysql_(at)_lists.phpcenter.de
Fri, 6 Apr 2001 18:07:40 +0200


> Hallo alle zusammen,
>
> ich habe in meiner Datenbank eine Tabelle, die die
> Namen und Adressen von Usern enthält. Nun möchte ich
> jedem User verschiedene Interessen zuordnen können.
> Auf der Anmeldungsseiten sollen ungefähr 20
> Interessensgebiete angeführt werden, die der User bei
> der Anmeldung mit einem Häkchen versehen kann - d.h.
> es muss auf jeden Fall möglich sein, jedem User
> mehrere Interessen zuordnen zu können.


hi helmut,

das ist ein bilderbuch-fall von einer "n-zu-m" beziehung. d.h. einem user
können m verschiedene interessen zugeordnet werden. und jedes interesse kann
bei n usern vorkommen.

> Wie schreibe ich jetzt diese 20 Interessen, von denen
> immer jeweils ein paar aktiviert sind, am besten in
> die Datenbank?
> Soll ich ich die Tabelle mit den Usern um 20 Spalten
> (für jedes Interessensgebiet eine) erweitern und dann
> jeweils 0 oder 1 hineinschreiben? - Keine besonders
> schöne Lösung, kommt mir vor.

genauso isses. die lösung des hinzufügen einer spalte für jedes
interessenthema in der user-tabelle ist datenbanktechnisch fatal u.a. weil:
- die tabellenstruktur muss geändert werden, jedes mal wenn ein
interessenthema geändert/gelöscht/hinzugefügt wird. das ist extrem lästig +
gefährlich (man vergißt ja so vieles!)
- du musst die interessenthemen festdefinieren im eingabeformular =>
änderung des formular bei jeder änderung der interessenthemen



n-m beziehungen loest man am elegantesten (sowohl datenbanktechnisch okay
als auch einfah zu handhaben) mit einer sogenannten cross-table , die
"zwischen" den tabellen tbl_user und tbl_interessen plaziert wird.

d.h. du brauchst insgesamt 3 tabellen:

tbl_user
********
id_user, user_name, etc...

tbl_interessen
**************
id_interesse, interesse, etc...

tbl_user_interesse (cross table)
******************
id, id_user, id_interesse

die lösung mittels einer cross-table hat folgende vorteile:

- du kannst die check-elemente für jedes interessenthema in das
eingabeformular automatisch einfügen mittels einer abfrage der tabelle
tbl_interessen und einem paar linien code. ändern sich die interessenthemen,
werden sie mehr, werden sie weniger: du brauchst nix ändern am
eingabeformular!

- die struktur von tbl_user ist unabhängig von änderungen von interessen

- informationen zu lesen aus diesen 3 tabellen ist denkbar einfach, z.b.
wenn du die users haben möchtest, welche ein bestimmtes interesse haben:

wenn du die id_interesse hast:

SELECT * from tbl_user, tbl_user_interesse
WHERE tbl_user.id_user = tbl_user_interessen.id_user
AND tbl_user_interesse.id_interessen = <bestimmte interessen-id>

ansonsten wenn du nach einem string suchst:

SELECT * from tbl_user, tbl_user_interesse, tbl_interessen
WHERE tbl_user.id_user = tbl_user_interessen.id_user
AND tbl_user_interessen.id_interesse = tbl_interessen.id_interesse
AND tbl_interessen.interessen IN '<suchtext>'




du kannst mit der cross-table weiter gehen und in ihr z.b. eine extra spalte
"wert" definieren:

tbl_user_interesse
******************
id, id_user, id_interesse, id_wert

somit könntest du einen wert für die "stärke" des interesses des users.
eingeben z.b.:

tbl_user_interesse
******************
1, 1, 3, 1
2, 1, 5, 2
3, 1, 6, 4
4, 2, 1, 2
5, 2, 3, 3

dabei definierst du am besten in einer extra-tabelle die bedeutung der
werte:

tbl_wert
********
id_wert, wert

z.b.

tbl_wert
********
1, 'Süchtig'
2, 'Sehr stark'
3, 'So lala interessiert'
4, 'Schon mal gehört'
0, 'Kein interesse' <- der Fall 'Kein Interesse' würde ich aber einfach gar
nicht speichern in tbl_user_interessen


Somit hättest du in der obigen tabelle tbl_user_interessen folgende
Informationen:

User 1 ist süchtig nach dem Interessenthema 3
User 1 ist sehr stark interessiert am Interessenthema 5
User 1 hat das Interessenthema 6 schon mal gehört
User 2 ist sehr stark interessiert am Interessenthema 1
User 2 ist ist so lala interessiert am Interessenthema 3

hinweis: mit all diesen daten kannst du automatisch (abfragen + code) im
eingabeformular:
- die interessenthemen auflisten
- vor jedem interessenthema ein select stellen mit den werten, zur auswahl

beim bearbeiten der eingaben tust du dann die daten (user-id, interesse-id
und wert-id) in tbl_user_interessen speichern.

schönstes nebeneffekt dieses approach: konsistenz der eingaben.

viel spaß!

gruß
julián daneiel

---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql 



php::bar PHP Wiki   -   Listenarchive