Datenmodellierung und Datenbanken
Das relationale Datenmodell: Tabellen, Schlüssel, Beziehungen
Wie aus dem ER-Modell echte Tabellen werden, und warum eine n:m-Beziehung immer eine Tabelle mehr braucht.
Benötigte Grundlagen
Dieses Vorwissen brauchst du für das Kapitel. Schau kurz nach, wenn dir etwas davon nicht mehr präsent ist, sonst leg direkt los.
Einführung
Das Modell steht: drei , zwei Beziehungen, Schlüssel vergeben. Jetzt soll daraus eine Datenbank werden, mit der man wirklich arbeiten kann.
Der Übergang ist erstaunlich mechanisch. Es gibt genau drei Regeln, und welche greift, hängt allein von der Kardinalität ab. Wer sie kennt, übersetzt ein ER-Modell ohne Nachdenken in Tabellen, und, was wichtiger ist, erkennt umgekehrt an einem Tabellenaufbau sofort, welches Modell dahintersteckt.
Das kannst du nach diesem Kapitel
die Begriffe Relation, Tupel, und Domäne verwenden.
Primärschlüssel und Fremdschlüssel unterscheiden und ihre Aufgabe erklären.
ein nach den drei Umsetzungsregeln in Tabellen überführen.
begründen, warum eine n:m-Beziehung eine zusätzliche Tabelle braucht.
erklären, was referenzielle ist und wovor sie schützt.
Die Sprache des relationalen Modells
Eine Relation ist das, was man umgangssprachlich Tabelle nennt. Sie hat feste Spalten und beliebig viele Zeilen.
- Eine Zeile heißt Tupel oder Datensatz. Sie beschreibt genau ein Ding.
- Eine Spalte heißt . Sie steht für eine Eigenschaft.
- Der Wertebereich einer Spalte heißt Domäne: Ganzzahl, Text, Datum, Wahrheitswert.
Zwei Regeln gelten dabei streng, und beide haben einen Grund:
In jeder Zelle steht genau ein Wert. „Deutsch, Mathe, Sport“ in einem Feld wäre bequem, macht aber jede Auswertung unmöglich: Man könnte nicht mehr zählen, wie viele Schüler Sport belegen, ohne den Text zu zerlegen.
Die Reihenfolge der Zeilen bedeutet nichts. Eine Relation ist eine Menge von Tupeln. Wer eine Reihenfolge braucht, muss sie als Attribut speichern, etwa ein Datum oder eine Platznummer.
Drei Wörter für dasselbe Bild
Die Fachwörter sind keine zweite Sache, die man zusätzlich lernen muss, sie benennen genau das, was du hier siehst. Die ganze Relation ist die Tabelle, ein ist eine Spalte, ein Tupel ist eine Zeile. Die hervorgehobene Zeile ist ein Tupel; sie ist durch ihren Primärschlüssel eindeutig bestimmt, und deshalb kann es keine zweite Zeile mit derselben schuelerID geben.
Primärschlüssel und Fremdschlüssel
Der Primärschlüssel ist die Spalte, die jede Zeile eindeutig bestimmt. Er ist der Schlüssel aus dem vorigen Kapitel, jetzt mit seinem Fachnamen.
Neu ist der Fremdschlüssel. Er ist eine Spalte, deren Werte auf den Primärschlüssel einer anderen Tabelle verweisen. Damit werden die getrennten Tabellen wieder verbunden.
| Schüler | Ausleihe | ||||
|---|---|---|---|---|---|
| schuelerNr | name | ausleihNr | schuelerNr | datum | |
| 1 | Mara Weber | 100 | 1 | 03.02. | |
| 2 | Jonas Kraus | 101 | 2 | 17.03. | |
| 102 | 1 | 21.03. |
In der Ausleihtabelle steht keine einzige Namensangabe. Es steht dort nur die Nummer, unter der man den Namen nachschlagen kann. Genau das beseitigt die Redundanz: Der Name „Mara Weber“ ist einmal gespeichert, obwohl sie zweimal ausgeliehen hat. Ändert sich der Name, ändert man eine Zelle.
Zwei Schlüsselarten, zwei Aufgaben
Beide heißen „Schlüssel“ und tun Verschiedenes, daran liegt die häufigste Verwechslung. Der Primärschlüssel identifiziert eine Zeile: In Klasse gibt es genau eine Zeile mit klasseID . Der Fremdschlüssel verweist auf eine: Schueler.klasseID sagt nur, welche Klassenzeile gemeint ist. Deshalb ist der eine unterstrichen und der andere kursiv, und deshalb zeigt der Pfeil nur in eine Richtung.
Die drei Umsetzungsregeln
Jetzt der mechanische Teil. Aus dem werden Tabellen nach drei Regeln, und die Kardinalität entscheidet, welche gilt.
Regel 1: Jede Entität wird eine Tabelle. Ihre werden Spalten, ihr Schlüssel wird Primärschlüssel.
Regel 2: Eine 1:n-Beziehung wird ein Fremdschlüssel auf der n-Seite.
Beispiel Klasse und Schüler (1:n): Die Schülertabelle bekommt eine Spalte klassenNr.
Warum auf der n-Seite und nicht umgekehrt? Weil in jeder Zelle nur ein Wert stehen darf. Ein Schüler ist in genau einer Klasse, also passt die eine Klassennummer in seine Zeile. Umgekehrt müsste in der Klassenzeile eine Liste aller Schüler stehen, und das verbietet die Zellenregel.
Regel 3: Eine n:m-Beziehung wird eine eigene Tabelle.
Sie enthält die Primärschlüssel beider Seiten als Fremdschlüssel. Zusammen bilden diese den Primärschlüssel der neuen Tabelle.
Auch hier folgt das Warum aus derselben Zellenregel. Bei Schüler und Kurs (n:m) müsste ein Fremdschlüssel auf einer der beiden Seiten mehrere Werte tragen, egal welche Seite man wählt. Das geht nicht, also braucht es einen dritten Ort, an dem jede einzelne Zuordnung eine eigene Zeile bekommt.
Schueler(schuelerNr, vorname, nachname, klasse)
Kurs(kursNr, bezeichnung, lehrer)
Belegung(schuelerNr, kursNr, note)
└── beide zusammen sind der Primärschlüssel,
jeder für sich ist ein Fremdschlüssel
Die Belegungstabelle löst zugleich das Problem aus dem vorigen Kapitel: Die Note gehört weder zum Schüler noch zum Kurs, sondern zur Zuordnung. Hier hat sie ihren Platz.
n:m wird zu zweimal n:1
So löst man die Beziehung aus dem vorigen Kapitel auf: Die Zwischentabelle in der Mitte enthält nichts als Verweise, je eine Zeile für „dieser Schüler belegt diesen Kurs“. Zähle nach: schuelerID steht zweimal darin, also belegt Anna zwei Kurse; kursID steht zweimal, also hat der Chor zwei Teilnehmer. Aus einer n:m-Beziehung sind damit zwei n:1-Beziehungen geworden, und die kann man beide mit einem Fremdschlüssel abbilden.
Referenzielle Integrität
Was passiert, wenn in der Ausleihtabelle die schuelerNr 7 steht, es aber gar keinen Schüler 7 gibt?
Man hätte einen Verweis ins Leere. Die Ausleihe wäre keinem zuzuordnen, und jede Auswertung würde sie entweder verschlucken oder mit einer Fehlermeldung abbrechen.
Ein Datenbanksystem verhindert das. Die Regel heißt referenzielle und besagt: Jeder Fremdschlüsselwert muss als Primärschlüssel in der Zieltabelle vorhanden sein. Daraus folgen zwei Verhaltensweisen:
- Ein Eintrag mit unbekanntem Fremdschlüssel wird abgelehnt.
- Wird eine Zeile gelöscht, auf die noch verwiesen wird, gibt es drei mögliche Reaktionen: ablehnen, die verweisenden Zeilen mitlöschen oder den Verweis auf „leer“ setzen. Welche gilt, legt man beim Anlegen fest.
Das ist ein wichtiger Punkt für das Verständnis von Datenbanken überhaupt: Sie prüfen nicht nur, sie verhindern ungültige . Eine Tabellenkalkulation lässt jede Eingabe zu, eine Datenbank nicht.
Ein Verweis, der ins Leere geht
Suche die in der oberen Tabelle. Sie kommt dort nicht vor. Cems Zeile verweist damit auf eine Klasse, die es nicht gibt. Genau das verhindert die referenzielle : Ein Datenbanksystem lässt eine solche Zeile gar nicht erst zu und weigert sich außerdem, eine Klassenzeile zu löschen, solange noch Schüler auf sie zeigen. Ohne diese Prüfung sähe die Tabelle völlig unauffällig aus, der Fehler steht nicht in ihr, sondern zwischen ihr und der anderen.
Ein vollständiges Beispiel
Bibliothek mit drei und einer n:m-Beziehung über die Ausleihe:
Schueler(schuelerNr, vorname, nachname, klasse)
Buch(buchNr, titel, autor, verlag)
Ausleihe(ausleihNr, schuelerNr, buchNr, ausleihdatum, rueckgabedatum)
Die Ausleihe hat hier einen eigenen Primärschlüssel und nicht die Kombination aus schuelerNr und buchNr. Der Grund: Derselbe Schüler kann dasselbe Buch zweimal ausleihen, im Februar und im November. Wäre die Kombination der Schlüssel, ließe sich die zweite Ausleihe nicht speichern.
Merke dir diese Prüfung: Kann dieselbe Zuordnung mehrfach vorkommen? Wenn ja, braucht die Beziehungstabelle einen eigenen Schlüssel oder zusätzlich das Datum im Schlüssel.
1:n umsetzen
Setze die Beziehung „Eine Klasse hat viele Schüler, ein Schüler ist in genau einer Klasse“ in Tabellen um.
- 1
Regel 1 liefert zwei Tabellen: Klasse(klassenNr, bezeichnung, raum) und Schueler(schuelerNr, vorname, nachname).
- 2
ablesen: 1 auf der Klassenseite, n auf der Schülerseite.
- 3
Regel 2: Der Fremdschlüssel kommt auf die n-Seite, also in die Schülertabelle: Schueler(schuelerNr, vorname, nachname, klassenNr).
- 4
Probe mit der Zellenregel: In der Zeile von Mara steht klassenNr = 3. Ein Wert, eine Zelle. Passt.
- 5
Gegenprobe der falschen Richtung: Stünde der Fremdschlüssel in der Klassentabelle, müsste dort für Klasse 3 stehen: schuelerNr = 1, 4, 7, 9, 12, … Das ist mehr als ein Wert in einer Zelle und damit verboten.
Schueler(schuelerNr, vorname, nachname, klassenNr) mit klassenNr als Fremdschlüssel auf Klasse.
n:m umsetzen
Setze „Ein Schüler belegt mehrere Kurse, ein Kurs hat mehrere Schüler; je Belegung wird eine Note gespeichert“ um.
- 1
Regel 1: Schueler(schuelerNr, vorname, nachname) und Kurs(kursNr, bezeichnung, lehrer).
- 2
Prüfen, ob Regel 2 reicht: Ein Fremdschlüssel kursNr beim Schüler müsste mehrere Kurse tragen, ein Fremdschlüssel schuelerNr beim Kurs mehrere Schüler. Beides verletzt die Zellenregel, also reicht Regel 2 nicht.
- 3
Regel 3: Es entsteht eine dritte Tabelle Belegung(schuelerNr, kursNr, note). Jede einzelne Zuordnung bekommt dort eine eigene Zeile.
- 4
Primärschlüssel der neuen Tabelle: die Kombination aus schuelerNr und kursNr, denn ein Schüler belegt denselben Kurs nur einmal. Jede der beiden Spalten für sich ist ein Fremdschlüssel.
- 5
Und die Note? Sie steht genau hier richtig, denn sie hängt von beiden Seiten ab. In der Schülertabelle könnte man nicht sagen, in welchem Kurs, in der Kurstabelle nicht, von wem.
Drei Tabellen. Belegung(schuelerNr, kursNr, note) mit zusammengesetztem Primärschlüssel.
Typischer Fehler
In der Kurstabelle eine Spalte „teilnehmer“ anlegen und dort „Mara, Jonas, Lea“ eintragen.
Das verletzt die wichtigste Regel des relationalen Modells: In einer Zelle steht genau ein Wert.
Warum ist das mehr als eine Formvorschrift? Weil jede Auswertung daran scheitert. Rechne die Folgen durch:
- „Wie viele Schüler belegen diesen Kurs?“ verlangt das Zählen von Kommas statt von Zeilen, und bei einem Schüler ohne Komma zählt man falsch.
- „Belegt Lea diesen Kurs?“ findet auch „Leander“ und „Lea-Marie“, weil nur Textteile verglichen werden.
- Eine Note je Teilnehmer lässt sich gar nicht unterbringen. Man bräuchte eine zweite Liste in derselben Reihenfolge, und deren Übereinstimmung könnte niemand prüfen.
- Ein Namenswechsel muss in jeder Kurszeile gesucht werden, in der die Person vorkommt. Die Änderungsanomalie ist zurück.
Richtig ist Regel 3: eine eigene Tabelle, in der jede Zuordnung eine eigene Zeile bekommt. Danach ist „Wie viele Schüler belegen diesen Kurs?“ ein Zählen von Zeilen, und die Note hat einen Platz.
Übung 1
leichta) Was ist ein Tupel? b) Wo steht der Fremdschlüssel bei einer 1:n-Beziehung? c) Wie viele Tabellen entstehen aus zwei mit einer n:m-Beziehung? d) Was verlangt die referenzielle ?
Tipp anzeigen
Zu b): Auf welcher Seite passt genau ein Wert in die Zelle?
Lösung anzeigen
a) Eine Zeile einer Tabelle, also ein Datensatz über genau ein Ding. b) Auf der n-Seite, also dort, wo es viele gibt. c) Drei: eine je Entität plus die Beziehungstabelle. d) Dass jeder Fremdschlüsselwert als Primärschlüssel in der Zieltabelle tatsächlich vorhanden ist.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
a) Tupel: eine Zeile über genau ein Ding
Ein Tupel ist eine Zeile einer Tabelle, also ein Datensatz über genau ein Ding, ein Buch, einen Schüler, eine Ausleihe. Die Spalten sind die Merkmale dieses Dings, die Zeile fasst sie zu einer Einheit zusammen.
- 2
b) Der Fremdschlüssel steht dort, wo genau ein Wert hinpasst
Bei einer 1:n-Beziehung steht der Fremdschlüssel auf der n-Seite, also dort, wo es viele gibt. Der Grund ist zwingend: In eine Zelle passt genau ein Wert. Ein Kurs hat viele Schüler, in die Kurszeile passte diese Vielzahl nicht; jeder Schüler hat aber genau einen Kurs, und der passt in seine Zeile.
- 3
c) n:m erzwingt eine dritte Tabelle
Aus zwei Entitäten mit n:m-Beziehung entstehen drei Tabellen: eine je Entität plus die Beziehungstabelle. Sie enthält je Zuordnung eine Zeile mit beiden Schlüsseln und lässt damit beliebig viele Zuordnungen in beide Richtungen zu.
- 4
d) Referenzielle Integrität: kein Verweis ins Leere
Sie verlangt, dass jeder Fremdschlüsselwert als Primärschlüssel in der Zieltabelle tatsächlich vorhanden ist. Eine Ausleihe darf also nicht auf ein Buch verweisen, das es nicht gibt.
Übung 2
mittelEin Kino verwaltet Filme, Säle und Vorstellungen. Ein Film läuft in mehreren Vorstellungen, eine Vorstellung zeigt genau einen Film und findet in genau einem Saal statt.
a) Bestimme die . b) Setze das Modell in Tabellen um und markiere Primär- und Fremdschlüssel. c) Prüfe deinen Entwurf mit der Zellenregel. d) Was passiert beim Versuch, einen Film zu löschen, für den es noch Vorstellungen gibt?
Tipp anzeigen
Zu a): Für jede Verbindung zwei Sätze bilden, einen je Richtung.
Lösung anzeigen
a) Film und Vorstellung: „Ein Film läuft in mehreren Vorstellungen“, „Eine Vorstellung zeigt genau einen Film“ → 1:n. Saal und Vorstellung: „In einem Saal finden mehrere Vorstellungen statt“, „Eine Vorstellung ist in genau einem Saal“ → 1:n.
b) Tabellen:
Film(filmNr, titel, laufzeit, altersfreigabe) Saal(saalNr, bezeichnung, plaetze) Vorstellung(vorstellungNr, filmNr, saalNr, beginn, preis)
Beide Fremdschlüssel stehen in der Vorstellungstabelle, weil sie auf beiden Beziehungen die n-Seite ist.
c) Jede Zelle der Vorstellungstabelle trägt genau einen Wert: eine Filmnummer, eine Saalnummer, einen Beginn. Es gibt keine Aufzählung in einer Zelle, also ist die Regel eingehalten.
d) Die referenzielle greift. Es gibt drei mögliche, beim Anlegen festgelegte Reaktionen: Die Datenbank lehnt das Löschen ab, sie löscht die Vorstellungen mit oder sie setzt deren filmNr auf leer. Für ein Kino ist Ablehnen die sinnvollste Einstellung: Vorstellungen ohne Film wären unbrauchbar, und stilles Mitlöschen könnte bereits verkaufte Karten betreffen.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
Teil a): jede Verbindung zweimal durchsprechen
Es gibt zwei Verbindungen, und jede braucht zwei Sätze. Ein einzelner Satz kann die Kardinalität nie festlegen, weil er nur eine Seite beschreibt.
Zwischenergebnis
Film 1:n Vorstellung · Saal 1:n Vorstellung
Achte darauf, dass die Vorstellung bei beiden Beziehungen die n-Seite ist. Genau deshalb sammeln sich dort später beide Fremdschlüssel.
- 2
Teil b): Regel 1 anwenden
Zuerst wird aus jeder Entität eine Tabelle, mit ihren als Spalten und ihrem Schlüssel als Primärschlüssel. Beziehungen bleiben in diesem Schritt noch unberücksichtigt.
\text{Film}(\underline{\text{filmNr}}, \ldots) \quad \text{Saal}(\underline{\text{saalNr}}, \ldots) \quad \text{Vorstellung}(\underline{\text{vorstellungNr}}, \ldots)
Zwischenergebnis
Drei Tabellen, noch ohne Verbindung.
- 3
Teil b): Regel 2 zweimal anwenden
Beide Beziehungen sind 1:n, also kommt je ein Fremdschlüssel auf die n-Seite. Beide n-Seiten sind die Vorstellung, also bekommt sie zwei Fremdschlüsselspalten.
\text{Vorstellung}(\underline{\text{vorstellungNr}}, \textit{filmNr}, \textit{saalNr}, \text{beginn}, \text{preis})
Zwischenergebnis
Die Vorstellungstabelle verbindet Film und Saal.
- 4
Teil c): mit der Zellenregel gegenprüfen
Der Entwurf wird geprüft, indem man eine Beispielzeile hinschreibt und jede Zelle ansieht. Steht irgendwo eine Aufzählung, ist die Umsetzung falsch.
(\text{7}, \text{3}, \text{2}, \text{20:15}, \text{9{,}50})
Zwischenergebnis
Jede Zelle trägt genau einen Wert. Der Entwurf hält.
Übung 3
schwerEine Bibliothek soll auch mehrbändige Werke und Bücher mit mehreren Verfassern erfassen.
a) Welche hat die Beziehung zwischen Buch und Autor jetzt, und was folgt daraus? b) Entwirf die Tabellen vollständig. c) Warum genügt es nicht, in der Buchtabelle die Spalten autor1, autor2, autor3 anzulegen? d) Ein Autor soll gelöscht werden, von dem noch Bücher vorhanden sind. Welche der drei Reaktionen der referenziellen wählst du und warum?
Tipp anzeigen
Zu a): „Ein Buch hat mehrere Autoren“ und „Ein Autor schreibt mehrere Bücher“ gelten jetzt beide.
Lösung anzeigen
a) n:m. Beide Richtungen tragen jetzt „viele“: Ein Buch kann mehrere Verfasser haben, ein Autor mehrere Bücher schreiben. Nach Regel 3 folgt daraus eine eigene Tabelle.
b) Tabellen:
Buch(buchNr, titel, verlag, erscheinungsjahr) Autor(autorNr, vorname, nachname, geburtsjahr) Verfasst(buchNr, autorNr, reihenfolge)
Beide Spalten der Tabelle Verfasst sind zusammen der Primärschlüssel und einzeln je ein Fremdschlüssel. Das reihenfolge hält fest, wer als Erstautor genannt wird; das ist eine Angabe über die Zuordnung und gehört genau hierher.
c) Vier Gründe. Erstens ist die Zahl der Autoren fest begrenzt; ein viertes Namensfeld erfordert eine Schemaänderung. Zweitens stünden bei Einzelautoren zwei Spalten leer. Drittens wird die Abfrage „Welche Bücher hat Kästner geschrieben?“ zu einer Suche über drei Spalten, und viertens stünde der Name des Autors bei jedem seiner Bücher erneut da, womit die Änderungsanomalie zurück ist.
d) Ablehnen. Ein Buch ohne Verfasser wäre inhaltlich falsch, und Mitlöschen wäre gefährlich: Beim Entfernen eines Autors verschwänden seine Bücher aus dem Bestand, obwohl sie physisch im Regal stehen. Ablehnen zwingt dazu, den Fall bewusst zu behandeln, etwa den Autor zuerst aus den betroffenen Werken zu entfernen. Die dritte Variante, den Verweis auf leer zu setzen, hinterließe Zuordnungszeilen ohne Autor und damit sinnlose Datensätze.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
a) Die Kardinalität in beide Richtungen prüfen
Man prüft beide Sätze: „Ein Buch hat mehrere Autoren“, ja. „Ein Autor schreibt mehrere Bücher“, ja. Beide Richtungen tragen „viele“, also n:m. Und daraus folgt zwingend eine eigene Tabelle.
- 2
b) Die drei Tabellen vollständig aufschreiben
Buch (buchNr, titel, verlag, erscheinungsjahr). Autor (autorNr, vorname, nachname, geburtsjahr). Verfasst (buchNr + autorNr als Schlüssel, reihenfolge). In Verfasst sind beide Spalten zusammen der Primärschlüssel und einzeln je ein Fremdschlüssel.
- 3
c) Warum autor1, autor2, autor3 wieder scheitert
Vier Gründe: Die Zahl der Autoren wäre fest begrenzt; bei Einzelautoren stünden zwei Spalten leer; „Welche Bücher hat Kästner geschrieben?“ würde zur Suche über drei Spalten; und der Name stünde bei jedem seiner Bücher erneut da, womit die Änderungsanomalie zurück ist.
- 4
d) Die richtige Reaktion der referenziellen Integrität wählen
Ablehnen. Ein Buch ohne Verfasser wäre inhaltlich falsch. Mitlöschen wäre gefährlich: Beim Entfernen eines Autors verschwänden seine Bücher aus dem Bestand, obwohl sie physisch im Regal stehen. Auf leer setzen hinterließe Zuordnungszeilen ohne Autor, also sinnlose Datensätze.
Zusammenfassung
Im relationalen Modell heißt eine Tabelle Relation, eine Zeile Tupel, eine Spalte und ihr Wertebereich Domäne. Zwei Regeln sind streng: In jeder Zelle steht genau ein Wert, und die Zeilenreihenfolge bedeutet nichts. Der Primärschlüssel bestimmt eine Zeile eindeutig, ein Fremdschlüssel verweist auf den Primärschlüssel einer anderen Tabelle und stellt die Verbindung her, ohne Angaben zu wiederholen. Der Übergang vom folgt drei Regeln: Jede Entität wird eine Tabelle, eine 1:n-Beziehung wird ein Fremdschlüssel auf der n-Seite, und eine n:m-Beziehung wird eine eigene Tabelle mit beiden Fremdschlüsseln. Beide Male folgt das Warum aus der Zellenregel. Die referenzielle stellt sicher, dass kein Fremdschlüssel ins Leere zeigt; sie verhindert ungültige , statt sie nur zu melden.


