Einführung

Funktionale Abhängigkeiten bilden das theoretische Fundament für die Normalisierung von Relationenschemata und die Bestimmung von Primärschlüsseln. Relationen bestehen aus einer Menge von Attributen. Bestimmt der Wert eines bestimmten Attributs (oder einer Attributkombination) eindeutig den Wert eines anderen Attributs, liegt zwischen ihnen eine funktionale Abhängigkeit vor.

Funktionale Abhängigkeit

Anhand der folgenden Relation lässt sich erkennen, dass die Attribute Nachname und Vorname stets eindeutig mit der IdMitarbeiter verknüpft sind. In der Fachsprache sagt man: Die Attribute Nachname und Vorname sind funktional abhängig von IdMitarbeiter.

IdMitarbeiter Nachname Vorname
1 Krause Sabine
2 Schrotter Claudia
3 Hermann Markus
4 Krause Christoph
5 Bitter Manuel
6 Schulze Claudia

Wenn die `IdMitarbeiter` bekannt ist, lässt sich der Name der Person zweifelsfrei bestimmen. Die Umkehrung gilt jedoch nicht: Ist lediglich der Nachname bekannt (z. B. Krause), lässt sich die `IdMitarbeiter` nicht eindeutig ermitteln, da es mehrere Mitarbeiter mit diesem Nachnamen geben kann.

Der Begriff leitet sich aus der Mathematik ab: Eine mathematische Funktion ordnet jedem Eingabewert exakt einen definierten Ausgabewert zu. Die Funktion [math]\displaystyle{ y = 3 \cdot x }[/math] liefert für [math]\displaystyle{ x = 4 }[/math] immer das Ergebnis [math]\displaystyle{ 12 }[/math]. Der Wert [math]\displaystyle{ y }[/math] ist somit abhängig vom Wert [math]\displaystyle{ x }[/math] (bzw. [math]\displaystyle{ x }[/math] bestimmt [math]\displaystyle{ y }[/math]).

In der Relationenalgebra spricht man hierbei von einer Determinante (Bestimmer) und notiert dies mit einem Pfeil: [math]\displaystyle{ X \rightarrow Y }[/math]

Für die beschriebene Datenbank-Abhängigkeit schreibt man formal: [math]\displaystyle{ \text{IdMitarbeiter} \rightarrow \text{Nachname}, \text{Vorname} }[/math]

> Wichtig: Eine funktionale Abhängigkeit ist nur dann gültig, wenn sie für alle möglichen, fachlich zulässigen Tupel (Datensätze) der Relation gilt, nicht nur für den aktuell gespeicherten Zustand.

Volle funktionale Abhängigkeit

Von einer vollen funktionalen Abhängigkeit spricht man, wenn ein Nichtschlüssel-Attribut zwingend vom gesamten Primärschlüssel abhängig ist und nicht schon durch eine Teilmenge des Schlüssels bestimmt werden kann. Dies ist insbesondere bei zusammengesetzten Schlüsseln relevant.

Angenommen, der Primärschlüssel der obigen Relation bestünde aus der Kombination von `IdMitarbeiter` und `Nachname`. Es gälte formal: [math]\displaystyle{ (\text{IdMitarbeiter}, \text{Nachname}) \rightarrow \text{Vorname} }[/math] (Der Vorname ist funktional abhängig von der Kombination aus ID und Nachname).

Prüft man dies genauer, stellt man fest, dass das Attribut `Nachname` für die Bestimmung des Vornamens überflüssig ist. Das Attribut `IdMitarbeiter` reicht bereits völlig aus, um den Vornamen eindeutig zu ermitteln.

Da das Nichtschlüssel-Attribut `Vorname` bereits durch einen Teil des Primärschlüssels (`IdMitarbeiter`) bestimmbar ist, ist `Vorname` nicht voll funktional abhängig vom zusammengesetzten Schlüssel. Eine volle funktionale Abhängigkeit läge nur dann vor, wenn zur Bestimmung zwingend beide Attribute des Schlüssels benötigt würden.

Transitive Abhängigkeit

Eine transitive Abhängigkeit liegt vor, wenn eine Abhängigkeit "über eine Zwischenstation" besteht.

Gegeben sei eine Relation [math]\displaystyle{ R }[/math] mit den Attributen [math]\displaystyle{ A }[/math], [math]\displaystyle{ B }[/math] und [math]\displaystyle{ C }[/math].

  • [math]\displaystyle{ A }[/math] ist der Primärschlüssel.
  • [math]\displaystyle{ A }[/math] bestimmt [math]\displaystyle{ B }[/math] ([math]\displaystyle{ A \rightarrow B }[/math]).
  • [math]\displaystyle{ B }[/math] ist kein Bestandteil des Primärschlüssels.
  • Dennoch bestimmt [math]\displaystyle{ B }[/math] eindeutig [math]\displaystyle{ C }[/math] ([math]\displaystyle{ B \rightarrow C }[/math]).

In diesem Fall ist [math]\displaystyle{ C }[/math] zwar funktional von [math]\displaystyle{ A }[/math] abhängig, aber eben nur transitiv (indirekt) über das Attribut [math]\displaystyle{ B }[/math].

Beispiel aus der Praxis: Mit Hilfe des Primärschlüssels `IdMitarbeiter` lässt sich eindeutig die ID des Salons (`IdSalon`) bestimmen, in dem der Mitarbeiter arbeitet. Der Klarname des Salons (`Salonname`) hängt jedoch funktional direkt von der `IdSalon` ab. Somit ist der `Salonname` nur transitiv von der `IdMitarbeiter` abhängig.

Um solche Schemata zu optimieren und in die 3. Normalform (3NF) zu überführen, müssen Attribute mit transitiven Abhängigkeiten (wie die Saloninformationen) in eigene Relationen ausgelagert werden.