Mailinglisten-Archive |
Hallo Dennis, Am Dienstag, 30. Oktober 2007 schrieb Dennis Dohle: > ich versuche gerade, ein System von mir etwas schneller zu machen. An > einer Stelle bin ich mir da nicht sicher, ob das nicht einfacher > geht. > > Ich habe z.B. zwei Tabellen. > > Tabelle 1: personen > Felder: id, vorname, name, std_telefon, std_fax > > Tabelle 2: kommunikationen > Felder: id, typ, kommunikation > > In der Tabelle 2 stehen also z.B. alle Telefonnummern etc., die dann > mit der id in den Standardfelder (z.B. std_telefon) der Tabelle 1 > abgelegt sind. > > Jetzt möchte ich eine Abfrage über die Tabelle 1 machen, und > gleichzeitig die Kommunikationen erhalten, die ja als ids in den > Feldern std_telefon und std_fax enthalten sind. > > Grundsätzlich nichts Schwieriges, das mit dem LEFT JOIN-Attribut > gelöst werden kann. Nur habe ich ja jetzt zwei > Standardkommunikations-IDs in der Tabelle 1 und möchte beide > "übersetzt" haben. Darum frage ich das derzeit wie folgt ab: > > SELECT > A.vorname, A.name, > B.kommunikation AS telefon, > C.kommunikation AS fax > FROM > personen AS A > LEFT JOIN > kommunikationen AS B ON B.id=A.std_telefon > LEFT JOIN > kommunikationen AS C ON C.id=A.std_fax > > > Funktioniert wunderbar! Aber kann man das nicht auch anders lösen, so > dass ich nur einmal die Tabelle "kommunikationen" ansprechen muss? > Denn in meinem System habe ich noch weitere Standardfelder wie > "mobil", "email" und "homepage". Dann müsste ich insgesamt fünf mal > ein LEFT JOIN machen, dass sieht mir sehr unsauber aus ... ein JOIN über drei Tabellen ist hier sehr unschön. Wenn die Datenbank wächst, werden plötzlich gewaltige Datenmengen bewegt. Das Ganze wird dann sehr langsam. Der eigentliche Fehler liegt aber in Deiner Datenbankstruktur. Am Besten verwendest Du eine Verknüpfungstabelle: Tabelle 1: personen Felder: id, vorname, name Tabelle 2: kommunikationen Felder: id, typ, kommunikation Tabelle 3: personen_kommunikationen Felder: id_person, id_kommunikation Dann kannst Du die Daten mit einem einzigen Dreifach-JOIN abfragen, gleich wieviel Kommunikationswege Du auslesen willst. Die Verknüpfungstabelle mit zwei ID-Spalten ist bei dem Dreifach-JOIN dann auch leichtgewichtiger. Allerdings wäre es aus datentechnischer Sicht überlegenswert, erst die Tabelle personen auszulesen - inklusive id - und dann mit den IDs über die Verknüpfungstabelle die Tabelle kommunikationen auszulesen und die Daten dann in der Anwendung zusammenzuführen. Dadurch vermeidest Du, daß die Datenbank Daten (name, vorname) mehrfach liefert, die nur einmal benötigt werden. Viele Grüße, Lutz
php::bar PHP Wiki - Listenarchive