====== n-m Beziehungen ======
In normalisierten Datenbanken kommen häufig "Beziehungstabellen" zum Einsatz, welche die Verbindung zwischen den Entitäten herstellen. **n-m-Beziehungen benötigen immer eine solche Beziehungstabelle**.
===== Beispiel =====
{{ :faecher:informatik:oberstufe:datenbanken:nm_beziehungen:erfilme.png |}}
{{ :faecher:informatik:oberstufe:datenbanken:nm_beziehungen:tabellen.png?300 |}}
Die Struktur der Beziehungstabelle sieht so aus:
''schauspieler_film(__sfid__, sid↑ , fid↑)''
Das vollständige Schema sieht also so aus:
''schauspieler_film(__sfid__, sid↑ , fid↑)''\\
''schauspieler(__sid__, SVorname, SNachname)''\\
''filme(__fid__, titel)''
Eine kurze Recherche ergibt (unter anderem), dass Meg Ryan in "Harry And Sally" mitspielt. Um diese Beziehung abzubilden, muss in unserer schauspieler_film-Tabelle eine Zeile der Form
^ sfid | sid | fid |
| 1 | 4 | 2 |
eingefügt werden. Der Umstand, dass John Belushi eine Rolle in Blues Brothers spielt, führt zu einer weiteren Zeile:
^ sfid | sid | fid |
| 1 | 4 | 2 |
| 2 | 6 | 1 |
----
{{:aufgabe.png?nolink |}}
=== (A1) ===
Ergänze die Beziehungstabelle unter Verwendung entsprechender Ressourcen (Suchmaschine).
----
Importiere für die folgenden Übungen die Tabellen der normalisierten Zahnarztbedarfsdatenbank in deine Übungsdatenbank. ({{ :faecher:informatik:oberstufe:datenbanken:nm_beziehungen:zahnarztbedarf_2nf.zip |}})
{{:aufgabe.png?nolink |}}
=== (A2) ===
Erstelle ein ER-Diagramm für die Datenbank. Überführe das ER Modell in ein relationales Datenbankschema.
----
{{:aufgabe.png?nolink |}}
=== (A3) ===
- Gib ein SQL-Statement an, das alle Produkte der Firma mit Hilfe des Filters ''WHERE hersteller.firma = 'Eisen Karl' '' auflistet((Du sollst also nicht "von Hand" zuerst die Hersteller ID nachschauen...)).
- Gib ein SQL-Statement an, das alle Bestellungen (Produkt und Anzahl) von Viktoria auflistet.
- Gib ein SQL-Statement an, das den Rechnungsbetrag von Dr. Blutgesicht ausgibt.
- Gib ein SQL-Statement an, das alle Doktoren ausgibt, die Zement gekauft haben
- Gib ein SQL-Statement an, das alle Doktoren ausgibt, deren Rechnungsbetrag über 100EUR liegt
++++ Lösung 1 |
SELECT produkte FROM hersteller, produkte, bestellungen
WHERE bestellungen.produkt_id = produkte.id
AND bestellungen.hersteller_id = hersteller.id
AND hersteller.firma = "Eisen-Karl"
++++
++++ Lösung 2 |
SELECT produkt, anzahl FROM hersteller, doktoren, produkte, bestellungen
WHERE bestellungen.produkt_id = produkte.id
AND bestellungen.doktor_id = doktoren.id
AND bestellungen.hersteller_id = hersteller.id
AND doktoren.vorname = "Viktoria"
++++
++++ Lösung 3 |
SELECT sum(preis*anzahl) AS rechnung, doktoren.name FROM hersteller,doktoren, produkte, bestellungen
WHERE bestellungen.produkt_id = produkte.id
AND bestellungen.doktor_id = doktoren.id
AND bestellungen.hersteller_id = hersteller.id
AND doktoren.name = "Blutgesicht"
++++
++++ Lösung 4 |
select vorname, name from bestellungen, doktoren, produkte
WHERE bestellungen.produkt_id=produkte.id
AND bestellungen.doktor_id=doktoren.id
AND produkte.produkt="Zement";
++++
++++ Lösung 5 |
SELECT sum(preis*anzahl) AS rechnung, doktoren.name FROM hersteller,doktoren, produkte, bestellungen
WHERE bestellungen.produkt_id = produkte.id
AND bestellungen.doktor_id = doktoren.id
AND bestellungen.hersteller_id = hersteller.id
GROUP BY doktoren.name
HAVING rechnung >100
++++
----
{{:aufgabe.png?nolink |}}
=== (Bonus 1) ===
Teste das folgende SQL Statement:
SELECT DISTINCT produkt, firma FROM produkte p
INNER JOIN bestellungen b ON p.id=b.produkt_id
INNER JOIN hersteller h ON h.id=b.hersteller_id
WHERE h.firma = "Eisen-Karl"
Was wird hier abgefragt? Experimentiere mit der WHERE Bedingung und mit den angezeigten Feldern.