In diesem Kapitel wollen wir unsere überarbeitete Musikdatenbank mit mehreren Klassen nun auch implementieren, also in einem Datenbanksystem umsetzen. Bevor wir die vier Klassen als Tabellen realisieren, müssen wir aber noch überlegen, wie die Beziehungen zwischen den Klassen in der Datenbank umgesetzt werden kann.
Die folgende Datenbank hat besteht aus vier Tabellen, die genau nach dem Klassendiagramm gebildet wurden, d. h. der Bezeichner der Klasse ist der Name der Tabelle, die Attribute der Klassen sind die Bezeichnungen der Tabellenspalten geworden.
Um jetzt zum Beispiel alle Musiker mit ihren Bands und der jeweiligen Stilrichtung zu ermitteln,
muss man bei einer Abfrage Informationen aus mehreren Tabellen nutzen.
Dazu gibt man nach dem FROM-Schlüsselwort durch Kommata getrennt
die Tabellen an, z. B.
SELECT * FROM Band, Person WHERE Nachname='Hamm';
Analysiere zunächst den Inhalt der vier Tabellen (Klick auf den Tabellennamen) und
versuche dann mit Hilfe einer geeigneten SQL-Abfrage, alle Informationen zur Person von Gemma Hamm sowie der zugehörigen Band
zu ermitteln.
Versuche auch alle Lieder der CD 'Sounds Bad' in einer Ergebnistabelle aufzulisten.
Überprüfe jeweils den Inhalt der Ergebnistabellen.
Offensichtlich führen die SQL-Abfragen
SELECT * FROM Band, Person WHERE Nachname='Hamm';
bzw.
SELECT * FROM CD, Lied WHERE CDTitel='Sounds Bad';
nicht zum gewünschten Ergebnis.
Offensichtlich enthält die Ergebnistabelle zu viele und vor allem inhaltlich falsche Zeilen.
Doch was ist hier passiert?
Wenn man sich die Spalten der Tabelle Person und Band sowie die Abfrage
SELECT * FROM Band, Person WHERE Nachname='Hamm';
genauer anschaut, wird klar, dass die Datenbank keine Information enthält, wie die
Datensätze der beiden Tabellen in Beziehung stehen.
Stattdessen liefert die Abfrage eine Kombination des Datensatzes von Gemma Hamm aus der Tabelle
Person mit allen Datensätzen der Tabelle Band.
Noch deutlicher wird dies bei einer Abfrage ohne Selektion, also ohne WHERE
-Teil:
SELECT * FROM Band, Person;
Die Ergebnistabelle enthält 784 Datensätze. Jede der 56 Personen wird mit jeder
der 14 Bands (56 mal 14 = 784) genannt.
Das Ergebnis dieser Abfrage bezeichnet man als kartesisches Produkt oder Kreuztabelle, da zu je zwei Datensätzen
ein Ergebnis gebildet wird:
Um nur sinnvolle Kombinationen der beiden Tabellen zu erhalten, muss ein Datensatz der einen Tabelle Informationen enthalten, welche Datensätze der anderen Tabelle mit ihm in Verbindung stehen.
Eine Möglichkeit wäre, dass in der Tabelle Band die Werte von Person_ID gespeichert werden. Da eine Band allerdings mehrere Bandmitglieder haben kann, müssten also auch zu einem Datensatz einer Band mehrere Werte von Person_ID enthalten sein, was sich schlecht umsetzen lässt.
Deshalb ist es viel sinnvoller bei der Person als zusätzliches Attribut und damit Tabellenspalte den Namen der Band zu vermerken. Dieses Attribut entspricht damit dem Primärschlüssel der Tabelle Band und wird - da es ja in der Tabelle Person steht - als Fremdschlüssel bezeichnet.
Im Tabellenschema werden Fremdschlüssel häufig durch eine gepunktete Unterstreichung oder eine Überstreichung des Feldes gekennzeichnet. Die Bezeichnung des Fremdschlüssels kann, muss aber nicht mit dem Namen des zugehörigen Primärschlüssels identisch sein. Es ist jedoch sinnvoll, wenn sich der zugehörige Primärschlüssel aus dem Fremdschlüssel erschließt.
Hier ein mögliches relationales Tabellenschema ohne Angabe der Datentypen:>
Band(Bandname, Stil);
Person(Person_ID, Vorname, Nachname, Geburtsjahr, Instrument, Bandname);
Bei der Abfrage über die beiden Tabellen müss nun die Einträge von Primärschlüssel und Fremdschlüssel übereinstimmen.
Dies erreicht man mit Hilfe des
Verwende im folgenden Fenster die obige Abfrage und analysiere das Ergebnis.
Erstelle geeignete Abfrage zu folgenden Fragestellungen:
In unserer Datenbank Musik fehlen noch die Tabellen CD und Lied. Auch hier müssen die Beziehungen durch geeignete Fremdschlüssel umgesetzt werden.
Ergänze zum Klassendiagramm das bisherige Tabellenschema.
Band(Bandname, Stil);
Person(Person_ID, Vorname, Nachname, Geburtsjahr, Instrument, Bandname);
CD(CDTitel, Bandname);
Lied(LiedTitel, Länge, CDTitel);
Das folgende Fenster enthält die vollständige Musik-Datenbank mit den vier Tabellen.
Erstelle geeignete Abfrage zu folgenden Fragestellungen und Aufgaben: