Ich habe eine Tabelle mit Userdaten und eine zweite Tabelle, welche Gegenstände und ihre Eigenschaften enthält. Nun sollte jedem User eine beliebige Menge von Gegenständen zugeordnet werden können. Wie kann ich das implementieren, so dass möglichst wenig Platz verbraucht wird?
Effiziente Implemetierung gesucht
Einklappen
X
-
mach eine verknüpfungstabelle.
1. spalte userid
2. spalte gegenstandid
so sähe dann z.b. der inhalt aus, wenn daten enthalten sind.....
Code:uid | gid ----------- 2 | 1 5 | 8 7 | 7 3 | 3 3 | 5 3 | 5 12 | 10
INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
-
wieso sortiert einfügen?
was meinst du ?INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
Naja, wenn man aus dieser Tabelle alle Gegenstände eines Users ablesen will, muss man ja immer die ganze Tabelle durchsuchen, es sei denn, sie ist schon nach User geordnet, dann kann man spezielle Verfahren zur Einschränkung des Aufwandes verwenden. Oder funktioniert das etwa völlig anders?
Kommentar
-
Oder funktioniert das etwa völlig anders?
schaue dir mal JOINs an. insbesondere LEFT JOIN und LEFT OUTER JOIN.
sortieren kannst du immer noch, wonach du willst.... diese verbindungstabelle, stellt nur dar, welcher user welchen gegenstand/gegenstände besitzt. auch kann abgebildet werden, dass mehrere user einen gleichen gegenstand haben. schliesslich können nciht alle äpfel einem user zugeordnet werden...INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
/me hat in seinen datenbank vorlesungen gelernt, dass leute ausm rechenzentrum dumm wie'n meter feldweg sind, worms übern beamer richtig spaß macht und dass spalten einer tabelle ganz streng genommen keine reihenfolge haben
und wenn es schon für spalten (also innerhalb einer zeile) gilt, dann gilt das jo wohl auch für zeilen untereinander
in nertabelle speicherst du nur zusammengehörende daten mit gleicher struktur, ohne reihenfolge, ohne irgendwasIch denke, also bin ich. - Einige sind trotzdem...
Kommentar
-
genau genommen musst du 2x JOIN machen. schliesslich willst du ja auch die gegenstände haben
hier mal die query ...
Code:SELECT u.uid, u.uname u.uemail, g.gid, g.gname FROM user u LEFT OUTER JOIN user_gegenstaende USING(uid) LEFT OUTER JOIN gegenstaende g USING(gid)
INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
Original geschrieben von mrhappiness
wenn du die einträge eines user haben willst geht das auch mit INNER JOIN (spontane behauptung),INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
dein join liefert doch alle user, egal ob sie gegenstände besitzen und alle gegenstände, egal ob jemand sie besitzt oder nicht?
wenn er das aber für einen bestimmten user haben will, macht er das ja mit userid und dann sollte auchCode:SELECT u.uname, g.gname FROM user u INNER JOIN user_gegenstand USING (user_id) INNER JOIN gegenstand g USING (gegenstand_id) WHERE u.user_id=45.78
Ich denke, also bin ich. - Einige sind trotzdem...
Kommentar
-
ok. verstanden (hoffe ich. )
mein LEFT O J liefert keine gegenstände, wenn es keinen user gibt, dem ein GS zugeordet ist. daher ja das LEFT. es wird sich an der 'linken' tabelle orientiert....INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
-
möglicherweise der INNER JOIN, da hier nur die werte aus der linken tabelle benützt werden, die auch tatsächlich benötigt werden. somit ist die abfrage ein wenig performanter. insbesondere dann, wenn die daten immer mehr werden. bei einem LEFT OUTER JOIN werden erst einmal alle daten aus der linken tabelle gezogen, dann die daten aus der mittleren tabelle genommen und anschliessend noch die aus der rechten tabelle. anschliessend wird das WHERE verarbeitet.
daher kann ich mir vorstellen, dass das INNER JOIN minimal schneller sein könnte..INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |
Kommentar
Kommentar