Aufbau einer relationalen Datenbank
Fast alle Datenbanken, die du im Alltag benutzt, sind relational. Das klingt komplizierter, als es ist: Eine relationale Datenbank besteht aus Tabellen, und die Tabellen sind über gemeinsame Werte miteinander verknüpft.
Die Fachbegriffe
Sieh dir diese Tabelle an:
| buehne_id | name | kapazitaet | ueberdacht |
|---|---|---|---|
| 1 | Hauptbuehne | 8000 | 0 |
| 2 | Waldbuehne | 2500 | 1 |
| 3 | Zeltbuehne | 1200 | 1 |
| 4 | Seebuehne | 600 | 0 |
| Alltagswort | Fachbegriff | Bedeutung |
|---|---|---|
| Tabelle | Relation | eine Menge gleichartiger Datensätze |
| Zeile | Tupel oder Datensatz | ein einzelnes Objekt, hier: eine Bühne |
| Spalte | Attribut | eine Eigenschaft, die alle Objekte haben |
| erlaubte Werte einer Spalte | Wertebereich (Domäne) | z. B. „ganze Zahl" oder „Text bis 40 Zeichen" |
| Zelle | Attributwert | ein einzelner Wert |
Zwei Regeln machen aus einer beliebigen Tabelle eine Relation:
- Jeder Attributwert ist atomar. In einer Zelle steht genau ein Wert, keine Liste. Ein Feld mit
Indie, Rockverstößt dagegen. - Die Reihenfolge der Zeilen ist bedeutungslos. Eine Relation ist eine Menge von Tupeln. Wenn du eine bestimmte Reihenfolge brauchst, musst du sie bei der Abfrage anfordern.
Aus 2. folgt etwas Wichtiges: Man kann eine Zeile nicht über ihre Position ansprechen („die dritte Zeile"), sondern nur über ihre Werte.
Das Schema
Wie eine Tabelle gebaut ist, beschreibt man kurz so:
buehne(buehne_id, name, kapazitaet, ueberdacht)
Das Relationenschema nennt den Namen der Relation und ihre Attribute. Der Schlüssel wird unterstrichen oder – wenn das nicht geht – vorangestellt.
Alle Relationenschemata einer Datenbank zusammen bilden das Datenbankschema. Das Schema beschreibt den Aufbau; die tatsächlich gespeicherten Tupel heißen Ausprägung.
Der Unterschied ist derselbe wie zwischen einem Formular und einem ausgefüllten Formular. Das Schema ändert sich selten, die Ausprägung ständig.
Schlüssel
Wenn man Zeilen nicht über ihre Position ansprechen kann – wie dann?
Ein Schlüssel ist eine Attributmenge, deren Werte jedes Tupel einer Relation eindeutig bestimmen. Zu einem Schlüsselwert gehört also immer höchstens ein Tupel.
- Jede Attributmenge, die das leistet und aus der man kein Attribut mehr weglassen kann, heißt Schlüsselkandidat.
- Einen der Schlüsselkandidaten wählt man aus; er heißt Primärschlüssel.
In der Tabelle buehne sind buehne_id und name beides Schlüsselkandidaten – beide Werte kommen jeweils nur einmal vor. Gewählt wurde buehne_id.
Warum nimmt man in der Praxis fast immer eine künstliche Nummer als Primärschlüssel und nicht den Namen?
Weil Namen sich ändern. Wird aus der Waldbühne die Lichtungsbühne, müsste man jeden Verweis auf sie anfassen. Eine Nummer ohne Bedeutung ändert sich nie. Man nennt sie künstlicher Schlüssel (Surrogatschlüssel).
Hier ist die Tabelle person der Festivaldatenbank. Sieh sie dir an und entscheide für jede der folgenden Attributmengen, ob sie ein Schlüsselkandidat ist:
a) nachname
b) vorname, nachname
c) person_id
d) person_id, nachname
Tipp 1: Wie prüfe ich das?
Suche nach zwei Zeilen, die im fraglichen Attribut denselben Wert haben. Findest du zwei, ist es kein Schlüssel.
Tipp 2: Vorsicht bei d)
Ein Schlüsselkandidat darf nicht mehr Attribute enthalten als nötig. Frage dich: Wird nachname überhaupt gebraucht, wenn person_id schon dabei ist?
Fremdschlüssel
Die Tabellen stehen nicht für sich. Sieh dir an, wie auftritt auf buehne verweist:
In auftritt.buehne_id stehen dieselben Zahlen wie in buehne.buehne_id. So wird die Verbindung hergestellt.
Ein Fremdschlüssel ist ein Attribut (oder eine Attributmenge) einer Relation, das auf den Primärschlüssel einer anderen Relation verweist.
Das Datenbanksystem sorgt dafür, dass jeder Fremdschlüsselwert dort auch wirklich vorkommt. Diese Bedingung heißt referenzielle Integrität.
Probiere aus, was passiert, wenn man dagegen verstößt:
Führe die Anweisung aus und lies die Meldung im Reiter Ausgabe.
a) Wie lautet sie?
b) Ändere die 99 in eine gültige Bühnennummer und führe die Anweisung erneut aus. Prüfe mit einer eigenen Abfrage, ob der Auftritt jetzt in der Tabelle steht.
c) Erkläre, warum ein Datenbanksystem so etwas überhaupt überwacht. Was wäre die Alternative?