Relationale Datenbank: Aufbau und Normalisierung
Du lernst, Tabellen mit Schlüsseln zu verbinden, fehlerhafte Verweise zu erkennen und Tabellen bis zur dritten Normalform zu zerlegen.
Kurz gesagt
Eine relationale Datenbank speichert Daten in Tabellen, die über Schlüssel verbunden werden. Beim Normalisieren zerlegst du Tabellen nach festgelegten Abhängigkeiten, um vermeidbare Mehrfachspeicherung zu verringern.
Wie verbindest du Daten, ohne dieselben Angaben ständig neu einzutragen? Dafür brauchst du passende Tabellen, eindeutige Schlüssel und gültige Verweise. An erfundenen Beispielen untersuchst du den Aufbau und verbesserst einen Tabellenentwurf schrittweise.
Deine Lernziele
Eine relationale Datenbank ordnet Daten in Tabellen. Eine Tabelle beschreibt eine Art von Gegenständen oder Vorgängen. Ein Datensatz ist eine Zeile mit zusammengehörigen Angaben. Ein Attribut ist eine benannte Spalte, etwa Ort. In jeder Zeile steht dort der zugehörige Attributwert.
Ein Primärschlüssel kennzeichnet jeden Datensatz eindeutig. Er kann aus einer Spalte oder mehreren Spalten bestehen. Seine Werte beziehungsweise Wertekombinationen dürfen nicht doppelt vorkommen. Kein Bestandteil darf fehlen. Namen eignen sich ohne weitere Regeln schlecht dafür, weil verschiedene Gegenstände denselben Namen haben können.
Ein Fremdschlüssel stellt einen Bezug zu einem Datensatz her. In unseren Beispielen verweist er auf den Primärschlüssel einer anderen Tabelle. Sein Wert darf mehrfach vorkommen: Mehrere Fächer können beispielsweise zum selben Spind gehören. Bei einem Schlüssel aus mehreren Spalten gehören auch zum passenden Fremdschlüssel entsprechend mehrere Spalten.
Ein Relationenschema beschreibt den Aufbau einer Tabelle. Wir schreiben den Tabellennamen und dahinter die Spaltennamen in Klammern. Spind(SpindNr, Ort) ist ein solches Schema. „Nr“ bedeutet Nummer. Die Schlüssel nennen wir jeweils ausdrücklich dazu. Diese Schreibweise beschreibt einen Entwurf; sie ist kein ausführbarer Programmcode.
Tabelle, Datensatz und Attribut
Die Tabelle umfasst die Daten einer Art. Ein Datensatz ist eine Zeile. Ein Attribut ist eine Spalte; ein Attributwert ist die konkrete Angabe in einer Zelle.
Beispiel: Spinde und ihre Fächer
- 1Spind(SpindNr, Ort); Primärschlüssel: SpindNr.
- 2Ein Datensatz in Spind enthält SpindNr 3 und Ort „Flur“.
- 3Fach(FachNr, SpindNr); Primärschlüssel: FachNr.
- 4Ein Datensatz in Fach enthält FachNr 12 und SpindNr 3.
- 5SpindNr ist in Fach ein Fremdschlüssel auf Spind. Der Wert 3 verbindet Fach 12 mit dem vorhandenen Spind 3.
Merke: Ein Schlüssel besteht aus Attributen. Der Primärschlüssel kennzeichnet eine Zeile eindeutig. Ein Fremdschlüssel verweist auf eine passende Zeile und darf in mehreren Datensätzen denselben Wert haben.
Teste dich
Eine Beziehung beschreibt, wie Datensätze verschiedener Tabellen zusammengehören. 1:N heißt Eins-zu-viele. Ein Datensatz der Eins-Seite kann mit mehreren Datensätzen der N-Seite verbunden sein. In unserem Abteilungsmodell gehört jeder Mitarbeiter genau zu einer Abteilung. Eine Abteilung kann mehrere Mitarbeiter haben.
Für eine 1:N-Beziehung übernimmst du den Primärschlüssel der Eins-Seite als Fremdschlüssel in die Tabelle der N-Seite. So steht AbteilungNr in Mitarbeiter. Dieselbe AbteilungNr darf dort mehrfach vorkommen. Eine Liste von Mitarbeiternummern in einer Zelle der Abteilungstabelle ist dafür nicht der passende Aufbau.
N:M heißt Viele-zu-viele. Beide Buchstaben stehen für mögliche Anzahlen, nicht für festgelegte Zahlen. Im Kursmodell kann ein Teilnehmer mehrere Kurse besuchen. Ein Kurs kann mehrere Teilnehmer haben. Die Schreibweisen 1:N und N:M legen allein noch nicht fest, ob eine Zuordnung verpflichtend ist.
Eine N:M-Beziehung erhält eine eigene Verbindungstabelle. Sie enthält die Schlüssel beider Seiten als Fremdschlüssel. Dadurch entstehen zwei 1:N-Beziehungen. Wenn jedes Paar höchstens einmal erfasst wird, können die beiden Fremdschlüssel gemeinsam den Primärschlüssel bilden. Jeder einzelne Wert darf sich wiederholen, die Kombination nicht.
Beispiel: Zwei Beziehungen als Tabellenentwurf
- 1Abteilung(AbteilungNr, Name); Primärschlüssel: AbteilungNr.
- 2Mitarbeiter(MitarbeiterNr, Name, AbteilungNr); Primärschlüssel: MitarbeiterNr. AbteilungNr verweist auf Abteilung.
- 3Damit steht der Fremdschlüssel bei 1:N in Mitarbeiter, also auf der N-Seite.
- 4Kurs(KursNr, Titel) und Teilnehmer(TeilnehmerNr, Name) haben jeweils ihre Nummer als Primärschlüssel.
- 5Besuch(TeilnehmerNr, KursNr) verbindet beide Tabellen. Beide Spalten sind Fremdschlüssel.
- 6Jeder Teilnehmer besucht jeden Kurs im Modell höchstens einmal. Deshalb ist (TeilnehmerNr, KursNr) der zusammengesetzte Primärschlüssel von Besuch.
- 7Ein Teilnehmer kann in mehreren Besuch-Zeilen stehen. Auch ein Kurs kann in mehreren Besuch-Zeilen stehen.
Merke: Bei 1:N steht der Fremdschlüssel auf der N-Seite. Bei N:M speichert eine Verbindungstabelle die einzelnen Zuordnungen. Ein Schlüssel aus beiden Nummern passt, wenn jedes Paar höchstens einmal vorkommt.
Teste dich
Referentielle Integrität bedeutet, dass Verweise zwischen Tabellen gültig bleiben. Für unsere Verweise auf Primärschlüssel gilt: Jeder eingetragene Fremdschlüsselwert muss zu einem vorhandenen Datensatz der Zieltabelle passen. Ein Verweis auf eine nicht vorhandene Nummer ist fehlerhaft.
Ein leerer Fremdschlüssel ist davon zu unterscheiden. Er kann zulässig sein, wenn die Beziehung freiwillig ist und der Entwurf einen fehlenden Wert erlaubt. Ist die Zuordnung verpflichtend, darf der Fremdschlüssel nicht leer bleiben. Ein leerer Wert ist keine erfundene Zielnummer.
Das Datenbanksystem muss die Prüfung durchsetzen. Wir betrachten hier ein Modell mit aktivierter Prüfung nach jedem abgeschlossenen Änderungsschritt. Ohne zusätzliche Weitergaberegel wird eine Änderung abgewiesen, wenn danach ein Verweis ohne Ziel übrig bliebe. Das betrifft etwa das Eintragen einer unbekannten Zielnummer oder das Löschen eines noch verwendeten Zieldatensatzes. Das System wählt dabei keinen anderen Zieldatensatz als Ersatz aus.
Zusätzlich eingerichtete Weitergaberegeln können das Verhalten ändern. Eine Änderungsweitergabe passt verweisende Fremdschlüssel an eine geänderte Zielnummer an. Eine Löschweitergabe entfernt zusammen mit dem Zieldatensatz auch die darauf verweisenden Datensätze. Solche Regeln sind zusätzliche Einstellungen; sie folgen nicht schon aus dem Vorhandensein eines Fremdschlüssels.
Referentielle Integrität
Jeder eingetragene Fremdschlüsselwert verweist auf einen vorhandenen passenden Datensatz. Ob ein fehlender Wert erlaubt ist, legt der Entwurf gesondert fest.
Beispiel: Karten werden Fächern zugeordnet
- 1Ablagefach(FachNr, Ort) hat genau die Datensätze mit FachNr 10 und FachNr 20. FachNr ist der Primärschlüssel.
- 2Karte(KartenNr, FachNr) hat den Primärschlüssel KartenNr. FachNr verweist auf Ablagefach und muss hier eingetragen sein.
- 3Eine neue Karte mit KartenNr 71 und FachNr 10 hat einen gültigen Verweis.
- 4Eine neue Karte mit KartenNr 72 und FachNr 99 hat keinen passenden Zieldatensatz.
- 5Bei aktivierter Prüfung wird das Einfügen der Karte mit FachNr 99 abgewiesen.
Merke: Prüfe den Fremdschlüssel in der Zieltabelle. Eine vorhandene Zielnummer macht den Verweis gültig. Ob Änderungen weitergegeben werden, musst du zusätzlich wissen.
Teste dich
Normalisierung ordnet Angaben passenden Tabellen zu. Sie verringert vermeidbare Mehrfachspeicherung und damit widersprüchliche Änderungen. Eine Normalform ist eine festgelegte Stufe dieser Ordnung. Du prüfst die Stufen nacheinander. Dabei sollen Angaben und ihre Zuordnungen erhalten bleiben. Normalisierung prüft aber nicht, ob du von Anfang an alle benötigten Angaben erfasst hast.
Du brauchst dafür feste Modellregeln. Eine funktionale Abhängigkeit bedeutet: Ein bestimmter Wert oder eine bestimmte Wertekombination legt einen anderen Wert eindeutig fest. Solche Regeln folgen aus der beschriebenen Aufgabe. Du darfst sie nicht aus wenigen zufällig passenden Beispielzeilen ableiten. Wir betrachten ein einfaches Modell, in dem die genannten Schlüssel jeweils die einzigen minimalen eindeutigen Spaltenkombinationen sind. Minimal heißt: Du kannst keine Schlüsselspalte weglassen, ohne die eindeutige Kennzeichnung zu verlieren.
Unser Werkstattplan erfasst ausschließlich Termine, bei denen mindestens ein Gerät genutzt wird. Ein Termin kann mehrere Geräte nutzen, ein Gerät kann bei mehreren Terminen vorkommen. Jedes Gerät wird je Termin höchstens einmal eingetragen. GerätNr legt Gerätename und RaumNr fest. Jedes Gerät ist im Modell fest einem Raum zugeordnet. RaumNr legt Raumname fest. Die Kombination aus TerminNr und GerätNr legt die Nutzungsdauer in Minuten fest. Gerätenamen und Raumnamen dürfen mehrfach vorkommen. Es gelten diese Abhängigkeiten und ihre Folgerungen, keine weiteren Eindeutigkeitsregeln.
Die erste Normalform verlangt für unseren Entwurf einen einzelnen Wert je Zelle statt einer Liste. Die Ausgangstabelle Plan(TerminNr, Geräteliste) enthält pro Termin eine Liste der genutzten Geräte samt Angaben. Du machst daraus je Kombination von Termin und Gerät eine Zeile. Es entsteht Nutzung(TerminNr, GerätNr, Gerätename, RaumNr, Raumname, Minuten). Der Primärschlüssel ist (TerminNr, GerätNr).
Die zweite Normalform setzt die erste voraus. In unserem Modell muss jede Nichtschlüsselspalte vom gesamten Schlüssel abhängen, nicht schon von einem Teil. Eine Nichtschlüsselspalte gehört nicht zum Primärschlüssel. Gerätename, RaumNr und Raumname stehen bereits durch GerätNr fest. Sie gehören daher in Gerät(GerätNr, Gerätename, RaumNr, Raumname). In Nutzung(TerminNr, GerätNr, Minuten) bleibt die Dauer, weil sie zur ganzen Kombination gehört. GerätNr wird dort Fremdschlüssel auf Gerät.
Die dritte Normalform setzt die zweite voraus. In unserem einfachen Modell soll keine Nichtschlüsselspalte über eine andere Nichtschlüsselspalte bestimmt werden. In Gerät legt RaumNr den Raumnamen fest. Deshalb lagerst du diese Zuordnung in Raum(RaumNr, Raumname) aus. Übrig bleibt Gerät(GerätNr, Gerätename, RaumNr), mit RaumNr als Fremdschlüssel. Die Endtabellen sind Nutzung, Gerät und Raum. Ihre Primärschlüssel sind die Kombination (TerminNr, GerätNr), GerätNr und RaumNr.
Beispiel: Ein Werkstattplan wird zerlegt
- 1Die erfundenen Kennungen T4 und T5 bezeichnen Termine, D1 und D2 Geräte, R2 einen Raum.
- 2Ausgang: Plan enthält für T4 eine Geräteliste mit D1, Bohrer, R2, Nordraum, 20 Minuten sowie D2, Säge, R2, Nordraum, 35 Minuten. Für T5 enthält die Liste D1, Bohrer, R2, Nordraum, 30 Minuten.
- 3Erste Normalform: In Nutzung entstehen drei Zeilen. Ihre Werte stehen in der Reihenfolge TerminNr, GerätNr, Gerätename, RaumNr, Raumname, Minuten.
- 4Die drei Zeilen lauten: (T4, D1, Bohrer, R2, Nordraum, 20); (T4, D2, Säge, R2, Nordraum, 35); (T5, D1, Bohrer, R2, Nordraum, 30). Jede Zelle enthält einen einzelnen Wert.
- 5Zweite Normalform: Nutzung enthält (T4, D1, 20), (T4, D2, 35) und (T5, D1, 30). Gerät enthält (D1, Bohrer, R2, Nordraum) und (D2, Säge, R2, Nordraum).
- 6Die Gerätedaten werden ausgelagert, weil sie bereits von GerätNr abhängen. Die Dauer bleibt bei der Kombination aus Termin und Gerät.
- 7Dritte Normalform: Gerät enthält nun (D1, Bohrer, R2) und (D2, Säge, R2). Raum enthält (R2, Nordraum). Nutzung bleibt unverändert.
- 8Der Raumname steht damit einmal zum Raum R2. Über die Fremdschlüssel lässt sich weiterhin feststellen, welches Gerät bei welchem Termin in welchem Raum genutzt wurde.
Merke: Erste Normalform: einzelne Werte statt Listen. Zweite Normalform: im beschriebenen Modell keine Abhängigkeit von einem Schlüsselteil. Dritte Normalform: zusätzlich keine Abhängigkeit über eine Nichtschlüsselspalte. Entscheidend sind die festgelegten Modellregeln.
Teste dich
Alles auf einen Blick
Relationale Datenbank
Eine Zeile ist ein Datensatz, eine benannte Spalte ein Attribut.
Der Primärschlüssel kennzeichnet eindeutig; der Fremdschlüssel verbindet passende Datensätze.
Bei 1:N liegt der Fremdschlüssel auf der N-Seite; N:M braucht eine Verbindungstabelle.
Ein eingetragener Fremdschlüsselwert braucht einen vorhandenen Zieldatensatz.
Feste Abhängigkeiten begründen die Zerlegung; zufällige Übungswerte reichen dafür nicht.
Normalisierung ordnet vorhandene Angaben, garantiert aber nicht deren Vollständigkeit.
Roboter und Parcours verbinden
- 1Im erfundenen Modell kann jeder Roboter mehrere Parcours durchfahren. Jeder Parcours kann von mehreren Robotern durchfahren werden. Ein Parcours ist hier eine festgelegte Fahrstrecke.
- 2Wir speichern je Paar aus Roboter und Parcours genau ein Endergebnis. Es enthält die erreichte Punktzahl. Wiederholte Versuche werden nicht einzeln erfasst.
- 3Lege Roboter(RoboterNr, Modellname) und Parcours(ParcoursNr, Name) an. Die jeweilige Nummer ist der Primärschlüssel.
- 4Ergänze Ergebnis(RoboterNr, ParcoursNr, Punkte). Beide Nummern sind Fremdschlüssel auf die zugehörigen Tabellen.
- 5Wähle (RoboterNr, ParcoursNr) als zusammengesetzten Primärschlüssel. Keine einzelne Nummer reicht, weil jeder Roboter mehrere Parcours und jeder Parcours mehrere Roboter haben kann.
- 6Existieren Roboter R2 und Parcours P6, kann die Ergebniszeile (R2, P6, 14) ihre Zuordnung mit 14 Punkten speichern. Damit wird die N:M-Beziehung durch zwei 1:N-Beziehungen abgebildet.
Fehler finden
Fehler in Zeile 3Der Fremdschlüssel wurde der falschen Tabelle zugeordnet. Aufzug ist die N-Seite. Richtig: Für diese Beziehung steht GebäudeNr als Fremdschlüssel in Aufzug.
Lückentext
In einer Tabelle sind alle MitgliedNr vergeben und verschieden, während Nachnamen mehrfach vorkommen. Als Primärschlüssel eignet sich hier . Jedes Paket gehört genau zu einer Lieferung, die mehrere Pakete enthalten kann. Als Fremdschlüssel steht LieferungNr daher in der Tabelle . Eine Tabelle erfüllt die erste Normalform und hat den einzigen minimalen Schlüssel (ReiseNr, StationNr). StationNr legt bereits Stationname fest. Stationname wird deshalb beim Schritt zur Normalform ausgelagert.