1.1k Aufrufe
Gefragt in Datenbanken von
Hallo,

ich versuche mich gerade an meiner ersten Web-Anwendung mit PHP und MySQL und würde gerne wissen, wie man bei der Datenabfrage "am Besten" vorgeht. Dazu ein (vereinfachtes) Beispiel:

Ich habe in der Datenbank drei Tabellen, die eine n:m-Beziehung abbilden:
Tabelle A: Vorlesungen (ID, Bezeichung, Uhrzeit, Raum, etc.)
Tabelle B: Studenten (ID, Name, Vorname, etc.)
Tabelle C (Beziehungstabelle): Belegung (VorlesungsID, StudentenID)

Nun möchte ich zu einer bestimmten Vorlesung jeweils deren Daten als auch die dazugehörigen Studenten abfragen. Wie geht man hier "üblicherweise" vor?
Ist es besser anhand der Vorlesungs-ID zunächst Uhrzeit, Raum, usw. abzufragen und dann in einer zweiten Abfrage die entsprechenden Studenten. ODER: Ruft man in einer einzigen Abfrage mit Hilfe von Joins alle Daten ab.

Bei der ersten Methode hat man ja zwei Zugriffe auf die Datenbank. Die zweite Methode braucht nur einen Zugriff, aber dafür hat man redundante Daten im Ergebnis (da sich ja die Daten für die Vorlesung pro Student in jedem Datensatz wiederholen).

Ich hoffe ich konnte meine beiden Ansätze verständlich erklären und würde nun gerne wissen, welcher von beiden der bessere ist? (Gerade auch im Hinblick auf komplexere Beispiele in denen mit großen Datenmengen gearbeitet wird.) Oder kann man diese Frage gar nicht so pauschal beantworten?

Ich wäre auch dankbar für Hinweise, falls es eventuell noch andere Ansätze gibt, die ich grad übersehe.


Gruß,
Xeno

2 Antworten

0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi Xeno,

also ich würde da den einen großen join machen, da Datenbankmanagementsysteme ja auf joins optimiert sind (Thema Normalisierung).

Die Frage ist auf welcher Tabelle und Spalte machst du einen Index und welcher soll bei der Abfrage benutzt werden.

Mysql z.B. benutzt immer nur einen Index in einer Abfrage und da sollte man sich den aussuchen der den besten Geschwindikteitsvorteil bringt.

Das kann man sich entweder überlegen oder live im System ausprobieren indem man für jede Tabelle und die zu befragenden Spalten einen Index erstellt und den großen Join mit verschiedenen Indexen ausprobiert.

Gruß Fabian
0 Punkte
Beantwortet von
Hallo Fabian.

Danke erstmal für die schnelle Antwort.

Hmm, an Indizes habe ich noch gar nicht gedacht. Ich wüßte jetzt aber auch (noch) nicht wo ich am besten einen erstelle. Vermutlich auf einen der Primary Keys - aber das übersteigt zur Zeit noch mein Wissen. Ich schätze da muss ich noch einiges nachlesen/ausprobieren.

Nun ja, ich werde dann mal so oder so der großen Join nehmen.


Gruß,
Xeno
...