n:m-Beziehungen und Beziehungstabellen
Aufgabe 8
Untersuche, wie Songs und Playlists miteinander verbunden sind. Übertrage deine Beobachtung auf AG-Anmeldungen und InstaHub.
Entdecken
Songs und Playlists
Aus Aufgabe 7 kennst du die Tabellen Song, Song_in_Playlist und Playlist. Für diese Aufgabe kommt eine weitere Zuordnung hinzu: Gaslighter gehört auch zu Fussballhits.
1.1 Kreuze alle Playlists an, in denen Gaslighter steht.
1.2 Kreuze alle Songs in Fussballhits an.
Hilfe 1
Beginne mit der id von Gaslighter in Song.
Hilfe 2
Suche in Song_in_Playlist alle Zeilen mit dieser song_id und lies die playlist_id ab. Für Fussballhits gehst du umgekehrt vor.
Hilfe 3
Gaslighter hat die id 1; dazu gehören die playlist_id-Werte 1 und 2. Suche nun alle Zeilen mit playlist_id 2.
1.3 Trage die Kardinalitäten für Song und Playlist ein (1, n oder m).
Playlist
Hilfe 1
Lies die Zuordnung in beide Richtungen.
Hilfe 2
Kann ein Song in mehreren Playlists stehen? Kann eine Playlist mehrere Songs enthalten?
Hilfe 3
Gaslighter steht in zwei Playlists; Fussballhits enthält drei Songs. Beide Seiten können also viele Zuordnungen haben.
Das ist eine n:m-Beziehung. Die Schreibweise m:n bedeutet dasselbe. n und m stehen für voneinander unabhängige Anzahlen: Wie viele Playlists ein Song hat, legt nicht fest, wie viele Songs eine Playlist enthält.
Song
Playlist
Ein Song kann in mehreren Playlists stehen; eine Playlist kann mehrere Songs enthalten.
Entdecken
Lina besucht zwei AGs
Anmeldungen für die AGs: Robotik – Lina, Ben · Theater – Lina, Mia · Chor – Mia
schueler(
id: int
name: varchar(255)
ag_id[ag]: int
)2.1 Entscheide: Was trägst du bei Lina in ag_id ein?
2.2 Hilft es, den Fremdschlüssel stattdessen in ag zu speichern (schueler_id[schueler])?
Schüler
AG
2.3 Trage die Kardinalitäten ein. Verwende 1, n oder m.
Hilfe 1
Sieh in die Anmeldeliste: Wie viele AGs hat Lina? Wie viele Schüler hat die Robotik-AG?
Hilfe 2
In eine Zelle passt genau ein Wert, und ein Fremdschlüssel verweist auf genau einen Datensatz.
Hilfe 3
Ein Schüler kann mehrere AGs besuchen und eine AG mehrere Schüler haben. Auf beiden Seiten stehen also »viele« – dafür verwendest du n und m.
Können auf beiden Seiten viele Objekte beteiligt sein, spricht man von einer n:m-Beziehung.
Hier: Schüler n ───── m AG. Man verwendet zwei verschiedene Buchstaben, weil die beiden Anzahlen unabhängig voneinander sind.
Mit nur einem Fremdschlüssel lässt sich eine n:m-Beziehung nicht umsetzen.
Verstehen
Eine Tabelle für die Anmeldungen
Die Schule speichert die Anmeldungen in einer eigenen Tabelle teilnahme. Jede Zeile ist eine Anmeldung.
3.1 Ergänze: Welche AGs besucht Lina?
Lina hat in schueler die id . In teilnahme steht diese schueler_id zusammen mit den ag_id-Werten und . Lina besucht also die AGs und .
3.2 Ergänze: Wer besucht die Theater-AG?
Die Theater-AG hat in ag die id . In teilnahme steht diese ag_id bei den schueler_id-Werten und . Die Theater-AG besuchen also und .
3.3 Ben meldet sich zusätzlich für den Chor an. Ergänze, was sich ändert.
Die Tabelle bekommt eine neue . Darin steht bei schueler_id der Wert und bei ag_id der Wert .
Hilfe 1
Suche zuerst Linas id in schueler.
Hilfe 2
Suche in teilnahme alle Zeilen mit dieser schueler_id. Die ag_id verrät dir, welche AG gemeint ist.
Hilfe 3
Lina hat die id 1. In teilnahme gibt es zwei Zeilen mit schueler_id 1. Für die Theater-AG gehst du umgekehrt vor: Suche ihre id in ag und dann alle Zeilen mit dieser ag_id.
Bei der Umsetzung von n:m-Beziehungen entsteht eine neue (Hilfs-)Tabelle. Diese enthält die Primärschlüssel beider Klassen als Fremdschlüssel.
Die Beziehungstabellen in diesem Lernmodul bestehen nur aus den beiden Fremdschlüsseln. Sie haben keine zusätzliche id-Spalte.
Umsetzung in der Datenbank (Tabellen)
schueler(
id: int
name: varchar(255)
)teilnahme(
schueler_id[schueler]: int
ag_id[ag]: int
)ag(
id: int
name: varchar(255)
)Aus der n:m-Beziehung werden so zwei 1:n-Beziehungen. Die Fremdschlüssel stehen wie gewohnt auf der n-Seite – in der Beziehungstabelle (Hilfstabelle).
Du kennst so eine Tabelle schon: Song_in_Playlist aus Aufgabe 7.
Anwenden
Likes, Kommentare und Follower
InstaHub soll um Likes, Kommentare und Follower erweitert werden. Die bekannten 1:n-Beziehungen sind schon eingetragen.
users
photos
tags
4.1 Ergänze die Kardinalitäten bei »kann liken«, »kann kommentieren« und »kann folgen«.
Hilfe 1
Lies jede Beziehung in beide Richtungen, z. B.: Wie viele Fotos kann ein Benutzer liken? Von wie vielen Benutzern kann ein Foto geliked werden?
Hilfe 2
Stehen in beiden Richtungen »viele«, ist es eine n:m-Beziehung. Verwende dann zwei verschiedene Buchstaben.
Hilfe 3
»kann liken« ist eine n:m-Beziehung. Prüfe »kann kommentieren« und »kann folgen« genauso. Bei »kann folgen« sind beide Enden an users: Ein Benutzer kann vielen folgen und viele Follower haben.
users n ───── m photos (kann liken, kann kommentieren) und users n ───── m users (kann folgen). Im Klassendiagramm bleibt jede n:m-Beziehung eine einzige Linie.Anwenden
Die Beziehungstabelle (Hilfstabelle) likes
Für die Likes bekommt InstaHub die Beziehungstabelle (Hilfstabelle) likes.
likes(
photo_id[photos]: int
user_id[users]: int
)5.1 Kreuze an: Welche Fotos hat reisewut_emil geliked?
5.2 Wer hat Foto 14 geliked?
Umsetzung in der Datenbank (Tabellen)
users(
id: int
username: varchar(255)
…
)likes(
photo_id[photos]: int
user_id[users]: int
)photos(
id: int
description: varchar(255)
…
)5.3 Ergänze die Kardinalitäten. So wird users n ───── m photos mit Tabellen umgesetzt.
Hilfe 1
Die Spalte user_id in likes verweist auf users, die Spalte photo_id auf photos.
Hilfe 2
Achtung: photos.user_id gibt an, wer ein Foto hochgeladen hat. Wer ein Foto geliked hat, steht nur in likes.
Hilfe 3
Für die Kardinalitäten: Jede Zeile in likes enthält genau eine user_id und genau eine photo_id. Der Fremdschlüssel steht immer auf der n-Seite.
users 1 ───── n likes n ───── 1 photos. Ein Benutzer kann viele Likes vergeben, ein Foto viele Likes bekommen. Jede Zeile in likes gehört zu genau einem Benutzer und genau einem Foto.Übertragen
Die Beziehungstabelle (Hilfstabelle) follows
Auch Follower speichert InstaHub in einer Beziehungstabelle (Hilfstabelle). follower_id: wer folgt · following_id: wem gefolgt wird.
follows(
following_id[users]: int
follower_id[users]: int
)follower_id: wer folgt · following_id: wem gefolgt wird
6.1 Entscheide: Was bedeutet die Zeile mit following_id 52 und follower_id 138?
6.2 zornigerfotograf und reisejoule folgen sich gegenseitig. Kreuze an, was stimmt.
Hilfe 1
Beachte die Erklärung über der Tabelle: follower_id ist der, der folgt. following_id ist der, dem gefolgt wird.
Hilfe 2
Übersetze jede id mithilfe von users in einen Benutzernamen und lies die Zeile dann als Satz: »follower folgt following«.
Hilfe 3
Zeile 1 heißt: reisejoule folgt zornigerfotograf. Vergleiche damit Zeile 2.
users n ───── m users. Beide Fremdschlüssel verweisen auf users, und jede Zeile beschreibt eine Richtung. In InstaHub sind likes, comments und follows solche Beziehungstabellen (Hilfstabellen).Eine n:m-Beziehung wird durch eine Beziehungstabelle umgesetzt. Jede Zeile verbindet über zwei Fremdschlüssel genau einen Datensatz der einen Tabelle mit genau einem Datensatz der anderen Tabelle.
Eine Beziehungstabelle heißt auch Hilfstabelle.
Übersicht
n:m-Beziehungen auf einen Blick
Song
Playlist
Beziehungstabelle
Eine n:m-Beziehung wird durch eine Beziehungstabelle umgesetzt. Jede Zeile verbindet über zwei Fremdschlüssel genau einen Datensatz der einen Tabelle mit genau einem Datensatz der anderen Tabelle.
Eine Beziehungstabelle heißt auch Hilfstabelle.
Sicherungsblatt zu Aufgabe 8
Sicherungsblatt anzeigen
Sichern
Abschlussquiz
Kreuze alle richtigen Antworten an. Bei manchen Fragen sind mehrere Antworten richtig.