Zum Hauptinhalt springen

Funktionale Abhängigkeiten und Normalisierung

Nach der Überführung eines ER-Modells in Relationen stellt sich die Frage: Sind diese Relationen gut strukturiert? Speichern sie Daten redundant? Drohen beim Ändern, Einfügen oder Löschen Inkonsistenzen?

Dieser Abschnitt führt drei aufeinander aufbauende Konzepte ein: Anomalien als Probleme schlecht strukturierter Datenbanken, funktionale Abhängigkeiten als formales Werkzeug zur Analyse, und Normalisierung als systematisches Verfahren zur Optimierung.

Anomalien

Bevor die Normalisierung formal eingeführt wird, lohnt ein Blick auf die konkreten Probleme, die in unzureichend strukturierten Relationen entstehen. Diese Probleme heißen Anomalien und entspringen alle derselben Ursache: Redundanz — also dieselbe Information, mehrfach gespeichert.

Folgende, bewusst schlecht entworfene Relation einer Schulbibliothek dient als Ausgangspunkt. Schnell fällt auf: Buchdaten (Titel, Autor, Standort) und Schülerdaten (Name, Klasse) tauchen mehrfach auf. Genau diese Vermischung verursacht die drei klassischen Anomalien.

Untersuche in der interaktiven Demo die drei verschiedenen Anomalien:

Das Buch „1984" soll in einen anderen Raum (205) aufbewahrt werden. Was passiert, wenn nicht alle betroffenen Zeilen synchron geändert werden.

Bibliothek_schlecht
BuchIDTitelAutorStandortSchuelerIDSchuelerNameKlasse
B0011984OrwellRaum 203S123Anna Schmidt10a
B0011984OrwellRaum 203S456Max Müller10b
B002Harry PotterRowlingRaum 204S123Anna Schmidt10a
B003Der ProzessKafkaRaum 203NULLNULLNULL
Wähle aus, wie viele Zeilen geändert werden:
Hinweis: Das Buch B001 kommt in zwei Zeilen vor — die Information „Standort" ist redundant gespeichert.

Update-Anomalie

Wird das Buch 1984 von Raum 203 nach Raum 205 verlegt, müssen alle Zeilen mit B001 geändert werden. Wird auch nur eine vergessen, steht das Buch laut Datenbank gleichzeitig in zwei Räumen — ein Widerspruch, den die Datenbank selbst nicht auflösen kann.

Einfüge-Anomalie

Ein neues Buch Faust (B004) soll in die Bibliothek aufgenommen werden, ist aber noch nicht ausgeliehen. Die Tabellenstruktur erzwingt jedoch Werte für SchuelerID, SchuelerName und Klasse. Drei Auswege bleiben — keiner überzeugt:

  • NULL-Werte (verfälschen Auswertungen),
  • Dummy-Werte (verfälschen die Daten),
  • gar kein Eintrag (die Bibliothek "kennt" das Buch nicht).

Lösch-Anomalie

Gibt Max Müller (S456) sein einziges ausgeliehenes Buch zurück und wird die zugehörige Zeile gelöscht, verschwindet mit der Ausleihinformation auch Max Müller selbst: Die Schule weiß nicht mehr, dass er existiert oder in welche Klasse er geht.

Gemeinsame Ursache

AnomalieSymptom
UpdateInkonsistenzen bei Änderungen
EinfügenNeue Daten nicht ohne Krücken speicherbar
LöschenUnbeabsichtigter Verlust unabhängiger Daten

Alle drei Anomalien wurzeln darin, dass mehrere unabhängige Konzepte (Buch, Schüler, Ausleihe) in derselben Tabelle vermischt werden. Das systematische Werkzeug, um solche Vermischungen zu erkennen, sind funktionale Abhängigkeiten.

Training — Anomalien erkennen

Gegeben sei folgendes nicht-normalisiertes Relationenschema:

Bestellung(Kunden_ID, Kunde_Name, Kunde_Adresse, Artikel_Name, Artikel_Preis, Lieferant, Lieferant_Telefon, Menge, Datum)

  1. Erkläre an einem eigenen Beispiel, wie eine Update-Anomalie entstehen kann.
  2. Beschreibe eine Situation, in der eine Einfüge-Anomalie das Speichern wichtiger Informationen verhindert.
  3. Konstruiere einen Fall, in dem das Löschen eines einzelnen Tupels zu einer Lösch-Anomalie führt.

Funktionale Abhängigkeiten

Definition

Sei eine Relation mit Attributmenge , und seien Attributteilmengen. Eine funktionale Abhängigkeit liegt vor, wenn für alle Tupel in gilt:

In Worten: Stimmen zwei Tupel in den Werten von überein, dann zwangsläufig auch in den Werten von . Die Werte von legen die von eindeutig fest.

Einzelne und zusammengesetzte Determinanten

Oft bestimmt schon ein einzelnes Attribut weitere Werte (einfache Determinante):

Schüler(SchuelerID, Name, Geburtsdatum, Klasse, Klassenlehrer)

mit den Abhängigkeiten

  • SchuelerIDName, Geburtsdatum, Klasse
  • KlasseKlassenlehrer
Schüler
SchuelerIDNameGeburtsdatumKlasseKlassenlehrer
S001Anna Schmidt2008-04-1210aFrau Meyer
S002Max Müller2008-09-0310aFrau Meyer
S003Lisa Weber2007-11-2110bHerr Schmidt
S004Tom Koch2008-02-0810bHerr Schmidt

Konkret in der Tabelle ablesbar: Die Zeilen S001 und S002 stimmen in Klasse überein (beide 10a) und tragen folglich denselben Klassenlehrer (Frau Meyer). Genauso bei S003 und S004: gleiche Klasse 10b, gleicher Klassenlehrer Herr Schmidt. Das ist KlasseKlassenlehrer.

In anderen Fällen genügt ein einzelnes Attribut nicht — erst die Kombination mehrerer Attribute bestimmt einen Wert eindeutig (zusammengesetzte Determinante):

Prüfung(SchuelerID, FachID, Datum, Note, Punktzahl)

Prüfung
SchuelerIDFachIDDatumNotePunktzahl
S001MAT2024-03-151.713
S001MAT2024-06-202.311
S001DEU2024-03-152.012
S002MAT2024-03-152.79

In der Tabelle lassen sich alle „kleineren" Determinanten ausschließen:

  • SchuelerID allein reicht nicht — Anna (S001) hat drei verschiedene Noten.
  • FachID allein reicht nicht — in MAT stehen drei unterschiedliche Noten (1.7, 2.3, 2.7).
  • {SchuelerID, FachID} reicht nicht — Anna hat in MAT zweimal geschrieben (1.7 am 15.03., 2.3 am 20.06.).
  • {SchuelerID, Datum} reicht nicht — Anna hat am 15.03.2024 sowohl in MAT (1.7) als auch in DEU (2.0) eine Note bekommen.
  • {FachID, Datum} reicht nicht — am 15.03.2024 schrieben in MAT zwei Schüler (Anna 1.7, Max 2.7).

Erst die volle Kombination {SchuelerID, FachID, Datum}Note bestimmt die Note eindeutig.

Volle vs. partielle Abhängigkeit

Ein Attribut ist voll funktional abhängig von , wenn gilt und keine echte Teilmenge von schon bestimmt. Andernfalls liegt eine partielle Abhängigkeit vor.

In der Prüfungsrelation oben ist Note voll abhängig von {SchuelerID, FachID, Datum}. Eine vereinfachte Variante mit Zwei-Attribut-Schlüssel und ergänztem SchuelerName zeigt dagegen ein Problem:

Prüfung_schlecht(SchuelerID, FachID, SchuelerName, Note)

Prüfung_schlecht
SchuelerIDFachIDSchuelerNameNote
S001MATAnna Schmidt1.7
S001DEUAnna Schmidt2.0
S002MATMax Müller2.7
S002DEUMax Müller1.3

In der Tabelle direkt sichtbar: Annas Name steht in jeder ihrer Prüfungszeilen erneut. SchuelerName hängt nur von SchuelerID ab — FachID ist überflüssig. Das ist eine partielle Abhängigkeit und führt direkt zu Redundanz.

Transitive Abhängigkeit

Wenn und gelten, aber kein Schlüsselattribut ist, dann ist transitiv abhängig von .

In einer reduzierten Schüler-Relation, die nur Klasseninfo trägt:

Schüler(SchuelerID, Klasse, Klassenlehrer)

Schüler
SchuelerIDKlasseKlassenlehrer
S00110aFrau Meyer
S00210aFrau Meyer
S00310bHerr Schmidt
S00410bHerr Schmidt

Der Klassenlehrer hängt eigentlich an der Klasse, nicht am Schüler — Frau Meyer taucht zweimal auf (für jede 10a-Schülerzeile), Herr Schmidt ebenfalls. Über den Umweg Klasse ergibt sich eine indirekte Abhängigkeit von SchuelerID. Folge: Wechselt die 10a den Klassenlehrer, müssen sämtliche Schülerzeilen der 10a nachgezogen werden.

Übersicht

TypBedeutungBeispiel
Funktionale AbhängigkeitSchuelerIDName
Volle funktionale Abhängigkeit braucht alle Attribute aus {SchuelerID, FachID}Note
Partielle Abhängigkeit hängt schon von einer echten Teilmenge von ab{SchuelerID, FachID}SchuelerName
Transitive Abhängigkeit, kein SchlüsselSchuelerIDKlasseKlassenlehrer
Training — Funktionale Abhängigkeiten

Gegeben sei die Relation

Reservierung(RaumID, Tag, Stunde, LehrerID, Fach, Klasse)

mit den Annahmen, dass jeder Raum zu jeder Stunde an jedem Tag von höchstens einem Lehrer für genau eine Klasse in einem Fach genutzt wird.

  1. Liste alle funktionalen Abhängigkeiten auf.
  2. Welche davon sind voll funktional, welche partiell?
  3. Gibt es transitive Abhängigkeiten? Begründe.

Normalisierung

Normalisierung ist ein schrittweises Verfahren, das Relationen so umformt, dass Redundanzen verschwinden und Anomalien strukturell ausgeschlossen sind. Die Normalformen 1NF, 2NF, 3NF und BCNF bauen aufeinander auf — jede strenger als die vorhergehende.

Erste Normalform (1NF)

Eine Relation ist in 1NF, wenn alle Attributwerte atomar sind — also nicht weiter zerlegbar.

Folgende Relation verletzt die 1NF, weil das Attribut Hobbys mehrere Werte enthält:

Schüler_alt
SchuelerIDNameHobbys
S001Anna SchmidtTennis, Lesen, Schwimmen
S002Max MüllerFußball, Gitarre

Die saubere Lösung lagert die mehrwertige Eigenschaft in eine eigene Relation aus:

Schüler
SchuelerIDName
S001Anna Schmidt
S002Max Müller
Hobby
SchuelerIDHobby
S001Tennis
S001Lesen
S001Schwimmen
S002Fußball
S002Gitarre

Zweite Normalform (2NF)

Eine Relation ist in 2NF, wenn sie in 1NF ist und jedes Nichtschlüsselattribut voll funktional abhängig vom gesamten Primärschlüssel ist — also keine partiellen Abhängigkeiten existieren.

Folgende Prüfungsrelation hat den zusammengesetzten Schlüssel {SchuelerID, FachID}:

Prüfung
SchuelerIDFachIDSchuelerNameFachnameNote
S001MATAnna SchmidtMathematik1.7
S001DEUAnna SchmidtDeutsch2.3
S002MATMax MüllerMathematik2.0

SchuelerName hängt nur von SchuelerID ab, Fachname nur von FachID — beides sind partielle Abhängigkeiten. Die 2NF stellt sie ab, indem sie diese Attribute in eigene Relationen auslagert:

Schüler
SchuelerIDSchuelerName
S001Anna Schmidt
S002Max Müller
Fach
FachIDFachname
MATMathematik
DEUDeutsch
Prüfung
SchuelerIDFachIDNote
S001MAT1.7
S001DEU2.3
S002MAT2.0

Dritte Normalform (3NF)

Eine Relation ist in 3NF, wenn sie in 2NF ist und kein Nichtschlüsselattribut transitiv vom Primärschlüssel abhängt.

Schüler
SchuelerIDNameKlasseKlassenlehrerRaum
S001Anna Schmidt10aFrau MeyerA201
S002Max Müller10aFrau MeyerA201
S003Lisa Weber10bHerr SchmidtA202

Hier gilt KlasseKlassenlehrer und KlasseRaum zwischen Nichtschlüsselattributen. Klassenlehrer und Raum werden für jeden Schüler einer Klasse erneut gespeichert — Redundanz. Die Auflösung trennt den Klassenkontext in eine eigene Relation ab:

Schüler
SchuelerIDNameKlasse
S001Anna Schmidt10a
S002Max Müller10a
S003Lisa Weber10b
Klasse
KlassennameKlassenlehrerRaum
10aFrau MeyerA201
10bHerr SchmidtA202

Boyce-Codd-Normalform (BCNF)

Eine Relation ist in BCNF, wenn sie in 3NF ist und für jede nichttriviale funktionale Abhängigkeit gilt: ist ein Superschlüssel (eine Attributmenge, die alle Tupel eindeutig identifiziert).

Beispiel mit den Annahmen "Ein Schüler kann mehrere Kurse belegen, ein Kurs kann von mehreren Lehrern unterrichtet werden, aber jeder Lehrer unterrichtet höchstens einen Kurs":

Kursanmeldung
SchuelerIDKursLehrer
S001InformatikHerr Weber
S002InformatikHerr Weber
S003InformatikFrau Klein
S004MathematikFrau Meyer

Die Abhängigkeit LehrerKurs verletzt die BCNF, weil Lehrer kein Superschlüssel ist. Die Auflösung:

Anmeldung
SchuelerIDLehrer
S001Herr Weber
S002Herr Weber
S003Frau Klein
S004Frau Meyer
Lehrer_Kurs
LehrerKurs
Herr WeberInformatik
Frau KleinInformatik
Frau MeyerMathematik

Übersicht der Normalformen

NFBedingung (zusätzlich zur Vorgängerstufe)
1NFatomare Attributwerte
2NFkeine partiellen Abhängigkeiten vom Primärschlüssel
3NFkein Nichtschlüsselattribut ist transitiv vom Primärschlüssel abhängig
BCNFjede Determinante ist Superschlüssel

In der Praxis ist die 3NF ein guter Kompromiss zwischen Redundanzfreiheit und Performance. BCNF wird selten zwingend benötigt, ist aber konzeptionell wichtig.

Praktisches Vorgehen

Beim Normalisieren einer gegebenen Relation hilft folgender Ablauf:

  1. Funktionale Abhängigkeiten identifizieren. Welche Attribute bestimmen welche?
  2. Primärschlüssel bestimmen. Welche Attributkombination identifiziert jedes Tupel eindeutig?
  3. 1NF prüfen. Sind alle Werte atomar? Falls nein: Mehrwertige Attribute auslagern.
  4. 2NF prüfen (nur bei zusammengesetztem Schlüssel). Partielle Abhängigkeiten? Falls ja: in eigene Relationen auslagern.
  5. 3NF prüfen. Transitive Abhängigkeiten? Falls ja: Zwischenstufen auslagern.
  6. BCNF prüfen (optional). Sind alle Determinanten Superschlüssel?
Training — Normalisierung

Gegeben sei folgende Relation einer Schulbibliothek. Die AusleihID wird pro Buch fortlaufend vergeben — derselbe AusleihID-Wert kann also bei verschiedenen Büchern erneut auftauchen, weshalb erst die Kombination aus BuchID und AusleihID einen Ausleihvorgang eindeutig identifiziert.

Bibliothek(BuchID, AusleihID, Buchtitel, Autor, ISBN, SchuelerID, SchuelerName, Klasse, Ausleihdatum, Rückgabedatum)

mit den funktionalen Abhängigkeiten:

  • BuchIDBuchtitel, Autor, ISBN
  • ISBNBuchtitel, Autor
  • SchuelerIDSchuelerName, Klasse
  • {BuchID, AusleihID}SchuelerID, Ausleihdatum, Rückgabedatum
  1. In welcher Normalform ist die Relation? Begründe.
  2. Überführe die Relation schrittweise in 3NF und gib das resultierende Relationenschema an.
  3. Skizziere ein passendes ER-Diagramm zur normalisierten Lösung.