Mailinglisten-Archive |
> 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