Informatik

Viele-zu-viele-Beziehungen

Eine Band kann mehrere Genres haben. Ein Genre umfasst mehrere Bands. Solche Beziehungen lassen sich mit einem Fremdschlüssel allein nicht abbilden.

Warum ein Fremdschlüssel nicht reicht

Angenommen, man versucht es trotzdem. Beurteile die drei Versuche:

Versuch 1: In band gibt es eine Spalte genre_id.

Versuch 2: In band gibt es eine Spalte genres mit dem Inhalt 'Indie, Rock'.

Versuch 3: In band gibt es die Spalten genre_1, genre_2, genre_3.

Was geht bei jedem Versuch schief?

Auflösung

Versuch 1 erlaubt jeder Band nur genau ein Genre. Nordlicht ist aber Indie und Rock.

Versuch 2 verstößt gegen die erste Regel einer Relation: In einer Zelle steht genau ein Wert. Die Folgen merkt man beim Abfragen – wie sucht man alle Indie-Bands? LIKE '%Indie%' findet auch ein hypothetisches Genre Indietronica. Sortieren, zählen und verbinden geht gar nicht.

Versuch 3 legt die Zahl der Genres willkürlich auf drei fest. Bands mit einem Genre haben zwei leere Spalten, Bands mit vier passen nicht. Und die Suche nach Indie-Bands muss alle drei Spalten prüfen.

Alle drei Versuche scheitern an derselben Stelle: Eine viele-zu-viele-Beziehung ist keine Eigenschaft einer Band und keine Eigenschaft eines Genres. Sie ist eine Eigenschaft des Paares.

Die Lösung: eine eigene Tabelle

Eine Zuordnungstabelle (auch: Beziehungstabelle) bildet eine viele-zu-viele-Beziehung ab. Sie enthält je einen Fremdschlüssel auf beide beteiligten Tabellen; beide zusammen bilden ihren Primärschlüssel.

Jede Zeile bedeutet: „Dieses Paar gehört zusammen."

Eine Zeile (1, 2) in band_genre heißt also: Die Band mit band_id = 1 gehört zum Genre mit genre_id = 2. Um daraus Namen zu machen, braucht man beide Verbunde:

Der Weg geht immer über die Zuordnungstabelle:

band → band_genre → genre

Man kann band und genre nicht direkt verbinden – sie haben keine gemeinsame Spalte. Drei Tabellen, zwei Verbundbedingungen.

a) Wie viele Zeilen liefert die Abfrage oben? Vergleiche mit der Zeilenzahl von band. Warum ist sie größer?

b) Ändere die Abfrage so, dass sie nur die Bands des Genres Metal zeigt.

c) Ändere sie so, dass sie nur Bands zeigt, die zu Indie gehören und nach 2015 gegründet wurden.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Eine Zuordnungstabelle mit eigenen Attributen

Sieh dir mitgliedschaft an:

mitgliedschaft enthält zusätzlich instrument und seit. Diese Angaben gehören weder zur Person noch zur Band, sondern zu ihrer Verbindung: Dieselbe Person kann in einer Band singen und in einer anderen Bass spielen.

Das ist der Regelfall, nicht die Ausnahme. Sobald du eine Zuordnungstabelle anlegst, lohnt die Frage: Gibt es Angaben, die genau zu diesem Paar gehören?

Prüfe an der Datenbank nach: Findest du eine Person, die in zwei Bands verschiedene Instrumente spielt? Und wie würdest du diese Information speichern, wenn instrument eine Spalte in person wäre?

Aufgaben

a) Alle Personen, die Gesang machen, mit Bandnamen.

b) Alle Genres der Band Nordlicht.

c) Alle Bands, die sowohl auf der Hauptbühne aufgetreten sind als auch zum Genre Rock gehören – mit Datum des Auftritts.

d) Alle Personen, die seit vor 2010 in ihrer Band sind, mit Instrument und Bandname, sortiert nach Eintrittsjahr.

Tipp 1: zu c)

Du brauchst vier Tabellen: band, auftritt, buehne und – für das Genre – band_genre und genre. Das sind fünf. Also vier Verbundbedingungen.

Tipp 2: Reihenfolge im FROM

Fang bei der Tabelle an, aus der die meisten Angaben kommen, und hänge die anderen der Reihe nach an. Jede neue Tabelle braucht ein ON, das sie mit einer der schon vorhandenen verknüpft.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Selbsttest

Viele-zu-viele-Beziehungen

Teilbare URL erstellen

Abschnitte auswählen