Funktionale Abhängigkeiten
Bevor man eine Tabelle zerlegen kann, muss man wissen, welche Angabe von welcher abhängt. Genau das beschreibt eine funktionale Abhängigkeit.
Die Ausgangstabelle
Wir arbeiten mit der unnormalisierten Auftrittsliste aus Kapitel 1:
Ihr Schema:
auftrittsliste(band, herkunftsland, genres, buehne, buehnen_kapazitaet, datum, beginn, dauer_min)
Der Begriff
Ein Attribut B ist funktional abhängig von einer Attributmenge A, wenn zu jedem Wert von A höchstens ein Wert von B gehört.
Man schreibt A → B und sagt: „A bestimmt B."
Die Betonung liegt auf höchstens einem: Wenn ich A kenne, kenne ich B – ohne nachsehen zu müssen, um welche Zeile es geht.
In der Auftrittsliste gilt band → herkunftsland.
Prüfen kann man das so: Suche zwei Zeilen mit demselben Bandnamen und verschiedenem Herkunftsland. Findest du keine – und kann es aus inhaltlichen Gründen keine geben –, gilt die Abhängigkeit.
Umgekehrt gilt herkunftsland → band nicht: Zu Deutschland gehören 15 verschiedene Bands.
Beide Abfragen liefern kein Ergebnis. Das ist ein Hinweis darauf, dass die Abhängigkeiten gelten – aber kein Beweis.
Eine funktionale Abhängigkeit ist eine Aussage über alle möglichen Daten, nicht über die gerade vorhandenen. Die Daten können sie widerlegen (ein Gegenbeispiel genügt), aber nie beweisen. Begründen muss man sie inhaltlich: Eine Band hat nun einmal genau ein Herkunftsland.
Abhängigkeiten von zusammengesetzten Attributmengen
Links vom Pfeil dürfen mehrere Attribute stehen.
a) Was bestimmt in der Auftrittsliste eine einzelne Zeile eindeutig? Anders gefragt: Welche Attributmenge ist ein Schlüsselkandidat?
b) Prüfe deinen Vorschlag mit einer Abfrage.
c) Schreibe alle funktionalen Abhängigkeiten auf, die du in der Tabelle findest.
Tipp 1: Womit fange ich an?
Eine Zeile beschreibt einen Auftritt. Was macht einen Auftritt eindeutig? Nicht die Band allein – manche treten mehrfach auf. Nicht der Zeitpunkt allein – gleichzeitig laufen mehrere Auftritte.
Tipp 2: So prüfst du einen Schlüsselkandidaten
SELECT a, b, c, COUNT(*)
FROM auftrittsliste
GROUP BY a, b, c
HAVING COUNT(*) > 1;
Liefert das nichts, kommt keine Kombination doppelt vor.
Volle und partielle Abhängigkeit
Ist eine Attributmenge A zusammengesetzt, unterscheidet man:
- B ist voll funktional abhängig von A, wenn B von A abhängt, aber von keiner echten Teilmenge von A.
- B ist partiell abhängig von A, wenn schon ein Teil von A ausreicht, um B zu bestimmen.
Der Primärschlüssel ist band, datum, beginn.
dauer_minist voll abhängig: Man braucht alle drei Angaben. Weder die Band allein noch das Datum allein legt die Dauer fest.herkunftslandist partiell abhängig: Schonbandallein genügt. Die anderen beiden Schlüsselteile sind überflüssig.
Diese Unterscheidung ist der Kern der 2. Normalform.
Ordne jedes Attribut der Auftrittsliste ein: voll oder partiell abhängig vom Primärschlüssel band, datum, beginn?
herkunftsland, genres, buehne, buehnen_kapazitaet, dauer_min
Die drei Fälle im Überblick
| Fall | Muster | Wird beseitigt durch |
|---|---|---|
| Mehrere Werte in einer Zelle | genres = 'Indie, Rock' |
1. Normalform |
| Partielle Abhängigkeit vom Schlüssel | band → herkunftsland |
2. Normalform |
| Transitive Abhängigkeit über ein Nichtschlüsselattribut | buehne → buehnen_kapazitaet |
3. Normalform |
Die Auftrittsliste enthält alle drei – deshalb eignet sie sich so gut zum Üben.