Funktionale Abhängigkeit: Unterschied zwischen den Versionen

Die Seite wurde neu angelegt: „== Einführung == '''Funktionale Abhängigkeiten''' bilden die Grundlage für die Normalisierung von Relationenschemata und die Bestimmung von Primärschlüsseln. Relationen werden durch Attribute definiert. Bestimmen einige dieser Attribute eindeutig die Werte anderer Attribute, so spricht man von funktionaler Abhängigkeit. == Funktionale Abhängigkeit == Betrachtet man folgende Relation, wird man festste…“
 
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
== Einführung ==
== Einführung ==
'''Funktionale Abhängigkeiten''' bilden die Grundlage für die [[Normalisierung]] von Relationenschemata und die Bestimmung von [[Primärschlüssel]]n. [[Relation (Datenbanken)|Relationen]] werden durch [[Attribut|Attribute]] definiert. Bestimmen einige dieser Attribute eindeutig die Werte anderer Attribute, so spricht man von funktionaler Abhängigkeit.
'''Funktionale Abhängigkeiten''' bilden das theoretische Fundament für die [[Normalisierung]] von Relationenschemata und die Bestimmung von [[Primärschlüssel]]n. [[Relation (Datenbanken)|Relationen]] bestehen aus einer Menge von [[Attribut|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 ==
== Funktionale Abhängigkeit ==
Betrachtet man folgende Relation, wird man feststellen, dass die Attribute ''Nachname'' und ''Vorname'' abhängig sind von der ''IdMitarbeiter''. Man sagt in diesem Zusammenhang, die Attribute Nachname und Vorname sind funktional abhängig von der IdMitarbeiter.
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.


{| class="wikitable"
{| class="wikitable"
Zeile 21: Zeile 21:
|}
|}


Wenn man also die `IdMitarbeiter` kennt, kann man auch den Namen des Mitarbeiters benennen. Andersherum ist der Schluss nicht möglich: Ist der Nachname bekannt (z. B. Krause), lässt sich die `IdMitarbeiter` nicht eindeutig bestimmen.
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.


In Anlehnung an die Mathematik wird hier von der funktionalen Abhängigkeit gesprochen, da eine mathematische Funktion immer den gleichen Ausgabewert bei gleichen Eingabewerten liefert. Die Funktion \({ y = 3 \cdot x }\) liefert für \({ x = 4 }\) immer die Ausgabe \(12\) für die Variable \(y\). Für jede beliebige Zahl, die man für die Variable \(x\) einsetzt, ergibt sich also ein ganz bestimmter Wert für \(y\). Man kann sagen, dass der Wert \(y\) abhängig ist vom Wert \(x\) bzw. \(x\) bestimmt \(y\).  
Der Begriff leitet sich aus der Mathematik ab: Eine mathematische Funktion ordnet jedem Eingabewert exakt einen definierten Ausgabewert zu. Die Funktion <math>y = 3 \cdot x</math> liefert für <math>x = 4</math> immer das Ergebnis <math>12</math>. Der Wert <math>y</math> ist somit abhängig vom Wert <math>x</math> (bzw. <math>x</math> bestimmt <math>y</math>).  


Mathematisch spricht man auch von einer '''Determinante''' und schreibt:  
In der Relationenalgebra spricht man hierbei von einer '''Determinante''' (Bestimmer) und notiert dies mit einem Pfeil:  
\({ x \rightarrow y }\)
<math>X \rightarrow Y</math>


Analog schreibt man also für die besprochene funktionale Abhängigkeit der Attribute:  
Für die beschriebene Datenbank-Abhängigkeit schreibt man formal:  
\({ \text{IdMitarbeiter} \rightarrow \text{Nachname}, \text{Vorname} }\)
<math>\text{IdMitarbeiter} \rightarrow \text{Nachname}, \text{Vorname}</math>


> '''Wichtig:''' Die funktionale Abhängigkeit muss für alle möglichen bzw. denkbaren Tupel (Datensätze) einer Relation gelten.
> '''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 ==
== Volle funktionale Abhängigkeit ==
Man spricht von '''voller funktionaler Abhängigkeit''', wenn jedes Nichtschlüssel-Attribut nur durch den ''gesamten'' Primärschlüssel eindeutig bestimmt werden kann.
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.


Nehmen wir an, der zusammengesetzte Primärschlüssel der obigen Relation würde sich aus den Attributen `IdMitarbeiter` und `Nachname` zusammensetzen. Es gälte also:
Angenommen, der Primärschlüssel der obigen Relation bestünde aus der Kombination von `IdMitarbeiter` und `Nachname`. Es gälte formal:
\({ (\text{IdMitarbeiter}, \text{Nachname}) \rightarrow \text{Vorname} }\)
<math>(\text{IdMitarbeiter}, \text{Nachname}) \rightarrow \text{Vorname}</math>
(Vorname ist funktional von IdMitarbeiter und Nachname abhängig.)
(Der Vorname ist funktional abhängig von der Kombination aus ID und Nachname).


Allerdings ist der Vorname nicht vom Nachnamen funktional abhängig. Der Vorname „Claudia“ gilt sowohl für Schulze als auch für Schrotter. Das Attribut `IdMitarbeiter` bestimmt aber nach wie vor alleine und eindeutig das Attribut `Vorname`. Auf das Attribut `Nachname` kann also im Schlüssel verzichtet werden.  
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` auch durch einen Teil des Primärschlüssels – nämlich `IdMitarbeiter` bestimmbar ist, ist `Vorname` '''nicht voll funktional abhängig''' von der Kombination aus IdMitarbeiter und Nachname. Die volle funktionale Abhängigkeit würde hier nur für das isolierte Attribut `IdMitarbeiter` gelten.
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 ==
== Transitive Abhängigkeit ==
Angenommen, wir haben eine Relation \(R\) mit den Attributen \(A\), \(B\) und \(C\).
Eine '''transitive Abhängigkeit''' liegt vor, wenn eine Abhängigkeit "über eine Zwischenstation" besteht.  
* \(A\) ist der Primärschlüssel.
* \(A\) bestimmt \(B\) (\({ A \rightarrow B }\)).
* \(B\) ist nicht Teil des Primärschlüssels.
* Dennoch gilt \({ B \rightarrow C }\).  


Somit ist \(C\) '''transitiv''' von \(A\) abhängig.
Gegeben sei eine Relation <math>R</math> mit den Attributen <math>A</math>, <math>B</math> und <math>C</math>.
* <math>A</math> ist der Primärschlüssel.
* <math>A</math> bestimmt <math>B</math> (<math>A \rightarrow B</math>).
* <math>B</math> ist kein Bestandteil des Primärschlüssels.
* Dennoch bestimmt <math>B</math> eindeutig <math>C</math> (<math>B \rightarrow C</math>).
 
In diesem Fall ist <math>C</math> zwar funktional von <math>A</math> abhängig, aber eben nur '''transitiv''' (indirekt) über das Attribut <math>B</math>.


'''Beispiel aus der Praxis:'''
'''Beispiel aus der Praxis:'''
Mit Hilfe des Primärschlüssels `IdMitarbeiter` lässt sich eindeutig der Salon bestimmen, in dem der Mitarbeiter arbeitet. Allerdings hängt der Salonname funktional von der `IdSalon` ab und somit nur ''transitiv'' von der `IdMitarbeiter`.
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 ein solches Schema in die [[Normalisierung#Die_3._Normalform_(3NF)|3. Normalform (3NF)]] zu überführen, müssen die Saloninformationen in eine eigene Relation ausgelagert werden.
Um solche Schemata zu optimieren und in die [[Normalisierung#Die_3._Normalform_(3NF)|3. Normalform (3NF)]] zu überführen, müssen Attribute mit transitiven Abhängigkeiten (wie die Saloninformationen) in eigene Relationen ausgelagert werden.


[[Kategorie:Datenbanken]]
[[Kategorie:Datenbanken]]
[[Kategorie:AHR_I_Informatik LK]]
[[Kategorie:FI_I_SDM]]
[[Kategorie:FI_I_SDM]]