„Normalisierung (Datenbank)“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
→Normalformen: Beispiele an Fehlerkorrektur angepasst, damit diese konsistent sind |
|||
Zeile 1: | Zeile 1: | ||
'''Normalisierung''' ist ein Entwurfsansatz für [[Relationale Datenbank|relationale Datenbanken]] mit dem Zweck, [[Redundanz (Informationstheorie)|redundante]] Speicherung von Informationen und damit [[Inkonsistenz]] und [[Anomalie (Informatik)|Anomalien]] zu vermeiden. Die Methode strukturiert die Daten anhand einer Folge von Regeln – „Normalformen“ genannt – die aufeinander aufbauen und formale Anforderungen an das Schema bestimmen. |
|||
Unter '''Normalisierung''' des [[Datenmodell]]s einer [[Relationale Datenbank|relationalen Datenbank]] versteht man die Anwendung von [[Kriterium|Kriterien]], damit das Modell einen bestimmten Zustand erreicht. |
|||
Diesen nennt man (x<sup>te</sup>) '''Normalform''', dh. wenn ein Datenmodell bestimmte (in jeder Stufe verschärfte) Bedingungen erfüllt, hat es die dadurch definierte Normalform, kurz '''xNF'''. |
|||
Die vorgenannten Regeln können bereits beim Entwurf beachtet werden (auch unterstützt z. B. durch Werkzeuge für die [[Semantisches Datenmodell|semantische Datenmodellierung]]). Zunächst nach Gutdünken entworfene Relationen können in einem nachfolgenden Schritt unter Beachtung der Normalformen jeweils in eine normalisierte Gestalt überführt werden; dafür gibt es Algorithmen (wie etwa den [[Synthesealgorithmus]] (3NF), den [[#Zerlegungsalgorithmus|Zerlegungsalgorithmus (BCNF)]] usw.), welche automatisiert werden können. Hierbei werden die [[Relation (Datenbank)|Relationen]] bei Bedarf anhand ihrer [[Funktionale Abhängigkeit|funktionalen Abhängigkeiten]] in einfachere zerlegt, bis keine weitere Zerlegung (ohne Verlust an Information) mehr möglich ist. Mit dem [[Satz von Delobel]] kann man für einen Zerlegungsschritt formal nachweisen bzw. prüfen, welche Zerlegung keine Datenverluste mit sich bringt. |
|||
Der Sinn der Normalisierung besteht darin, [[Redundanz]]en (doppelt vorhandene Einträge) mit der dadurch verbundenen Gefahr von [[Anomalie]]n (einander widersprechende Dateninhalte) zu vermeiden, und so die [[Wartung]] einer Datenbank zu vereinfachen sowie deren [[Konsistenz]] zu gewährleisten. |
|||
Es gibt verschiedene Ausmaße, in denen ein Datenbankschema gegen Anomalien gefeit sein kann. In diesem Zusammenhang spricht man davon, dass „es in erster, zweiter, dritter usw. Normalform vorliege“. |
|||
Neben den Abhängigkeiten, die für diese Normalformen "bereinigt" wurden, gibt es noch weitere, wie z.B. die [[Inklusionsabhängigkeit]], die [[Template-Abhängigkeit]] und die [[Domain-Key-Normalform]] (DKNF). |
|||
== |
== Vorgehen == |
||
=== Ziel: Konsistenzerhöhung durch Redundanzvermeidung === |
|||
Es gibt sechs Normalformen, von denen in der zweiten die Hauptarbeit steckt (siehe ''Bemerkungen''): |
|||
[[Datei:Aufspaltung einer Tabelle in zwei (Beispiel).svg|mini|Aufspaltung der Tabelle TBL_AdressenAlles]] |
|||
Bei der Normalisierung werden zunächst Spalten (synonyme Begriffe: ''Felder'', ''Attribute'') von Tabellen innerhalb von Bereichen der Datenschemata in neue Spalten aufgeteilt, z. B. <span style="font-variant:small-caps;">Adressen</span> in <span style="font-variant:small-caps;">Postleitzahl</span>, <span style="font-variant:small-caps;">Ort</span> und <span style="font-variant:small-caps;">Straße</span>. Anschließend werden Tabellen aufgeteilt, zum Beispiel eine Tabelle<br /> <span style="font-variant:small-caps;"><u>tbl_AdressenAlles</u></span> mit den Feldern <span style="font-variant:small-caps;">Firma</span>, <span style="font-variant:small-caps;">Straße</span>, <span style="font-variant:small-caps;">PLZ</span> und <span style="font-variant:small-caps;">Ort</span> in diese Tabellen: |
|||
* <span style="font-variant:small-caps;"><u>tbl_Adressen</u></span> mit den Feldern <span style="font-variant:small-caps;">AdressID, Firma</span>, <span style="font-variant:small-caps;">Straße</span> und <span style="font-variant:small-caps;">PLZ</span> |
|||
* <span style="font-variant:small-caps;"><u>tbl_PLZOrt</u></span> mit den Feldern <span style="font-variant:small-caps;">PLZ</span> und <span style="font-variant:small-caps;">Ort</span> |
|||
Siehe Bild ''Aufspaltung der Tabelle <span style="font-variant:small-caps;">tbl_AdressenAlles</span>'' – wobei die Tabelle <span style="font-variant:small-caps;"><u>tbl_Adressen</u></span> noch den eindeutigen Primärschlüssel <span style="font-variant:small-caps;">AdressID</span> erhält. |
|||
'''Hinweis:''' In diesem Beispiel wird angenommen, dass es zu jeder Postleitzahl nur jeweils einen Ortsnamen gibt, was in [[Deutschland]] jedoch sehr oft nicht zutrifft – bspw. in ländlichen Gebieten, wo sich mitunter bis zu 100 Orte eine Postleitzahl „teilen“. |
|||
=== 1. Normalform (1NF) === |
|||
Jedes [[Attribut]] der [[Relation (Datenbanktechnik)|Relation]] ist atomar (unteilbar). Eine Information in einem Attribut ist dann atomar, wenn sie nicht mehr weiter in Einzelinformationen zerlegt werden kann (muss). |
|||
Die Normalisierung hat den Zweck, [[Redundanz (Informationstheorie)|Redundanzen]] (mehrfaches Festhalten des gleichen Sachverhalts) zu verringern und dadurch verursachte [[Anomalie (Informatik)|Anomalien]] (z. B. infolge Änderung an nicht allen Stellen) zu verhindern, um so die [[Update (Datenbank)|Aktualisierung]] einer [[Datenbank]] zu vereinfachen (Änderungen lediglich an einer Stelle) sowie die [[Konsistenz (Datenspeicherung)#Konsistenz in klassischen relationalen Datenbanken|Konsistenz]] der [[Daten]] zu gewährleisten. |
|||
'''Beispiel:''' <br/> |
|||
Ein Feld "Name" beinhaltet Vornamen und Nachnamen einer Person. |
|||
=== Beispiel === |
|||
'''Fehler/Problem:''' <br/> |
|||
Zur Sortierung nach Nachnamen, muss das Feld in Vornamen und Nachnamen aufgeteilt werden. |
|||
Ein Beispiel dazu: Eine Datenbank enthält Kunden und deren Adressen sowie Aufträge, die den Kunden zugeordnet sind. Da es mehrere Aufträge vom selben Kunden geben kann, würde eine Erfassung der Kundendaten (womöglich mit Adressdaten) in der Auftragstabelle dazu führen, dass sie dort mehrfach vorkommen, obwohl der Kunde immer nur einen Satz gültiger Daten hat ([[Redundanz (Informationstheorie)|Redundanz]]). Beispielsweise kann es dazu kommen, dass in einem Auftrag fehlerhafte Adressdaten zum Kunden eingegeben werden, im nächsten Auftrag werden die korrekten Daten erfasst. So kann es – in dieser Tabelle oder auch gegenüber anderen Tabellen – zu widersprüchlichen Daten kommen. Die Daten wären dann nicht konsistent, man wüsste nicht, welche Daten korrekt sind. Womöglich sind sogar beide Adressen nicht korrekt, weil der Kunde umgezogen ist ''(Lösung siehe unten)''. |
|||
'''Lösung:''' <br/> |
|||
Man benötigt die Felder "Vorname" und "Nachname", die diese Informationen getrennt aufnehmen. |
|||
Bei einer normalisierten Datenbank gibt es für die Kundendaten nur einen einzigen Eintrag in der Kundentabelle, mit der jeder Auftrag dieses Kunden verknüpft wird (üblicherweise über die Kundennummer). Im Falle des Umzugs eines Kunden (ein anderes Beispiel ist die Änderung der Mehrwertsteuer) gäbe es zwar mehrere Einträge in der entsprechenden Tabelle, die aber zusätzlich durch die Angabe eines ''Gültigkeitszeitraums'' unterscheidbar sind und im obigen Kundenbeispiel über die Kombination ''Auftragsdatum/Kundennummer'' eindeutig angesprochen werden können. |
|||
Wenn für jedes dieser Felder die Bedingung "atomar" erfüllt ist, dann hat das Datenmodell die erste Normalform (1NF). |
|||
Ein weiterer Vorteil von Redundanzfreiheit, der bei Millionen Datensätzen einer Datenbank auch heute noch eine wichtige Rolle spielt, ist der geringere Speicherbedarf, wenn der Datensatz einer Tabelle zum Beispiel <span style="font-variant:small-caps;"><u>tbl_Auftrag</u></span> auf einen Datensatz einer anderen Tabelle z. B. <span style="font-variant:small-caps;"><u>tbl_Kunde</u></span> verweist, anstatt diese Daten selbst zu enthalten. |
|||
=== 2. Normalform (2NF) === |
|||
''Eine Relation ist in zweiter Normalform, wenn alle Attribute vom '''ganzen''' Primärschlüssel abhängig sind.'' |
|||
[[Datei:Wp Normal 1 301208 165800.JPG|mini|hochkant=1.5|Aufspaltung von Tabellen zur Normalisierung]] |
|||
Dieses sind die Empfehlungen, die ausgehend von der Theorie der Normalisierung bei der Datenbankentwicklung gegeben werden, um vor allem Konsistenz der Daten und eine eindeutige Selektion von Daten zu gewährleisten. Die hierzu angestrebte Redundanzfreiheit steht allerdings in speziellen Anwendungsfällen in Konkurrenz zur Verarbeitungsgeschwindigkeit oder zu anderen Zielen. Es kann daher sinnvoll sein, auf eine Normalisierung zu verzichten oder diese durch eine [[Denormalisierung]] rückgängig zu machen, um |
|||
* die Verarbeitungsgeschwindigkeit (Performance) zu erhöhen oder |
|||
* Anfragen zu vereinfachen und damit die Fehleranfälligkeit zu verringern oder |
|||
* Besonderheiten von Prozessen (zum Beispiel [[Geschäftsprozess]]en) abzubilden. |
|||
In diesen Fällen sollten regelmäßig automatische Abgleichroutinen implementiert werden, um Inkonsistenzen zu vermeiden. Alternativ können die betreffenden Daten auch für Änderungen gesperrt werden. |
|||
== Normalformen == |
|||
Zurzeit gebräuchliche Normalformen sind: |
|||
* 1. Normalform (1NF) |
|||
* 2. Normalform (2NF) |
|||
* 3. Normalform (3NF) |
|||
* [[Raymond F. Boyce|Boyce]]-[[Edgar F. Codd|Codd]]-Normalform (BCNF) |
|||
* 4. Normalform (4NF) |
|||
* 5. Normalform (5NF) |
|||
Zum einen dienen sie der Beurteilung der Qualität eines betrachteten [[Datenbankschema]]s, zum anderen helfen sie, Fehler beim Erzeugen neuer Schemata zu vermeiden. |
|||
Außerdem können mit Hilfe der Normalisierung Datenstrukturen aus nichtrelationalen Quellen gewonnen werden, die im Sinne des Normalisierungskonzepts formal korrekt sind und die Daten aus ihren jeweiligen nichtrelationalen Quellen, aus denen sie entstanden sind (zum Beispiel Formulardaten oder Spreadsheets), aufnehmen können. |
|||
Nachfolgend werden die Kriterien der jeweiligen Normalformen erklärt. Dabei ist zu beachten, dass jede Normalform die Kriterien der vorhergehenden Normalformen mit einschließt, d. h. für die folgenden Kriterienmengen gilt: <math>\text{1NF} \subseteq \text{2NF} \subseteq \text{3NF} \subseteq \text{BCNF} \subseteq \text{4NF} \subseteq \text{5NF}</math>. |
|||
=== Erste Normalform (1NF) === |
|||
==== Erläuterung ==== |
|||
''Jedes [[Attribut (UML)|Attribut]] der [[Relation (Datenbank)|Relation]] muss einen atomaren Wertebereich haben, und die Relation muss frei von Wiederholungsgruppen sein.'' (Anm.: statt „atomar“ wird auch die Bezeichnung „atomisch“ verwendet.) |
|||
''Atomar'' heißt, dass zusammengesetzte, mengenwertige oder geschachtelte Wertebereiche (also Relationen wertige Attributwertebereiche) nicht erlaubt sind. In einer Relation, die sich in 1NF befindet, gibt es kein Attribut, dessen Wertebereich in weitere (sinnvolle) Teilbereiche aufgespalten werden kann. |
|||
Beispiel: Die Adresse darf nicht als einzelnes Attribut verwendet werden, sondern muss – sofern es der zugrunde liegende Prozess erfordert ''und erlaubt'' – in PLZ, Ort, Straße, Hausnummer etc. aufgeteilt werden. |
|||
''Frei von Wiederholungsgruppen'' bedeutet, dass Attribute, die ''gleiche'' oder gleich''artige'' Information enthalten, in eine andere Relation ausgelagert werden müssen. |
|||
Ein Beispiel für eine Wiederholungsgruppe wäre eine Spalte { Telefon }, die ''mehrere'' Telefonnummern enthält oder auch eine Spaltengruppe { Telefon1, Telefon2, Telefon3 }, wobei im letzteren Fall anzumerken ist, dass es sich dabei nicht notwendigerweise um eine Wiederholungsgruppe handeln muss (siehe Alternative Formulierungen). |
|||
==== Praktischer Nutzen ==== |
|||
Abfragen der Datenbank werden durch die 1NF erleichtert bzw. überhaupt erst ermöglicht, wenn die Attributwertebereiche ''atomar'' sind. So ist es beispielsweise in einem Feld, das einen ganzen Namensstring aus Titel, Vorname und Nachname enthält, schwierig bis unmöglich, nach Nachnamen zu sortieren. |
|||
==== Alternative Formulierungen ==== |
|||
''Alle Attribute enthalten atomare Inhalte, und die Relation hat eine feste Breite''. Diese Formulierung bezieht sich darauf, dass es niemals nötig sein darf, weitere Attribute in die Relation aufzunehmen, weil die Wiederholungszahl der Wiederholungsgruppe zu klein wird (z. B.: es wird bei drei Attributen Telefon1–3 eine 4. Telefonnummer für eine Person bekannt). Sie ist insofern interessant, als sie helfen kann zu entscheiden, ob tatsächlich eine Wiederholungsgruppe vorliegt: Obwohl z. B. { .., Telefon1, Telefon2, Telefon3,.. } sehr stark das Vorhandensein einer Wiederholungsgruppe impliziert, könnte es bei lediglich anderen Attributnamen klar werden, dass – freilich unter dem Licht der Anwendung – dem nicht so sein muss: { .., Telefon, Fax, Mobil,.. } |
|||
Eine weitere Variante entsteht durch folgenden Zusatz: ''.. und die Relation einen [[Schlüssel (Datenbank)|Primärschlüssel]] hat.'' Obwohl diese Formulierung so nicht bei [[Edgar F. Codd|Codd]] nachgelesen werden kann, handelt es sich um eine Erweiterung, die zu ausgesprochen praxistauglichen [[Datenstruktur]]en führt. |
|||
==== Negativbeispiel: 1NF verletzt ==== |
|||
{| class="wikitable" |
|||
|+ CD_Lied |
|||
! style="background:#6BBFFF"| ''CD_ID'' |
|||
! Album |
|||
!Gründungsjahr |
|||
! Erscheinungsjahr |
|||
! Titelliste |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#ffb4b4" |Anastacia – Not That Kind |
|||
|1999 |
|||
| 2000 |
|||
| bgcolor="#ffb4b4" | {1. Not That Kind, 2. I’m Outta Love, 3. Cowboys & Kisses} |
|||
|- |
|||
| bgcolor="#bee3ff" |4712 |
|||
| bgcolor="#ffb4b4" |Pink Floyd – Wish You Were Here |
|||
|1965 |
|||
| 1975 |
|||
| {1. Shine On You Crazy Diamond} |
|||
|- |
|||
| bgcolor="#bee3ff" | 4713 |
|||
| bgcolor="#ffb4b4" |Anastacia – I’m Outta Love |
|||
|1999 |
|||
| 2000 |
|||
| {1. I’m Outta Love} |
|||
|} |
|||
* Das Feld '''Album''' enthält die Attributwertebereiche Interpret und Albumtitel. |
|||
* Das Feld '''Titelliste''' enthält eine Menge von Titeln. |
|||
Dadurch hat man ohne Aufspaltung folgende Probleme bei Abfragen: |
|||
* Zur Sortierung nach Albumtitel muss das Feld '''Album''' in Interpret und Albumtitel aufgeteilt werden. |
|||
* Die Titel können (mit einfachen Mitteln) nur alle gleichzeitig als '''Titelliste''' oder gar nicht dargestellt werden. |
|||
==== Lösung ==== |
|||
{| class="wikitable" |
|||
|+ CD_Lied |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
! Albumtitel |
|||
! Interpret |
|||
!Gründungsjahr |
|||
! Erscheinungsjahr |
|||
! style="background:#6DBFFF"| ''Track'' |
|||
! Titel |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| Not That Kind |
|||
| Anastacia |
|||
|1999 |
|||
| 2000 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| Not That Kind |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| Not That Kind |
|||
| Anastacia |
|||
|1999 |
|||
| 2000 |
|||
| bgcolor="#bee3ff" | 2 |
|||
| I’m Outta Love |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| Not That Kind |
|||
| Anastacia |
|||
|1999 |
|||
| 2000 |
|||
| bgcolor="#bee3ff" | 3 |
|||
| Cowboys & Kisses |
|||
|- |
|||
| bgcolor="#bee3ff" |4712 |
|||
| Wish You Were Here |
|||
| Pink Floyd |
|||
|1965 |
|||
| 1975 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| Shine On You Crazy Diamond |
|||
|- |
|||
| bgcolor="#bee3ff" |4713 |
|||
| I’m Outta Love |
|||
| Anastacia |
|||
|1999 |
|||
| 2000 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| I’m Outta Love |
|||
|} |
|||
Die Attributwertebereiche werden in atomare Attributwertebereiche aufgespalten: |
|||
* Das Feld '''Album''' wird in die Felder ''Albumtitel'' und ''Interpret'' gespalten. |
|||
* Das Feld '''Titelliste''' wird in die Felder ''Track'' und ''Titel'' gespalten sowie auf mehrere Datensätze aufgeteilt. |
|||
Da jetzt jeder Attributwertebereich atomar ist sowie die Tabelle einen eindeutigen Primärschlüssel (Verbundschlüssel aus den Spalten ''CD_ID'' und ''Track'') besitzt, befindet sich die Relation in 1NF. |
|||
=== Zweite Normalform (2NF) === |
|||
==== Erläuterung ==== |
|||
Eine Relation ist genau dann in der zweiten Normalform, wenn die erste Normalform vorliegt und kein Nichtprimärattribut (Attribut, das nicht Teil eines [[Schlüsselkandidat]]en ist) funktional von einer echten Teilmenge eines Schlüsselkandidaten abhängt. |
|||
Anders gesagt: Jedes nicht-primäre Attribut (nicht Teil eines Schlüssels) ist jeweils von allen '''ganzen''' Schlüsseln abhängig, nicht nur von einem Teil eines Schlüssels. Wichtig ist hierbei, dass die Nichtschlüsselattribute wirklich von ''allen'' Schlüsseln vollständig abhängen. |
|||
Somit gilt, dass Relationen in der 1NF, deren Schlüsselkandidat(en) nicht zusammengesetzt sind, sondern lediglich aus jeweils (einem) einzelnen Attribut(en) bestehen, automatisch die 2NF erfüllen. |
|||
In einer Relation R(A,B) ist das Attribut B von dem Attribut A funktional abhängig, falls zu jedem Wert des Attributs A genau ein Wert des Attributs B gehört. In einer Relation R(S1,S2,B) ist das Attribut B von den Schlüsselattributen S1 und S2 voll funktional abhängig, wenn B von den zusammengesetzten Attributen (S1,S2) funktional abhängig ist, nicht aber von einem einzelnen Attribut S1 oder S2. |
|||
Diese informelle Definition kann wie folgt präzisiert werden: |
Diese informelle Definition kann wie folgt präzisiert werden: |
||
Eine Relation ist genau dann in zweiter Normalform, wenn sie |
Eine Relation ist genau dann in zweiter Normalform, wenn sie |
||
# in der ersten Normalform ist und |
# in der ersten Normalform ist und |
||
# für |
# für jedes Attribut <math>a</math> der Relation gilt: |
||
#*<math>a</math> ist Teil eines Schlüsselkandidaten oder |
|||
**a gehört zu CK oder |
|||
* |
#* <math>a</math> ist von einem Schlüsselkandidaten abhängig und<br /><math>a</math> ist nicht von einer echten Teilmenge eines Schlüsselkandidaten abhängig. |
||
'''Beispiel:''' <br/> |
|||
<math>a</math> ist ''voll funktional abhängig'' von jedem Schlüsselkandidaten (wobei die Schlüsselkandidaten KC auch durch die Kombination mehrerer Attribute gebildet werden können). Die 2NF eliminiert alle ''partiellen'' funktionalen Abhängigkeiten, d. h. kein Nichtschlüsselattribut ist funktional abhängig von Teilen des Schlüsselkandidaten. |
|||
Gegeben sei eine Tabelle mit folgenden Feldern: |
|||
Falls ein Schlüsselkandidat zwei Attribute besitzt, können bei der Zerlegung in die 2NF höchstens drei Relationen entstehen. Falls ein Schlüsselkandidat drei Attribute besitzt, können bei der Zerlegung in die 2NF höchstens sieben Relationen entstehen. Das sind jeweils die Anzahl der Teilmengen einer gegebenen Menge minus 1 (leere Menge) und entspricht der Anzahl der Elemente der [[Potenzmenge]] (<math>2^n</math>) als Obergrenze. |
|||
==== Praktischer Nutzen ==== |
|||
Die 2NF erzwingt wesentlich „monothematische“ Relationen im Schema: jede Relation modelliert nur '''einen''' Sachverhalt. |
|||
Dadurch werden Redundanz und die damit einhergehende Gefahr von Inkonsistenzen reduziert. Nur noch logisch/sachlich zusammengehörige Informationen finden sich in einer Relation. Dadurch fällt das Verständnis der Datenstrukturen leichter. Jedoch wird beim Planen eines Datenmodelles die 2. Normalform meistens übersprungen, daher kommt sie, verglichen mit der 1. und 3. Normalform, eher selten vor. |
|||
==== Negativbeispiel: 2NF verletzt ==== |
|||
{| border="1" cellpadding="2" cellspacing="0" |
|||
{| class="wikitable" |
|||
|+'''CDLieder''' |
|||
|+ CD_Lied |
|||
!CD_ID |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
!CD_Titel |
|||
! Albumtitel |
|||
!CD_Interpret |
|||
! Interpret |
|||
!CD_Preis |
|||
!Gründungsjahr |
|||
!TrackID |
|||
!Erscheinungsjahr |
|||
!LiedTitel |
|||
! style="background:#6DBFFF"| ''Track'' |
|||
! Titel |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
|Not That Kind |
| bgcolor="#ffb4b4" | Not That Kind |
||
|Anastacia |
| bgcolor="#ffb4b4" |Anastacia |
||
| bgcolor="#ffb4b4" |1999 |
|||
|14,59€ |
|||
| bgcolor="#ffb4b4" |2000 |
|||
|1 |
|||
| bgcolor="#bee3ff" | 1 |
|||
|Not That Kind |
|||
| Not That Kind |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
|Not That Kind |
| bgcolor="#ffb4b4" |Not That Kind |
||
|Anastacia |
| bgcolor="#ffb4b4" |Anastacia |
||
| bgcolor="#ffb4b4" |1999 |
|||
|14,59€ |
|||
| bgcolor="#ffb4b4" |2000 |
|||
|2 |
|||
| bgcolor="#bee3ff" | 2 |
|||
|I'm Outta Love |
|||
| I’m Outta Love |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
|Not That Kind |
| bgcolor="#ffb4b4" |Not That Kind |
||
|Anastacia |
| bgcolor="#ffb4b4" |Anastacia |
||
| bgcolor="#ffb4b4" |1999 |
|||
|14,59€ |
|||
| bgcolor="#ffb4b4" |2000 |
|||
|3 |
|||
| bgcolor="#bee3ff" | 3 |
|||
|Cowboys & Kisses |
|||
| Cowboys & Kisses |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4712 |
|||
|4712 |
|||
|Wish You Were Here |
| bgcolor="#ffb4b4" | Wish You Were Here |
||
|Pink Floyd |
| bgcolor="#ffb4b4" | Pink Floyd |
||
| bgcolor="#ffb4b4" | 1965 |
|||
|15,99€ |
|||
| bgcolor="#ffb4b4" | 1975 |
|||
|1 |
|||
| bgcolor="#bee3ff" | 1 |
|||
|Shine On You Crazy Diamond |
|||
| Shine On You Crazy Diamond |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4713 |
|||
| bgcolor="#ffb4b4" | I’m Outta Love |
|||
| bgcolor="#ffb4b4" | Anastacia |
|||
| bgcolor="#ffb4b4" |1999 |
|||
| bgcolor="#ffb4b4" |2000 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| I’m Outta Love |
|||
|} |
|} |
||
* Der Primärschlüssel der Relation ist aus den Feldern ''CD_ID'' und ''Track'' zusammengesetzt. (Grundsätzlich darf ein Primärschlüssel aus mehreren Attributen bestehen, jedoch entsteht daraus im genannten Beispiel ein Konflikt.) |
|||
'''Problem:''' <br/> |
|||
* Die Felder ''Albumtitel'', ''Interpret,'' ''Gründungs-'' und ''Erscheinungsjahr'' sind vom Feld ''CD_ID'' abhängig, aber nicht vom Feld ''Track''. Dieser (Punkt 2) verletzt die 2. Normalform, da die vier nicht-primären Attribute nicht nur von einem Teil des Schlüssels (hier ''CD_ID'') abhängen dürfen. Wäre der Schlüssel nicht zusammengesetzt (siehe Punkt 1), so könnte dies nicht passieren. |
|||
Der Primärschlüssel der Relation ist aus den Feldern ''CD_ID'' und ''TrackID'' zusammengesetzt. Die Felder ''CD_Titel'' und ''CD_Preis'' sind zwar vom Feld ''CD_ID'' abhängig - nicht aber vom Feld ''TrackID''. |
|||
==== Probleme, die sich daraus ergeben ==== |
|||
Die Informationen aus diesen beiden Feldern sind, wie am Beispiel der CD ''Not That Ki(n)d'' zu erkennen, mehrfach vorhanden. Der hieraus resultierende Zustand der '''[[Redundanz|Datenredundanz]]''' kann zu Verletzungen der '''[[Datenintegrität|Integrität der Daten]]''' führen. Es ist möglich, den Namen der CD und den Preis für die Lieder ''Not That Kind'' und ''Cowboys & Kisses'' zu ändern ohne die passenden Einträge beim Lied ''I'm Outta Love'' zu ändern. |
|||
Die Informationen aus diesen drei Feldern sind, wie am Beispiel der CD ''Not That Kind'' zu erkennen, mehrfach vorhanden, d. h. redundant. Dadurch besteht die Gefahr, dass die ''[[Konsistenz (Datenspeicherung)#Konsistenz in klassischen relationalen Datenbanken|Integrität der Daten]]'' verletzt wird. So könnte man den Albumtitel für das Lied ''Not That Kind'' in ''I Don’t Mind'' ändern, ohne jedoch die entsprechenden Einträge für die Titel ''I’m Outta Love'' und ''Cowboys & Kisses'' zu ändern ([[Update-Anomalie]]). |
|||
{| class="wikitable" |
|||
{| border="1" cellpadding="2" cellspacing="0" |
|||
|+ CD_Lied (inkonsistent) |
|||
|+'''Kunden''' |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
!CD_ID |
|||
! Albumtitel |
|||
!CD_Titel |
|||
! Interpret |
|||
!CD_Interpret |
|||
!Gründungsjahr |
|||
!CD_Preis |
|||
! Erscheinungsjahr |
|||
!TrackID |
|||
! style="background:#6DBFFF"| ''Track'' |
|||
!LiedTitel |
|||
! Titel |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
| bgcolor="#ffb4b4" | I Don’t Mind |
|||
|Not That Kind |
|||
|Anastacia |
| Anastacia |
||
|1999 |
|||
|15,99€ |
|||
|2000 |
|||
|1 |
|||
| bgcolor="#bee3ff" | 1 |
|||
|Not That Kind |
|||
| Not That Kind |
|||
|- |
|- |
||
| bgcolor="#be33ff" | 4711 |
|||
|4711 |
|||
|Not That |
| bgcolor="#f848f8" | Not That Kind |
||
|Anastacia |
| Anastacia |
||
|1999 |
|||
|14,59€ |
|||
|2000 |
|||
|2 |
|||
| bgcolor="#bee3ff" | 2 |
|||
|I'm Outta Love |
|||
| I’m Outta Love |
|||
|- |
|- |
||
| bgcolor="#be33ff" | 4711 |
|||
|4711 |
|||
|Not That Kind |
| bgcolor="#f848f8" | Not That Kind |
||
|Anastacia |
| Anastacia |
||
|1999 |
|||
|15,99€ |
|||
|2000 |
|||
|3 |
|||
| bgcolor="#bee3ff" | 3 |
|||
|Cowboys & Kisses |
|||
| Cowboys & Kisses |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4712 |
|||
|4712 |
|||
|Wish You Were Here |
| Wish You Were Here |
||
|Pink Floyd |
| Pink Floyd |
||
|1965 |
|||
|15,99€ |
|||
| 1975 |
|||
|1 |
|||
| bgcolor="#bee3ff" | 1 |
|||
|Shine On You Crazy Diamond |
|||
| Shine On You Crazy Diamond |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4713 |
|||
| I’m Outta Love |
|||
| Anastacia |
|||
|1999 |
|||
|2000 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| I’m Outta Love |
|||
|} |
|} |
||
In diesem Fall |
In diesem Fall wäre ein Zustand erreicht, den man als [[Konsistenz (Datenspeicherung)#Konsistenz in klassischen relationalen Datenbanken|Dateninkonsistenz]] bezeichnet. Über die komplette Tabelle betrachtet, „passen“ die Daten nicht mehr zusammen. |
||
==== Lösung ==== |
|||
Die Daten in der Tabelle werden in zwei Tabellen aufgeteilt: ''CD'' und '' |
Die Daten in der Tabelle werden in zwei Tabellen aufgeteilt: ''CD'' und ''Lied''. Die Tabelle CD enthält nur noch Felder, die voll funktional von ''CD_ID'' abhängen, hat also ''CD_ID'' als Primärschlüssel. Auch der Albumtitel allein sei eindeutig, also ein Schlüsselkandidat. Da keine weiteren (zusammengesetzten) Schlüsselkandidaten existieren, liegt die Tabelle damit automatisch in der 2. Normalform vor. Die Tabelle „Lied“ enthält schließlich nur noch Felder, die voll funktional von ''CD_ID'' und ''Track'' abhängen, liegt also auch in der 2. Normalform vor. Mit Hilfe dieser verlustfreien Zerlegung sind auch die genannten Redundanzen der Daten beseitigt. |
||
sind stets in der 2. Normalform. |
|||
{| border="0" |
{| border="0" |
||
| |
|- style="vertical-align:top" |
||
| |
|||
{| border="1" cellpadding="2" cellspacing="0" |
|||
{| class="wikitable" |
|||
|+'''CD''' |
|||
|+ CD |
|||
!ID |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
!Interpret |
|||
! Albumtitel |
|||
!Titel |
|||
! Interpret |
|||
!Preis |
|||
!Gründungsjahr |
|||
! Erscheinungsjahr |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
| Not That Kind |
|||
|Anastacia |
|||
| Anastacia |
|||
|Not That Kind |
|||
|1999 |
|||
|14.99€ |
|||
|2000 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4712 |
|||
|4712 |
|||
| Wish You Were Here |
|||
|Pink Floyd |
|||
| Pink Floyd |
|||
|Wish You Were Here |
|||
|1965 |
|||
|15,99€ |
|||
| 1975 |
|||
|- |
|||
| bgcolor="#bee3ff" | 4713 |
|||
| I’m Outta Love |
|||
| Anastacia |
|||
|1999 |
|||
|2000 |
|||
|} |
|} |
||
| |
|||
| valign="top" | |
|||
{| class="wikitable" |
|||
{| border="1" cellpadding="2" cellspacing="0" |
|||
|+ Lied |
|||
|+'''Lieder''' |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
!TrackID |
|||
! style="background:#6DBFFF"| ''Track'' |
|||
!LiedTitel |
|||
! Titel |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|1 |
|||
| bgcolor="#bee3ff" | 1 |
|||
|Not That Kind |
|||
| Not That Kind |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|2 |
|||
| bgcolor="#bee3ff" | 2 |
|||
|I'm Outta Love |
|||
| I’m Outta Love |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|3 |
|||
| bgcolor="#bee3ff" | 3 |
|||
|Cowboys & Kisses |
|||
| Cowboys & Kisses |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4712 |
|||
|1 |
|||
| bgcolor="#bee3ff" | 1 |
|||
|Shine On You Crazy Diamond |
|||
| Shine On You Crazy Diamond |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4713 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| I’m Outta Love |
|||
|} |
|} |
||
|} |
|} |
||
Da es keine Verbindung zwischen den beiden Tabellen gibt, ist es notwendig, dass der Primärschlüssel der Tabelle ''CD'' als [[Fremdschlüssel]] in der Tabelle ''Lieder'' verbleibt. |
|||
Das Attribut ''CD_ID'' aus der Tabelle ''Lied'' bezeichnet man als [[Fremdschlüssel]], der auf den Primärschlüssel der Tabelle ''CD'' verweist. Zugleich stellen die Attribute ''CD_ID'' und ''Track'' den zusammengesetzten Primärschlüssel der Tabelle Lied dar. |
|||
=== Dritte Normalform (3NF) === |
|||
==== Erläuterung ==== |
|||
Eine Relation befindet sich in der 3. Normalform, wenn sie die 2. NF erfüllt und keine funktionalen Abhängigkeiten der Nichtschlüssel-Attribute (hellgraue Zellen in der Tabelle) untereinander bestehen. Solche Abhängigkeiten bezeichnet man auch als '''transitive''' Abhängigkeiten. Weiterhin müssen alle Nichtschlüssel voll funktional abhängig vom Schlüsselattribut sein. |
|||
Ein Attribut <math>A_2</math> ist vom Schlüsselkandidaten <math>P_1</math> transitiv abhängig, wenn es eine Attributmenge <math>A_1</math> gibt, sodass <math>(P_1 \rightarrow A_1) </math> und <math>(A_1 \rightarrow A_2) </math>. |
|||
Hierbei handelt es sich um eine Abhängigkeit, bei der ein Attribut <math>A_2</math> über eine Attributmenge <math>A_1</math> von einem Schlüsselkandidaten <math>P_1</math> der Relation abhängig ist (ohne dass zugleich auch <math>P_1</math> direkt von <math>A_1</math> abhängig, also <math>A_1</math> ein Schlüsselkandidat ist). Das heißt: Wenn die Attributmenge <math>A_1</math> von der Attributmenge <math>P_1</math> abhängt und Attribut <math>A_2</math> von <math>A_1</math>, dann ist <math>A_2</math> transitiv abhängig von <math>P_1</math>. Formal ausgedrückt: |
|||
<math>(P_1 \rightarrow A_1) \wedge (A_1 \rightarrow A_2) \Rightarrow P_1 \rightarrow A_2</math>. |
|||
Einfach gesagt: Ein Nichtschlüsselattribut darf nicht von einer Menge aus Nichtschlüsselattributen abhängig sein. Ein Nichtschlüsselattribut darf also nur direkt von einem Primärschlüssel (bzw. einem Schlüsselkandidaten) abhängig sein. |
|||
''Siehe auch:'' [[Transitive Relation]], [[Synthesealgorithmus]] |
|||
===== Praktischer Nutzen ===== |
|||
Transitive Abhängigkeiten sind sofort ersichtlich, ohne dass man die Zusammenhänge der Daten kennen muss. |
|||
Sie sind durch die Struktur der Relationen wiedergegeben. |
|||
Außerdem werden verbliebene thematische Durchmischungen in der Relation behoben: nach der 3NF sind die Relationen des Schemas zuverlässig monothematisch. |
|||
===== Alternative Formulierung ===== |
|||
Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (hellgraue Zellen in der Tabelle) [[Determinante (Informatik)|Determinante]] ist. |
|||
Oder: |
|||
Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (hellgraue Zellen in der Tabelle) von einem anderen Nichtschlüsselattribut funktional abhängig ist. |
|||
==== Negativbeispiel: 3NF verletzt ==== |
|||
{| border="0" |
{| border="0" |
||
| |
|- style="vertical-align:top" |
||
| |
|||
{| border="1" cellpadding="2" cellspacing="0" |
|||
{| class="wikitable" |
|||
|+'''CD''' |
|||
|+ CD |
|||
!ID |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
!Interpret |
|||
! Albumtitel |
|||
!Titel |
|||
! Interpret |
|||
!Preis |
|||
! Gründungsjahr |
|||
!Erscheinungsjahr |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
| Not That Kind |
|||
|Anastacia |
|||
| bgcolor="#ffb4b4" |Anastacia |
|||
|Not That Kind |
|||
| bgcolor="#ffb4b4" |1999 |
|||
|14.99€ |
|||
|2000 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4712 |
|||
|4712 |
|||
| Wish You Were Here |
|||
|Pink Floyd |
|||
| Pink Floyd |
|||
|Wish You Were Here |
|||
| 1965 |
|||
|15,99€ |
|||
|1975 |
|||
|- |
|||
| bgcolor="#bee3ff" | 4713 |
|||
| I’m Outta Love |
|||
| bgcolor="#ffb4b4" |Anastacia |
|||
| bgcolor="#ffb4b4" |1999 |
|||
|2000 |
|||
|} |
|} |
||
| |
|||
| valign="top" | |
|||
{| border="1" cellpadding="2" cellspacing="0" |
|||
|} |
|||
|+'''Lieder''' |
|||
!CD_ID |
|||
Offensichtlich lässt sich der ''Interpret'' einer CD aus der ''CD_ID'' bestimmen, das ''Gründungsjahr'' der Band/Interpreten hängt wiederum vom ''Interpreten'' und damit [[Transitive Relation|transitiv]] von der ''CD_ID'' ab. |
|||
!TrackID |
|||
!LiedTitel |
|||
Das Problem ist hierbei wieder Datenredundanz. Wird zum Beispiel eine neue CD mit einem existierenden ''Interpreten'' eingeführt, so wird das ''Gründungsjahr'' redundant gespeichert. |
|||
==== Lösung ==== |
|||
{| border="0" |
|||
|- style="vertical-align:top" |
|||
| |
|||
{| class="wikitable" |
|||
|+ CD |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
! Albumtitel |
|||
! Interpret |
|||
!Erscheinungsjahr |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4711 |
|||
|4711 |
|||
| Not That Kind |
|||
|1 |
|||
| bgcolor="#fffca8" | Anastacia |
|||
|Not That Kind |
|||
|2000 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4712 |
|||
|4711 |
|||
| Wish You Were Here |
|||
|2 |
|||
| bgcolor="#fffca8" | Pink Floyd |
|||
|I'm Outta Love |
|||
|1975 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 4713 |
|||
|4711 |
|||
| I’m Outta Love |
|||
|3 |
|||
| bgcolor="#fffca8" | Anastacia |
|||
|Cowboys & Kisses |
|||
|2000 |
|||
|} |
|||
| |
|||
{| class="wikitable" |
|||
|+ Künstler |
|||
! Interpret |
|||
! Gründungsjahr |
|||
|- |
|- |
||
| bgcolor="#fffca8" | Anastacia |
|||
|4712 |
|||
| 1999 |
|||
|1 |
|||
|Shine On You Crazy Diamond |
|||
|- |
|- |
||
| bgcolor="#fffca8" | Pink Floyd |
|||
| 1965 |
|||
|} |
|} |
||
| |
|||
{| class="wikitable" |
|||
|+ Lied |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
! style="background:#6DBFFF"| ''Track'' |
|||
! Titel |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| Not That Kind |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#bee3ff" | 2 |
|||
| I’m Outta Love |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#bee3ff" | 3 |
|||
| Cowboys & Kisses |
|||
|- |
|||
| bgcolor="#bee3ff" | 4712 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| Shine On You Crazy Diamond |
|||
|- |
|||
| bgcolor="#bee3ff" | 4713 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| I’m Outta Love |
|||
|} |
|} |
||
|}Diese Lösung gilt nur, wenn man davon ausgeht, dass der Interpret weltweit eindeutig ist. Ansonsten müsste man eine synthetische ID in der Tabelle Künstler hinzufügen, die dann den Fremdschlüssel in der Tabelle CD stellt, wie folgt: |
|||
{| border="0" |
|||
|- style="vertical-align:top" |
|||
| |
|||
{| class="wikitable" |
|||
|+ CD |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
! Albumtitel |
|||
! Interpret_ID |
|||
!Erscheinungsjahr |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| Not That Kind |
|||
| bgcolor="#fffca8" | 311 |
|||
|2000 |
|||
|- |
|||
| bgcolor="#bee3ff" | 4712 |
|||
| Wish You Were Here |
|||
| bgcolor="#fffca8" | 312 |
|||
|1975 |
|||
|- |
|||
| bgcolor="#bee3ff" | 4713 |
|||
| I’m Outta Love |
|||
| bgcolor="#fffca8" | 311 |
|||
|2000 |
|||
|} |
|||
| |
|||
{| class="wikitable" |
|||
|+ Künstler |
|||
! style="background:#6DBFFF"|''Interpret_ID'' |
|||
! Interpret |
|||
! Gründungsjahr |
|||
|- |
|||
| bgcolor="#fffca8" | 311 |
|||
| Anastacia |
|||
| 1999 |
|||
|- |
|||
| bgcolor="#fffca8" | 312 |
|||
| Pink Floyd |
|||
| 1965 |
|||
|} |
|||
| |
|||
{| class="wikitable" |
|||
Mit Hilfe dieser verlustfreien Zerlegung sind die genannten Redundanzen der Daten beseitigt. In jedem Datensatz aus der Tabelle ''Lied'' gibt es nur noch einen Verweis auf die passende CD. Die Tabellen haben nun die zweite Normalform (2NF). |
|||
|+ Lied |
|||
! style="background:#6DBFFF"| ''CD_ID'' |
|||
! style="background:#6DBFFF"| ''Track'' |
|||
! Titel |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| Not That Kind |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#bee3ff" | 2 |
|||
| I’m Outta Love |
|||
|- |
|||
| bgcolor="#bee3ff" | 4711 |
|||
| bgcolor="#bee3ff" | 3 |
|||
| Cowboys & Kisses |
|||
|- |
|||
| bgcolor="#bee3ff" | 4712 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| Shine On You Crazy Diamond |
|||
|- |
|||
| bgcolor="#bee3ff" | 4713 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| I’m Outta Love |
|||
|} |
|||
|}Die Relation wird aufgeteilt, wobei die beiden voneinander abhängigen Daten in eine eigene Tabelle ausgelagert werden. Der Schlüssel der neuen Tabelle muss als Fremdschlüssel in der alten Tabelle erhalten bleiben. |
|||
An der Tabelle „Lied“ wurden keine Änderungen bei der Übertragung in die 3. Normalform vorgenommen. Sie ist hier nur der Vollständigkeit halber gelistet. |
|||
=== 3. Normalform (3NF) === |
|||
Die dritte Normalform ist erreicht, wenn man in den [[Relation (Datenbanktechnik)|Relationen]] keine ''transitiven Abhängigkeiten'' hat. Hierbei handelt es sich um eine Abhängigkeit, bei der ein [[Attribut]] über ein anderes Attribut vom [[Primärattribut]] der Relation abhängig ist. D.h. wenn Attribut P2 von Attribut P1 (dem Primärattribut) abhängt und Attribut A1 hängt von P2 ab, dann ist es transitiv abhängig von P1. Siehe auch: [[Transitivität (Mathematik)]]. |
|||
=== Boyce-Codd-Normalform (BCNF) === |
|||
'''Beispiel:''' <br/> |
|||
==== Erläuterung ==== |
|||
Gegeben sei eine Firma, die in [[Abteilung (Organisation)|Abteilung]]en unterteilt ist. Innerhalb jeder Abteilung gibt es mehrere [[Kostenstelle|Kostenstellen]]. Eine Kostenstelle ist aber nur einer Abteilung zugeordnet. Es existiert eine Personaltabelle, die unter anderem folgende Felder enthält: |
|||
Ein Relationenschema ist in der Boyce-Codd-Normalform, wenn es in der 3NF ist und jede [[Determinante (Informatik)|Determinante]] (Attributmenge, von der andere Attribute funktional abhängen) ein Schlüsselkandidat ist (oder die Abhängigkeit ist trivial). |
|||
Die BCNF (nach [[Raymond F. Boyce]] und [[Edgar F. Codd]]) verhindert, dass Teile zweier aus mehreren Feldern zusammengesetzten Schlüsselkandidaten voneinander abhängig sind. |
|||
{| border=1 |
|||
|+ '''Personal''' |
|||
Die Überführung in die BCNF ist zwar immer verlustfrei möglich, aber nicht immer abhängigkeitserhaltend. Die ''Boyce-Codd-Normalform'' war ursprünglich als Vereinfachung der 3NF gedacht, führte aber zu einer neuen Normalform, die diese verschärft: Eine Relation ist automatisch frei von transitiven Abhängigkeiten, wenn alle Determinanten Schlüsselkandidaten sind. |
|||
!Pers_Nr |
|||
!Pers_Vorname |
|||
==== Negativbeispiel: BCNF verletzt ==== |
|||
!Pers_Name |
|||
In diesem Beispiel gibt es eine einfache Datenbank, in der die Vereinszugehörigkeit von Sportlern gespeichert wird. Es sollen die folgenden Bedingungen gelten: |
|||
!Pers_Abteilung |
|||
!Pers_Kostenstelle |
|||
* jeder Verein bietet nur eine Sportart an. |
|||
* ein Sportler kann in verschiedenen Vereinen spielen, aber nur, wenn diese Vereine unterschiedliche Sportarten anbieten. Damit wird sichergestellt, dass der Sportler nie gegen einen Verein spielt, in dem er selbst Mitglied ist. |
|||
{| class="wikitable" |
|||
|+ Sportler |
|||
! style="background:#FFFFFF"| Name |
|||
! style="background:#6DBFFF"| Sportart |
|||
! Verein |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | Schuster |
|||
|123 |
|||
| bgcolor="#bee3ff" | Fußball |
|||
|Reiner |
|||
| FC Musterhausen |
|||
|Zufall |
|||
|Einkauf |
|||
|2004 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | Leitner |
|||
|144 |
|||
| bgcolor="#bee3ff" | Fußball |
|||
|Frank |
|||
| FC Musterhausen |
|||
|Frei |
|||
|Verkauf |
|||
|2006 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | Leitner |
|||
|146 |
|||
| bgcolor="#bee3ff" | Eishockey |
|||
|Susi |
|||
| EC Beispielstadt |
|||
|Sorglos |
|||
|} |
|||
|Einkauf |
|||
|2004 |
|||
Aus den oben genannten Bedingungen folgt, dass das Attribut Sportart funktional abhängig vom Attribut Verein ist (Verein → Sportart), d. h. Verein ist eine Determinante. Jedoch ist Verein kein Schlüsselkandidat. |
|||
Mögliche Schlüsselkandidaten sind {Name,Verein} und {Name,Sportart}. Eine Konvertierung in BCNF ist möglich, indem (Name, Verein) als Primärschlüssel verwendet und die Relation aufgeteilt wird: |
|||
==== Lösung ==== |
|||
{| border="0" |
|||
|- style="vertical-align:top" |
|||
| |
|||
{| class="wikitable" |
|||
|+ Sportler |
|||
! style="background:#FFFFFF"| Name |
|||
! style="background:#6DBFFF"| Verein |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | Schuster |
|||
|148 |
|||
| bgcolor="#bee3ff" | FC Musterhausen |
|||
|Frey |
|||
|- |
|||
|Erfunden |
|||
| bgcolor="#bee3ff" | Leitner |
|||
|Einkauf |
|||
| bgcolor="#bee3ff" | FC Musterhausen |
|||
|2005 |
|||
|- |
|||
| bgcolor="#bee3ff" | Leitner |
|||
| bgcolor="#bee3ff" | EC Beispielstadt |
|||
|} |
|||
| |
|||
| |
|||
{| class="wikitable" |
|||
|+ Verein |
|||
! style="background:#6DBFFF"| Verein |
|||
! Sportart |
|||
|- |
|||
| bgcolor="#bee3ff" | FC Musterhausen |
|||
| Fußball |
|||
|- |
|||
| bgcolor="#bee3ff" | EC Beispielstadt |
|||
| Eishockey |
|||
|} |
|||
|} |
|} |
||
==== Zerlegungsalgorithmus ==== |
|||
Da die Abteilung '''Einkauf''' die Kostenstelle '''2004''' hat, kann keine andere Abteilung diese Kostenstelle haben. Dementsprechend geht aus dem Attribut Kostenstelle in der Relation die Abteilung eindeutig hervor. Diese ist damit von der Kostenstelle abhängig und nur indirekt von der Personalnummer. |
|||
Es existiert ein [[Algorithmus]], der relationale Schemata durch Zerlegung (engl. decomposition) in die Boyce-Codd-Normalform überführt. Alle Schemata werden dabei solange aufgespalten, bis keines mehr die BCNF bricht. Jede Aufspaltung erfolgt anhand einer, die BCNF verletzenden, funktionalen Abhängigkeit. Die Attribute der verletzenden Abhängigkeit bilden das erste neue Schema, und die restlichen Attribute plus die Determinante ein weiteres Schema. Die beiden neuen Schemata enthalten von den ursprünglichen funktionalen Abhängigkeiten lediglich solche, welche nur Attribute des jeweiligen Schemas nutzen, der Rest geht verloren. |
|||
Folgender Pseudocode beschreibt den Zerlegungsalgorithmus:<ref>{{Literatur |Autor=Philip M. Lewis, Arthur Bernstein, Michael Kifer |Titel=Databases and transaction processing: an application-oriented approach |Verlag=Addison-Wesley |Datum=2002 |ISBN=0-201-70872-8 |Seiten=232}}</ref> |
|||
'''Problem:''' <br/> |
|||
Damit existiert ein ähnliches Problem wie bei der zweiten Normalform: Datenredundanz. Hier kann die Tabelle derart abgeändert werden, dass zwei Mitarbeitern auf der Kostenstelle 2004 unterschiedliche Abteilungen zugewiesen werden können. |
|||
{| class="wikitable" |
|||
'''Lösung:''' <br/> |
|||
|1: || Gegeben ist ein relationales Schema <math>R = (\overline R, \mathcal{F})</math>, mit der Menge aller Attribute <math>\overline R</math> und der Menge der funktionalen Abhängigkeiten <math>\mathcal{F}</math> über diesen Attributen. |
|||
Auch hier muss die Redundanz durch das Aufteilen der Daten in zwei Tabellen aufgelöst werden. |
|||
|- |
|||
|2: || Die Ergebnismenge ''Dekomposition'', bestehend aus den zerlegten Schemata, wird mit <math>R</math> initialisiert. |
|||
|- |
|||
|3: || Solange es ein Schema <math>S</math> in der Menge ''Dekomposition'' gibt, das nicht in der BCNF ist, führe folgende Zerlegung aus: |
|||
|- |
|||
|4: || Sei <math>\overline X\overline Y\subseteq\overline S</math> eine Attributmenge für die eine funktionale Abhängigkeit <math>\overline X\rightarrow \overline Y</math> definiert ist, welche der BCNF widerspricht. |
|||
|- |
|||
|5: || Ersetze <math>S</math> in der Ergebnismenge ''Dekomposition'' durch zwei neue Schemata <math>S_1 = (\overline X\overline Y, \mathcal{F}_1)</math>, ein Schema bestehend nur aus den Attributen der Abhängigkeit, welche die BCNF ursprünglich verletzt hat; und <math>S_2 = ((\overline S - \overline Y) \cup \overline X, \mathcal{F}_2)</math>, ein Schema mit allen Attributen, außer denen die nur in der abhängigen Menge <math>\overline Y</math> und nicht in der Determinante <math>\overline X</math> enthalten sind. Die Menge der funktionalen Abhängigkeiten <math>\mathcal{F}_1</math> enthält nur noch die Abhängigkeiten, welche lediglich Attribute aus <math>\overline X\overline Y </math> enthalten, entsprechendes gilt für <math>\mathcal{F}_2</math>. Damit fallen alle Abhängigkeiten weg, welche Attribute aus beiden Schemata benötigen. |
|||
|- |
|||
|6: || '''Ergebnis:''' ''Dekomposition'' – eine Menge von relationalen Schemata, welche in der BCNF sind. |
|||
|} |
|||
<u>Durchlauf des Algorithmus am obigen Beispiel</u> (ohne Darstellung aller trivialen Abhängigkeiten): |
|||
{| |
|||
* '''1:''' R = ( { Name, Sportart, Verein }, { ( { Name, Sportart } → { Verein } ), ( { Verein } → { Sportart } ), ( { Name, Verein } → { Name, Verein } ) } ) |
|||
|valign=top| |
|||
* '''2:''' ''Dekomposition'' = { R } |
|||
{| border=1 |
|||
* '''3:''' da R aus ''Dekomposition'' nicht die BCNF erfüllt mache folgendes: |
|||
|+ '''Personal''' |
|||
** '''4,5:''' { Verein } → { Sportart } ist die Abhängigkeit, die die Verletzung der BCNF bedingt, damit ist <math>S_1</math> = ( { Verein, Sportart }, { ( { Verein } → { Sportart }) } ) und <math>S_2</math> = ( { Name, Verein }, { ( { Name, Verein } → { Name, Verein } ) } ) |
|||
!Pers_Nr |
|||
* '''6:''' Ergebnis: <math>\text{Dekomposition} := \{ S_1, S_2 \}</math> |
|||
!Pers_Vorname |
|||
!Pers_Name |
|||
==== Unterschied zur 3NF ==== |
|||
!Pers_Kostenstelle |
|||
Die BCNF-Normalform ist strenger hinsichtlich der erlaubten funktionalen Abhängigkeiten: in Relationsschemata in 3NF können einige Informationen doppelt vorkommen, in der BCNF jedoch nicht. |
|||
=== Vierte Normalform (4NF) === |
|||
==== Erläuterung ==== |
|||
Ein Relationenschema ist dann in der 4. Normalform, wenn es in der BCNF ist und nur noch triviale [[mehrwertige Abhängigkeit]]en (MWA) enthält. |
|||
Einfach ausgedrückt: Es darf innerhalb einer Relation nicht mehrere ''1:n''- oder ''m:n''-Beziehungen zu einem Schlüsselwert geben, die thematisch/inhaltlich nichts miteinander zu tun haben. Gehört etwa zu einem Schlüsselwert ''i''-mal Attribut ''a'', aber '''davon unabhängig''' auch ''j''-mal Attribut ''b'', ist die 4NF verletzt. |
|||
Anschaulich ausgedrückt: Die 4NF untersucht n-äre Beziehungen (mehr als zwei Tabellen stehen gleichzeitig in Beziehung) und ob diese korrekt modelliert wurden. |
|||
==== Negativbeispiel: 4NF verletzt ==== |
|||
{| class="wikitable" |
|||
|+ Besitzt |
|||
! style="background:#BEE3FF"| Personnummer |
|||
! style="background:#BEE3FF"| Haustier |
|||
! style="background:#BEE3FF"| Fahrzeug |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 1 |
|||
|123 |
|||
| bgcolor="#bee3ff" | Katze |
|||
|Reiner |
|||
| bgcolor="#bee3ff" | Volkswagen |
|||
|Zufall |
|||
|2004 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 1 |
|||
|144 |
|||
| bgcolor="#bee3ff" | Katze |
|||
|Frank |
|||
| bgcolor="#bee3ff" | Ferrari |
|||
|Frei |
|||
|2006 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 1 |
|||
|146 |
|||
| bgcolor="#bee3ff" | Hamster |
|||
|Susi |
|||
| bgcolor="#bee3ff" | Volkswagen |
|||
|Sorglos |
|||
|2004 |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 1 |
|||
|148 |
|||
| bgcolor="#bee3ff" | Hamster |
|||
|Frey |
|||
| bgcolor="#bee3ff" | Ferrari |
|||
|Erfunden |
|||
|- |
|||
|2005 |
|||
| bgcolor="#bee3ff" | 2 |
|||
| bgcolor="#bee3ff" | Hund |
|||
| bgcolor="#bee3ff" | Porsche |
|||
|} |
|} |
||
|valign=top| |
|||
Zu einer Personennummer gibt es mehrere Haustiere und Fahrzeuge. Haustiere und Fahrzeuge einer Person haben aber prinzipiell nichts miteinander zu tun; man sagt, sie sind »voneinander unabhängig«. |
|||
{| border=1 |
|||
Als Primärschlüssel kommt nur eine Kombination aus allen drei Attributen in Frage, somit ist die Tabelle in 3NF. |
|||
|+ '''Kostenstellen''' |
|||
Personnummer → Haustier ist dabei eine mehrwertige Abhängigkeit, Personnummer → Fahrzeug auch. |
|||
!KST_Nr |
|||
Da diese beiden MWAs unabhängig voneinander sind, ist die 4NF verletzt. |
|||
!KST_Abteilung |
|||
[[Datei:4NF Beispiel.PNG|mini|Beispiel 4NF]] |
|||
Die Beispielgrafik zeigt die fehlerhafte Modellierung der mehrwertigen Abhängigkeiten und die korrekte Lösung. Zwischen Haustier und Fahrzeug besteht keine Beziehung, somit war die Beziehung „besitzt“ falsch modelliert. |
|||
==== Lösung ==== |
|||
{| border="0" |
|||
|- style="vertical-align:top" |
|||
| |
|||
{| class="wikitable" |
|||
|+ Füttert |
|||
! style="background:#BEE3FF"| Personnummer |
|||
! style="background:#BEE3FF"| Haustier |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 1 |
|||
|2004 |
|||
| bgcolor="#bee3ff" | Katze |
|||
|Einkauf |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 1 |
|||
|2005 |
|||
| bgcolor="#bee3ff" | Hamster |
|||
|Einkauf |
|||
|- |
|- |
||
| bgcolor="#bee3ff" | 2 |
|||
|2006 |
|||
| bgcolor="#bee3ff" | Hund |
|||
|Verkauf |
|||
|} |
|||
| |
|||
{| class="wikitable" |
|||
|+ Fährt |
|||
! style="background:#BEE3FF"| Personnummer |
|||
! style="background:#BEE3FF"| Fahrzeug |
|||
|- |
|||
| bgcolor="#bee3ff" | 1 |
|||
| bgcolor="#bee3ff" | Volkswagen |
|||
|- |
|||
| bgcolor="#bee3ff" | 1 |
|||
| bgcolor="#bee3ff" | Ferrari |
|||
|- |
|||
| bgcolor="#bee3ff" | 2 |
|||
| bgcolor="#bee3ff" | Porsche |
|||
|} |
|} |
||
|} |
|} |
||
==== Hinweis ==== |
|||
=== Boyce / Codd Normalform (BCNF) === |
|||
Folgendes Relationsschema erfüllt die 4NF, obwohl auch hier mehrere MWAs vorliegen: |
|||
{| class="wikitable" |
|||
|+ Elternschaft |
|||
! style="background:#BEE3FF"| Person |
|||
! Partner |
|||
! Kind |
|||
|- |
|||
| bgcolor="#bee3ff" | 1 |
|||
| bgcolor="#bee3ff" | 2 |
|||
| bgcolor="#bee3ff" | Gabi |
|||
|- |
|||
| bgcolor="#bee3ff" | 1 |
|||
| bgcolor="#bee3ff" | 81 |
|||
| bgcolor="#bee3ff" | Peter |
|||
|- |
|||
| bgcolor="#bee3ff" | 1 |
|||
| bgcolor="#bee3ff" | 99 |
|||
| bgcolor="#bee3ff" | Hilbert |
|||
|- |
|||
| bgcolor="#bee3ff" | 2 |
|||
| bgcolor="#bee3ff" | 1 |
|||
| bgcolor="#bee3ff" | Gabi |
|||
|- |
|||
| bgcolor="#bee3ff" | 2 |
|||
| bgcolor="#bee3ff" | 77 |
|||
| bgcolor="#bee3ff" | Hans |
|||
|} |
|||
Person → Partner und Person → Kind sind zwar zwei MWAs, aber diese beiden sind auch untereinander abhängig: Partner → Kind. |
|||
Die ''[[Boyce]]/[[Edgar F. Codd|Codd]]'' Normalform war ursprünglich als Vereinfachung der dritten Normalform gedacht, fasst diese jedoch schärfer und führte so zu einem neuen Typ der Normalform. |
|||
Solche untereinander abhängigen MWAs werden erst in 5NF gelöst. |
|||
=== Fünfte Normalform (5NF) === |
|||
Relationen, die sich in der BCNF befinden, sind von [[Anomalie]]n befreit, die noch in der 3NF auftreten konnten. Eine Relation ist dann in BCNF, wenn sie die Voraussetzungen der 3NF erfüllt und gleichzeitig jede [[Determinante (Datenbank)|Determinante]] Schlüsselkandidat ist. |
|||
==== Erläuterung ==== |
|||
Eine Relation ist in 5NF, wenn sie in der 4NF ist und keine mehrwertigen Abhängigkeiten enthält, die voneinander abhängig sind. |
|||
Einfach ausgedrückt: Es darf innerhalb einer Relation nicht mehrere ''1:n''- oder ''m:n''-Beziehungen zu einem Schlüsselwert geben, die thematisch/inhaltlich miteinander verknüpft sind. Gehört etwa zu einem Schlüsselwert ''i''-mal Attribut ''a'', aber '''davon abhängig''' auch ''j''-mal Attribut ''b'', ist die 5NF verletzt. |
|||
Beispiel: |
|||
{| border="1" |
|||
Die 5NF verlangt also vereinfachte Relationen, aus denen aber durch [[Relationale Algebra#Projektion|Projektions]]- und [[Relationale Algebra#Join|Verbundoperationen]] ''alle'' Informationen der ursprünglichen Relation wiederherstellbar sein müssen. Sie ist somit sehr generell gehalten und dadurch (vorerst) die letzte Normalform. So können Relationen in einzelne Abfragen aufgeteilt werden und durch spätere Verbundsoperationen wieder zusammengefügt werden, wobei eine Teilmenge des so genannten [[Kartesisches Produkt|kartesischen Produkts]] entsteht. |
|||
|+ '''Kostenstellen''' |
|||
!KST_Nr |
|||
Die 5NF unterstützt insoweit die Konsistenz, als dass sich durch das Aufteilen auch neue Kombinationen ergeben können, falls beim Hinzufügen einer Information sich theoretisch auch andere Kombinationen ergeben würden, die aber nicht berücksichtigt werden, wenn alle Attribute in einer einzigen Tabelle der Relation stehen. |
|||
!KST_Abteilung |
|||
!KST_Leiter |
|||
==== Negativbeispiel: 5NF verletzt ==== |
|||
Die folgende Relation zeigt, welche Lieferanten welche Bauteile an welches Projekt liefern können: |
|||
{| class="wikitable" |
|||
! Lieferant |
|||
! Teil |
|||
! Projekt |
|||
|- |
|- |
||
| Müller |
|||
|2004 |
|||
| Schraube |
|||
|Einkauf |
|||
| Projekt 1 |
|||
|Schmidt |
|||
|- |
|- |
||
| Müller |
|||
|3006 |
|||
| Nagel |
|||
|Verkauf |
|||
| Projekt 2 |
|||
|Maier |
|||
|- |
|- |
||
| Maier |
|||
|3008 |
|||
| Nagel |
|||
|Marketing |
|||
| Projekt 1 |
|||
|Maier |
|||
|} |
|} |
||
Die Relation muss weiter zerteilt werden, denn es ist auch vom Projekt abhängig, welche Teile bei diesem benötigt werden. Wichtig ist auch, dass sich die Relation aufteilen lässt, ohne dass Informationen verloren gehen. |
|||
Die Entität KST_Nr beeinflusst in diesem Beispiel zusammen mit KST_Abteilung das Feld KST_Leiter. Dies ist eine funktionale Abhängigkeit. Desweiteren bestimmt das Feld KST_Leiter, welche erste Ziffer KST_Nr hat. "Schmidt" hat immer die 2, Maier immer die 3 usw. |
|||
==== Lösung ==== |
|||
Durch diese Konstellation ist die Relation nur in 3NF, nicht in BCNF. Wenn die transitive Abhängigkeit gelöst wird, und die im Beispiel aufgeführte Relation in zwei Relationen aufgeteilt wird, ist die Datenbank in BCNF. |
|||
Um diese Relation in die 5. Normalform umzuwandeln, müssen drei Relationen erstellt werden (Lieferant–Teil, Teil–Projekt und Lieferant–Projekt). |
|||
* Welche Teile kann welcher Lieferant liefern? |
|||
=== 4. Normalform (4NF) === |
|||
{| class="wikitable" |
|||
|+ Lieferant-Teil |
|||
! Lieferant |
|||
! Teil |
|||
|- |
|||
| Müller |
|||
| Schraube |
|||
|- |
|||
| Müller |
|||
| Nagel |
|||
|- |
|||
| Maier |
|||
| Nagel |
|||
|} |
|||
* Welche Teile werden von welchem Projekt benötigt? |
|||
Die 4. Normalform beschreibt vor allem die Mehrwertige Abhängigkeit, und welche Anomalien dadurch auftreten können. Eine Datenbank ist dann in der 4. Normalform, wenn Sie nur noch triviale mehrwertige Abhängigkeiten enthält. |
|||
{| class="wikitable" |
|||
|+ Teil-Projekt |
|||
! Teil |
|||
! Projekt |
|||
|- |
|||
| Schraube |
|||
| Projekt 1 |
|||
|- |
|||
| Nagel |
|||
| Projekt 2 |
|||
|- |
|||
| Nagel |
|||
| Projekt 1 |
|||
|} |
|||
* Welche Projekte können von welchem Lieferanten beliefert werden? |
|||
Beispiel: |
|||
{| |
{| class="wikitable" |
||
|+ Lieferant-Projekt |
|||
|+'''Standort''' |
|||
! Lieferant |
|||
!Standortsnummer |
|||
! Projekt |
|||
!Standortsname |
|||
!Stadt |
|||
|- |
|- |
||
| Müller |
|||
|10001 |
|||
| |
| Projekt 1 |
||
|Stuttgart |
|||
|- |
|- |
||
| Müller |
|||
|20003 |
|||
| Projekt 2 |
|||
|Verwaltung |
|||
|Berlin |
|||
|- |
|- |
||
| Maier |
|||
|30012 |
|||
| Projekt 1 |
|||
|Vertrieb |
|||
|München |
|||
|} |
|} |
||
==== Hinweis ==== |
|||
Die Standortsnummer bestimmt den Namen des [[Standort]]s. In dieser Relation würde die Standortsnummer aber auch noch den Namen der [[Stadt]] beeinhalten, welcher sich aber vom Standortsnamen bildet (fiktives Beispiel!). So können [[Änderungsanomalie]]n wie z.B. Einfügeanomalien oder auch Löschanomalien entstehen. Um die im Beispiel gezeigt Relation in 4NF zu überführen, müsste man zwei Relationen erstellen - einmal Standortsnummer und Standortsname, und in einer zweiten Standortsname und Stadt. |
|||
Anders als bei der Umformung zwischen den bisherigen Normalformen wird durch diese Umwandlung etwas anderes durch die neuen Relationen ausgedrückt als zuvor in der 4. Normalform. |
|||
Das merkt man leicht, wenn man die drei Relationen aus dem Beispiel oberhalb wieder vereinigt: |
|||
=== 5. Normalform (5NF) === |
|||
{| class="wikitable" |
|||
! Lieferant |
|||
! Teil |
|||
! Projekt |
|||
|- |
|||
| Müller |
|||
| Schraube |
|||
| Projekt 1 |
|||
|- |
|||
| Müller |
|||
| Nagel |
|||
| Projekt 2 |
|||
|- style="background:#6DBFFF" |
|||
| Müller |
|||
| Nagel |
|||
| Projekt 1 |
|||
|- |
|||
| Maier |
|||
| Nagel |
|||
| Projekt 1 |
|||
|} |
|||
Neu ist das [[Tupel (Informatik)|Tupel]]: Müller – Nagel – Projekt 1. |
|||
Die 5NF beschreibt diesmal keine Abhängigkeiten unter den einzelnen Attributen, sondern beschäftigt sich mit Anomalien, die durch [[Projektion]]s- und Verbundsoperationen auftreten können. So können Relationen in einzelne Abfragen aufgeteilt werden, und durch spätere Verbundsoperationen wieder zusammengefügt werden, wobei ein sog. [[kartesisches Produkt]] entsteht. |
|||
Denn Müller könnte theoretisch das Projekt 1 mit Nägeln beliefern, da |
|||
* er auch Projekt 2 mit Nägeln beliefert und |
|||
* Projekt 1 auch Nägel benötigt (die jedoch bisher von Maier geliefert wurden). |
|||
Die Überführung in 5NF ist also nur dann möglich, wenn man die Möglichkeiten der Verbindungen aus drei Beziehungen ausdrücken möchte und nicht eine konkrete Verbindung zwischen den dreien haben möchte. Diese Aufteilung ergibt bei der richtigen Anwendung neue Informationen, wie hier, dass Müller Projekt 1 auch mit Nägeln beliefern könnte. |
|||
== Bemerkungen == |
== Bemerkungen == |
||
In der Praxis der [[Datenmodell]]ierung werden die erste und dritte Normalform vom Modellierenden unwillkürlich eingehalten, wenn das Normalisierungsverfahren als alleiniges [[Modell]]ierungsverfahren benutzt wird. Die Hauptarbeit steckt in diesem Fall im Erreichen der zweiten Normalform. |
|||
Schwächen im Datenmodell aufgrund fehlender Normalisierung können – neben den typischen [[Anomalie (Informatik)|Anomalien]] – einen höheren Aufwand bei einer späteren Weiterentwicklung bedeuten. Andererseits kann beim Datenbankentwurf aus Überlegungen zur [[Rechenleistung|Performance]] bewusst auf Normalisierungsschritte verzichtet werden ([[Denormalisierung]]). Typisches Beispiel dafür ist das [[Sternschema]] im [[Data-Warehouse]]. |
|||
Eine mögliche Herangehensweise an die Erstellung eines Datenmodells ist die Benutzung des [[Entity-Relationship-Modell|Entity-Relationship-Modells]] (ERM) für die reine Erstellung und die Benutzung der Regeln der Normalisierung als Kontrollinstrument. Neben dem reinen ERM-Modell gibt es auch das [[E3R-Modell]], entwickelt von Professor [[Mario Jeckle]]. |
|||
Die Erstellung eines normalisierten Schemas wird durch automatische Ableitung aus einem konzeptuellen Datenmodell gestützt; hierzu dient in der Praxis ein erweitertes [[Entity-Relationship-Modell]] (ERM) oder ein Klassendiagramm der [[Unified Modeling Language]] (UML) als Ausgangspunkt. Das aus dem konzeptionellen Entwurf abgeleitete Relationenschema kann dann mit Hilfe der Normalisierungen überprüft werden; es existieren jedoch Formalismen und Algorithmen, die diese Eigenschaft bereits sicherstellen können. |
|||
Statt des ursprünglichen von [[Peter Chen]] 1976 entwickelten ER-Modells werden heute erweiterte ER-Modelle verwendet: Das [[Structured-Entity-Relationship-Modell|Structured-ERM]] (SERM), das E3R-Modell, das [[Extended-Entity-Relationship-Modell|EER-Modell]] sowie das von der SAP AG verwendete SAP-SERM. |
|||
Befindet sich ein Relationenschema nicht in der 1NF, so nennt man diese Form auch [[Non-First-Normal-Form]] ([[NF2-Relationen|NF²]]) oder [[Unnormalisierte Form]] (UNF). |
|||
Der Prozess der Normalisierung und Zerlegung einer Relation in die 1NF, 2NF und 3NF muss die Wiederherstellbarkeit der ursprünglichen Relation erhalten, das heißt die Zerlegung muss [[Verbundtreue|verbundtreu]] und [[Abhängigkeitstreue|abhängigkeitstreu]] sein. |
|||
== Merkregeln == |
|||
# Ist die Relation in 1. Normalform und besteht der Primärschlüssel aus nur einem Attribut und gibt es keinen anderen Schlüssel, der aus mehreren Attributen besteht, so liegt automatisch die 2. Normalform vor. |
|||
# Ist eine Relation in 2. Normalform und besitzt sie außer dem Primärschlüssel höchstens ein weiteres Attribut, das nicht Teil eines Schlüssels ist, so liegt die Tabelle in 3. Normalform vor. |
|||
== Literatur == |
|||
* Ramez Elmasri, Shamkant B. Navathe: ''Grundlagen von Datenbanksystemen.'' Pearson Studium, 2002, ISBN 3-8273-7021-3 |
|||
* [[Alfons Kemper]], Andre Eickler: ''Datenbanksysteme. Eine Einführung.'' Oldenbourg, München 2004, ISBN 3-486-27392-2 |
|||
* Stefan M. Lang, Peter C. Lockemann: ''Datenbankeneinsatz.'' Springer, Berlin u. a. 1995, ISBN 3-540-58558-3. |
|||
== Weblinks == |
== Weblinks == |
||
* [http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap4.htm ''Der Königsweg: Normalisierung''.] [[Hochschule der Medien Stuttgart]] |
|||
* http://www.itse-guide.de/artikel/25 |
|||
* [https://support.microsoft.com/de-de/help/283878/description-of-the-database-normalization-basics ''Grundlagen der Datenbanknormalisierung''.] Microsoft Hilfe und Support |
|||
* http://www.uni-hildesheim.de/rz/DOC/mySQL/mysql-255.html |
|||
* [http://www.tinohempel.de/info/info/datenbank/normalisierung.htm ''Normalisierung von Datenbanken''.] Richard-Wossidlo-Gymnasium Ribnitz-Damgarten |
|||
* http://www.rent-a-database.de/mysql/mysql-256.html |
|||
* [http://www.ziemers.de/datenbanken/normalformen.html ''Erklärung der Normalformen''.] Ziemer’s Informatik |
|||
* http://www.little-idiot.de/mysql/mysql-258.html |
|||
* http://home.t-online.de/home/dieter.spiess/informatik/datenbanken/normalisierung<!--sic!-->.htm |
|||
== Einzelnachweise == |
|||
* http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap4.htm |
|||
<references /> |
|||
[[Kategorie:Datenbankmodellierung]] |
|||
[[en:Database normalization]] |
|||
[[Kategorie:Datenbanktheorie]] |
|||
[[fi:Tietokannan normalisointi]] |
Aktuelle Version vom 29. Juni 2025, 15:23 Uhr
Normalisierung ist ein Entwurfsansatz für relationale Datenbanken mit dem Zweck, redundante Speicherung von Informationen und damit Inkonsistenz und Anomalien zu vermeiden. Die Methode strukturiert die Daten anhand einer Folge von Regeln – „Normalformen“ genannt – die aufeinander aufbauen und formale Anforderungen an das Schema bestimmen.
Die vorgenannten Regeln können bereits beim Entwurf beachtet werden (auch unterstützt z. B. durch Werkzeuge für die semantische Datenmodellierung). Zunächst nach Gutdünken entworfene Relationen können in einem nachfolgenden Schritt unter Beachtung der Normalformen jeweils in eine normalisierte Gestalt überführt werden; dafür gibt es Algorithmen (wie etwa den Synthesealgorithmus (3NF), den Zerlegungsalgorithmus (BCNF) usw.), welche automatisiert werden können. Hierbei werden die Relationen bei Bedarf anhand ihrer funktionalen Abhängigkeiten in einfachere zerlegt, bis keine weitere Zerlegung (ohne Verlust an Information) mehr möglich ist. Mit dem Satz von Delobel kann man für einen Zerlegungsschritt formal nachweisen bzw. prüfen, welche Zerlegung keine Datenverluste mit sich bringt.
Es gibt verschiedene Ausmaße, in denen ein Datenbankschema gegen Anomalien gefeit sein kann. In diesem Zusammenhang spricht man davon, dass „es in erster, zweiter, dritter usw. Normalform vorliege“.
Vorgehen
[Bearbeiten | Quelltext bearbeiten]Ziel: Konsistenzerhöhung durch Redundanzvermeidung
[Bearbeiten | Quelltext bearbeiten]
Bei der Normalisierung werden zunächst Spalten (synonyme Begriffe: Felder, Attribute) von Tabellen innerhalb von Bereichen der Datenschemata in neue Spalten aufgeteilt, z. B. Adressen in Postleitzahl, Ort und Straße. Anschließend werden Tabellen aufgeteilt, zum Beispiel eine Tabelle
tbl_AdressenAlles mit den Feldern Firma, Straße, PLZ und Ort in diese Tabellen:
- tbl_Adressen mit den Feldern AdressID, Firma, Straße und PLZ
- tbl_PLZOrt mit den Feldern PLZ und Ort
Siehe Bild Aufspaltung der Tabelle tbl_AdressenAlles – wobei die Tabelle tbl_Adressen noch den eindeutigen Primärschlüssel AdressID erhält.
Hinweis: In diesem Beispiel wird angenommen, dass es zu jeder Postleitzahl nur jeweils einen Ortsnamen gibt, was in Deutschland jedoch sehr oft nicht zutrifft – bspw. in ländlichen Gebieten, wo sich mitunter bis zu 100 Orte eine Postleitzahl „teilen“.
Die Normalisierung hat den Zweck, Redundanzen (mehrfaches Festhalten des gleichen Sachverhalts) zu verringern und dadurch verursachte Anomalien (z. B. infolge Änderung an nicht allen Stellen) zu verhindern, um so die Aktualisierung einer Datenbank zu vereinfachen (Änderungen lediglich an einer Stelle) sowie die Konsistenz der Daten zu gewährleisten.
Beispiel
[Bearbeiten | Quelltext bearbeiten]Ein Beispiel dazu: Eine Datenbank enthält Kunden und deren Adressen sowie Aufträge, die den Kunden zugeordnet sind. Da es mehrere Aufträge vom selben Kunden geben kann, würde eine Erfassung der Kundendaten (womöglich mit Adressdaten) in der Auftragstabelle dazu führen, dass sie dort mehrfach vorkommen, obwohl der Kunde immer nur einen Satz gültiger Daten hat (Redundanz). Beispielsweise kann es dazu kommen, dass in einem Auftrag fehlerhafte Adressdaten zum Kunden eingegeben werden, im nächsten Auftrag werden die korrekten Daten erfasst. So kann es – in dieser Tabelle oder auch gegenüber anderen Tabellen – zu widersprüchlichen Daten kommen. Die Daten wären dann nicht konsistent, man wüsste nicht, welche Daten korrekt sind. Womöglich sind sogar beide Adressen nicht korrekt, weil der Kunde umgezogen ist (Lösung siehe unten).
Bei einer normalisierten Datenbank gibt es für die Kundendaten nur einen einzigen Eintrag in der Kundentabelle, mit der jeder Auftrag dieses Kunden verknüpft wird (üblicherweise über die Kundennummer). Im Falle des Umzugs eines Kunden (ein anderes Beispiel ist die Änderung der Mehrwertsteuer) gäbe es zwar mehrere Einträge in der entsprechenden Tabelle, die aber zusätzlich durch die Angabe eines Gültigkeitszeitraums unterscheidbar sind und im obigen Kundenbeispiel über die Kombination Auftragsdatum/Kundennummer eindeutig angesprochen werden können.
Ein weiterer Vorteil von Redundanzfreiheit, der bei Millionen Datensätzen einer Datenbank auch heute noch eine wichtige Rolle spielt, ist der geringere Speicherbedarf, wenn der Datensatz einer Tabelle zum Beispiel tbl_Auftrag auf einen Datensatz einer anderen Tabelle z. B. tbl_Kunde verweist, anstatt diese Daten selbst zu enthalten.
Dieses sind die Empfehlungen, die ausgehend von der Theorie der Normalisierung bei der Datenbankentwicklung gegeben werden, um vor allem Konsistenz der Daten und eine eindeutige Selektion von Daten zu gewährleisten. Die hierzu angestrebte Redundanzfreiheit steht allerdings in speziellen Anwendungsfällen in Konkurrenz zur Verarbeitungsgeschwindigkeit oder zu anderen Zielen. Es kann daher sinnvoll sein, auf eine Normalisierung zu verzichten oder diese durch eine Denormalisierung rückgängig zu machen, um
- die Verarbeitungsgeschwindigkeit (Performance) zu erhöhen oder
- Anfragen zu vereinfachen und damit die Fehleranfälligkeit zu verringern oder
- Besonderheiten von Prozessen (zum Beispiel Geschäftsprozessen) abzubilden.
In diesen Fällen sollten regelmäßig automatische Abgleichroutinen implementiert werden, um Inkonsistenzen zu vermeiden. Alternativ können die betreffenden Daten auch für Änderungen gesperrt werden.
Normalformen
[Bearbeiten | Quelltext bearbeiten]Zurzeit gebräuchliche Normalformen sind:
- 1. Normalform (1NF)
- 2. Normalform (2NF)
- 3. Normalform (3NF)
- Boyce-Codd-Normalform (BCNF)
- 4. Normalform (4NF)
- 5. Normalform (5NF)
Zum einen dienen sie der Beurteilung der Qualität eines betrachteten Datenbankschemas, zum anderen helfen sie, Fehler beim Erzeugen neuer Schemata zu vermeiden.
Außerdem können mit Hilfe der Normalisierung Datenstrukturen aus nichtrelationalen Quellen gewonnen werden, die im Sinne des Normalisierungskonzepts formal korrekt sind und die Daten aus ihren jeweiligen nichtrelationalen Quellen, aus denen sie entstanden sind (zum Beispiel Formulardaten oder Spreadsheets), aufnehmen können.
Nachfolgend werden die Kriterien der jeweiligen Normalformen erklärt. Dabei ist zu beachten, dass jede Normalform die Kriterien der vorhergehenden Normalformen mit einschließt, d. h. für die folgenden Kriterienmengen gilt: .
Erste Normalform (1NF)
[Bearbeiten | Quelltext bearbeiten]Erläuterung
[Bearbeiten | Quelltext bearbeiten]Jedes Attribut der Relation muss einen atomaren Wertebereich haben, und die Relation muss frei von Wiederholungsgruppen sein. (Anm.: statt „atomar“ wird auch die Bezeichnung „atomisch“ verwendet.)
Atomar heißt, dass zusammengesetzte, mengenwertige oder geschachtelte Wertebereiche (also Relationen wertige Attributwertebereiche) nicht erlaubt sind. In einer Relation, die sich in 1NF befindet, gibt es kein Attribut, dessen Wertebereich in weitere (sinnvolle) Teilbereiche aufgespalten werden kann.
Beispiel: Die Adresse darf nicht als einzelnes Attribut verwendet werden, sondern muss – sofern es der zugrunde liegende Prozess erfordert und erlaubt – in PLZ, Ort, Straße, Hausnummer etc. aufgeteilt werden.
Frei von Wiederholungsgruppen bedeutet, dass Attribute, die gleiche oder gleichartige Information enthalten, in eine andere Relation ausgelagert werden müssen.
Ein Beispiel für eine Wiederholungsgruppe wäre eine Spalte { Telefon }, die mehrere Telefonnummern enthält oder auch eine Spaltengruppe { Telefon1, Telefon2, Telefon3 }, wobei im letzteren Fall anzumerken ist, dass es sich dabei nicht notwendigerweise um eine Wiederholungsgruppe handeln muss (siehe Alternative Formulierungen).
Praktischer Nutzen
[Bearbeiten | Quelltext bearbeiten]Abfragen der Datenbank werden durch die 1NF erleichtert bzw. überhaupt erst ermöglicht, wenn die Attributwertebereiche atomar sind. So ist es beispielsweise in einem Feld, das einen ganzen Namensstring aus Titel, Vorname und Nachname enthält, schwierig bis unmöglich, nach Nachnamen zu sortieren.
Alternative Formulierungen
[Bearbeiten | Quelltext bearbeiten]Alle Attribute enthalten atomare Inhalte, und die Relation hat eine feste Breite. Diese Formulierung bezieht sich darauf, dass es niemals nötig sein darf, weitere Attribute in die Relation aufzunehmen, weil die Wiederholungszahl der Wiederholungsgruppe zu klein wird (z. B.: es wird bei drei Attributen Telefon1–3 eine 4. Telefonnummer für eine Person bekannt). Sie ist insofern interessant, als sie helfen kann zu entscheiden, ob tatsächlich eine Wiederholungsgruppe vorliegt: Obwohl z. B. { .., Telefon1, Telefon2, Telefon3,.. } sehr stark das Vorhandensein einer Wiederholungsgruppe impliziert, könnte es bei lediglich anderen Attributnamen klar werden, dass – freilich unter dem Licht der Anwendung – dem nicht so sein muss: { .., Telefon, Fax, Mobil,.. }
Eine weitere Variante entsteht durch folgenden Zusatz: .. und die Relation einen Primärschlüssel hat. Obwohl diese Formulierung so nicht bei Codd nachgelesen werden kann, handelt es sich um eine Erweiterung, die zu ausgesprochen praxistauglichen Datenstrukturen führt.
Negativbeispiel: 1NF verletzt
[Bearbeiten | Quelltext bearbeiten]CD_ID | Album | Gründungsjahr | Erscheinungsjahr | Titelliste |
---|---|---|---|---|
4711 | Anastacia – Not That Kind | 1999 | 2000 | {1. Not That Kind, 2. I’m Outta Love, 3. Cowboys & Kisses} |
4712 | Pink Floyd – Wish You Were Here | 1965 | 1975 | {1. Shine On You Crazy Diamond} |
4713 | Anastacia – I’m Outta Love | 1999 | 2000 | {1. I’m Outta Love} |
- Das Feld Album enthält die Attributwertebereiche Interpret und Albumtitel.
- Das Feld Titelliste enthält eine Menge von Titeln.
Dadurch hat man ohne Aufspaltung folgende Probleme bei Abfragen:
- Zur Sortierung nach Albumtitel muss das Feld Album in Interpret und Albumtitel aufgeteilt werden.
- Die Titel können (mit einfachen Mitteln) nur alle gleichzeitig als Titelliste oder gar nicht dargestellt werden.
Lösung
[Bearbeiten | Quelltext bearbeiten]CD_ID | Albumtitel | Interpret | Gründungsjahr | Erscheinungsjahr | Track | Titel |
---|---|---|---|---|---|---|
4711 | Not That Kind | Anastacia | 1999 | 2000 | 1 | Not That Kind |
4711 | Not That Kind | Anastacia | 1999 | 2000 | 2 | I’m Outta Love |
4711 | Not That Kind | Anastacia | 1999 | 2000 | 3 | Cowboys & Kisses |
4712 | Wish You Were Here | Pink Floyd | 1965 | 1975 | 1 | Shine On You Crazy Diamond |
4713 | I’m Outta Love | Anastacia | 1999 | 2000 | 1 | I’m Outta Love |
Die Attributwertebereiche werden in atomare Attributwertebereiche aufgespalten:
- Das Feld Album wird in die Felder Albumtitel und Interpret gespalten.
- Das Feld Titelliste wird in die Felder Track und Titel gespalten sowie auf mehrere Datensätze aufgeteilt.
Da jetzt jeder Attributwertebereich atomar ist sowie die Tabelle einen eindeutigen Primärschlüssel (Verbundschlüssel aus den Spalten CD_ID und Track) besitzt, befindet sich die Relation in 1NF.
Zweite Normalform (2NF)
[Bearbeiten | Quelltext bearbeiten]Erläuterung
[Bearbeiten | Quelltext bearbeiten]Eine Relation ist genau dann in der zweiten Normalform, wenn die erste Normalform vorliegt und kein Nichtprimärattribut (Attribut, das nicht Teil eines Schlüsselkandidaten ist) funktional von einer echten Teilmenge eines Schlüsselkandidaten abhängt.
Anders gesagt: Jedes nicht-primäre Attribut (nicht Teil eines Schlüssels) ist jeweils von allen ganzen Schlüsseln abhängig, nicht nur von einem Teil eines Schlüssels. Wichtig ist hierbei, dass die Nichtschlüsselattribute wirklich von allen Schlüsseln vollständig abhängen.
Somit gilt, dass Relationen in der 1NF, deren Schlüsselkandidat(en) nicht zusammengesetzt sind, sondern lediglich aus jeweils (einem) einzelnen Attribut(en) bestehen, automatisch die 2NF erfüllen.
In einer Relation R(A,B) ist das Attribut B von dem Attribut A funktional abhängig, falls zu jedem Wert des Attributs A genau ein Wert des Attributs B gehört. In einer Relation R(S1,S2,B) ist das Attribut B von den Schlüsselattributen S1 und S2 voll funktional abhängig, wenn B von den zusammengesetzten Attributen (S1,S2) funktional abhängig ist, nicht aber von einem einzelnen Attribut S1 oder S2.
Diese informelle Definition kann wie folgt präzisiert werden:
Eine Relation ist genau dann in zweiter Normalform, wenn sie
- in der ersten Normalform ist und
- für jedes Attribut der Relation gilt:
- ist Teil eines Schlüsselkandidaten oder
- ist von einem Schlüsselkandidaten abhängig und
ist nicht von einer echten Teilmenge eines Schlüsselkandidaten abhängig.
ist voll funktional abhängig von jedem Schlüsselkandidaten (wobei die Schlüsselkandidaten KC auch durch die Kombination mehrerer Attribute gebildet werden können). Die 2NF eliminiert alle partiellen funktionalen Abhängigkeiten, d. h. kein Nichtschlüsselattribut ist funktional abhängig von Teilen des Schlüsselkandidaten.
Falls ein Schlüsselkandidat zwei Attribute besitzt, können bei der Zerlegung in die 2NF höchstens drei Relationen entstehen. Falls ein Schlüsselkandidat drei Attribute besitzt, können bei der Zerlegung in die 2NF höchstens sieben Relationen entstehen. Das sind jeweils die Anzahl der Teilmengen einer gegebenen Menge minus 1 (leere Menge) und entspricht der Anzahl der Elemente der Potenzmenge () als Obergrenze.
Praktischer Nutzen
[Bearbeiten | Quelltext bearbeiten]Die 2NF erzwingt wesentlich „monothematische“ Relationen im Schema: jede Relation modelliert nur einen Sachverhalt.
Dadurch werden Redundanz und die damit einhergehende Gefahr von Inkonsistenzen reduziert. Nur noch logisch/sachlich zusammengehörige Informationen finden sich in einer Relation. Dadurch fällt das Verständnis der Datenstrukturen leichter. Jedoch wird beim Planen eines Datenmodelles die 2. Normalform meistens übersprungen, daher kommt sie, verglichen mit der 1. und 3. Normalform, eher selten vor.
Negativbeispiel: 2NF verletzt
[Bearbeiten | Quelltext bearbeiten]CD_ID | Albumtitel | Interpret | Gründungsjahr | Erscheinungsjahr | Track | Titel |
---|---|---|---|---|---|---|
4711 | Not That Kind | Anastacia | 1999 | 2000 | 1 | Not That Kind |
4711 | Not That Kind | Anastacia | 1999 | 2000 | 2 | I’m Outta Love |
4711 | Not That Kind | Anastacia | 1999 | 2000 | 3 | Cowboys & Kisses |
4712 | Wish You Were Here | Pink Floyd | 1965 | 1975 | 1 | Shine On You Crazy Diamond |
4713 | I’m Outta Love | Anastacia | 1999 | 2000 | 1 | I’m Outta Love |
- Der Primärschlüssel der Relation ist aus den Feldern CD_ID und Track zusammengesetzt. (Grundsätzlich darf ein Primärschlüssel aus mehreren Attributen bestehen, jedoch entsteht daraus im genannten Beispiel ein Konflikt.)
- Die Felder Albumtitel, Interpret, Gründungs- und Erscheinungsjahr sind vom Feld CD_ID abhängig, aber nicht vom Feld Track. Dieser (Punkt 2) verletzt die 2. Normalform, da die vier nicht-primären Attribute nicht nur von einem Teil des Schlüssels (hier CD_ID) abhängen dürfen. Wäre der Schlüssel nicht zusammengesetzt (siehe Punkt 1), so könnte dies nicht passieren.
Probleme, die sich daraus ergeben
[Bearbeiten | Quelltext bearbeiten]Die Informationen aus diesen drei Feldern sind, wie am Beispiel der CD Not That Kind zu erkennen, mehrfach vorhanden, d. h. redundant. Dadurch besteht die Gefahr, dass die Integrität der Daten verletzt wird. So könnte man den Albumtitel für das Lied Not That Kind in I Don’t Mind ändern, ohne jedoch die entsprechenden Einträge für die Titel I’m Outta Love und Cowboys & Kisses zu ändern (Update-Anomalie).
CD_ID | Albumtitel | Interpret | Gründungsjahr | Erscheinungsjahr | Track | Titel |
---|---|---|---|---|---|---|
4711 | I Don’t Mind | Anastacia | 1999 | 2000 | 1 | Not That Kind |
4711 | Not That Kind | Anastacia | 1999 | 2000 | 2 | I’m Outta Love |
4711 | Not That Kind | Anastacia | 1999 | 2000 | 3 | Cowboys & Kisses |
4712 | Wish You Were Here | Pink Floyd | 1965 | 1975 | 1 | Shine On You Crazy Diamond |
4713 | I’m Outta Love | Anastacia | 1999 | 2000 | 1 | I’m Outta Love |
In diesem Fall wäre ein Zustand erreicht, den man als Dateninkonsistenz bezeichnet. Über die komplette Tabelle betrachtet, „passen“ die Daten nicht mehr zusammen.
Lösung
[Bearbeiten | Quelltext bearbeiten]Die Daten in der Tabelle werden in zwei Tabellen aufgeteilt: CD und Lied. Die Tabelle CD enthält nur noch Felder, die voll funktional von CD_ID abhängen, hat also CD_ID als Primärschlüssel. Auch der Albumtitel allein sei eindeutig, also ein Schlüsselkandidat. Da keine weiteren (zusammengesetzten) Schlüsselkandidaten existieren, liegt die Tabelle damit automatisch in der 2. Normalform vor. Die Tabelle „Lied“ enthält schließlich nur noch Felder, die voll funktional von CD_ID und Track abhängen, liegt also auch in der 2. Normalform vor. Mit Hilfe dieser verlustfreien Zerlegung sind auch die genannten Redundanzen der Daten beseitigt.
|
|
Das Attribut CD_ID aus der Tabelle Lied bezeichnet man als Fremdschlüssel, der auf den Primärschlüssel der Tabelle CD verweist. Zugleich stellen die Attribute CD_ID und Track den zusammengesetzten Primärschlüssel der Tabelle Lied dar.
Dritte Normalform (3NF)
[Bearbeiten | Quelltext bearbeiten]Erläuterung
[Bearbeiten | Quelltext bearbeiten]Eine Relation befindet sich in der 3. Normalform, wenn sie die 2. NF erfüllt und keine funktionalen Abhängigkeiten der Nichtschlüssel-Attribute (hellgraue Zellen in der Tabelle) untereinander bestehen. Solche Abhängigkeiten bezeichnet man auch als transitive Abhängigkeiten. Weiterhin müssen alle Nichtschlüssel voll funktional abhängig vom Schlüsselattribut sein.
Ein Attribut ist vom Schlüsselkandidaten transitiv abhängig, wenn es eine Attributmenge gibt, sodass und .
Hierbei handelt es sich um eine Abhängigkeit, bei der ein Attribut über eine Attributmenge von einem Schlüsselkandidaten der Relation abhängig ist (ohne dass zugleich auch direkt von abhängig, also ein Schlüsselkandidat ist). Das heißt: Wenn die Attributmenge von der Attributmenge abhängt und Attribut von , dann ist transitiv abhängig von . Formal ausgedrückt: .
Einfach gesagt: Ein Nichtschlüsselattribut darf nicht von einer Menge aus Nichtschlüsselattributen abhängig sein. Ein Nichtschlüsselattribut darf also nur direkt von einem Primärschlüssel (bzw. einem Schlüsselkandidaten) abhängig sein.
Siehe auch: Transitive Relation, Synthesealgorithmus
Praktischer Nutzen
[Bearbeiten | Quelltext bearbeiten]Transitive Abhängigkeiten sind sofort ersichtlich, ohne dass man die Zusammenhänge der Daten kennen muss. Sie sind durch die Struktur der Relationen wiedergegeben.
Außerdem werden verbliebene thematische Durchmischungen in der Relation behoben: nach der 3NF sind die Relationen des Schemas zuverlässig monothematisch.
Alternative Formulierung
[Bearbeiten | Quelltext bearbeiten]Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (hellgraue Zellen in der Tabelle) Determinante ist.
Oder: Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (hellgraue Zellen in der Tabelle) von einem anderen Nichtschlüsselattribut funktional abhängig ist.
Negativbeispiel: 3NF verletzt
[Bearbeiten | Quelltext bearbeiten]
|
Offensichtlich lässt sich der Interpret einer CD aus der CD_ID bestimmen, das Gründungsjahr der Band/Interpreten hängt wiederum vom Interpreten und damit transitiv von der CD_ID ab.
Das Problem ist hierbei wieder Datenredundanz. Wird zum Beispiel eine neue CD mit einem existierenden Interpreten eingeführt, so wird das Gründungsjahr redundant gespeichert.
Lösung
[Bearbeiten | Quelltext bearbeiten]
|
|
|
Diese Lösung gilt nur, wenn man davon ausgeht, dass der Interpret weltweit eindeutig ist. Ansonsten müsste man eine synthetische ID in der Tabelle Künstler hinzufügen, die dann den Fremdschlüssel in der Tabelle CD stellt, wie folgt:
|
|
|
Die Relation wird aufgeteilt, wobei die beiden voneinander abhängigen Daten in eine eigene Tabelle ausgelagert werden. Der Schlüssel der neuen Tabelle muss als Fremdschlüssel in der alten Tabelle erhalten bleiben.
An der Tabelle „Lied“ wurden keine Änderungen bei der Übertragung in die 3. Normalform vorgenommen. Sie ist hier nur der Vollständigkeit halber gelistet.
Boyce-Codd-Normalform (BCNF)
[Bearbeiten | Quelltext bearbeiten]Erläuterung
[Bearbeiten | Quelltext bearbeiten]Ein Relationenschema ist in der Boyce-Codd-Normalform, wenn es in der 3NF ist und jede Determinante (Attributmenge, von der andere Attribute funktional abhängen) ein Schlüsselkandidat ist (oder die Abhängigkeit ist trivial).
Die BCNF (nach Raymond F. Boyce und Edgar F. Codd) verhindert, dass Teile zweier aus mehreren Feldern zusammengesetzten Schlüsselkandidaten voneinander abhängig sind.
Die Überführung in die BCNF ist zwar immer verlustfrei möglich, aber nicht immer abhängigkeitserhaltend. Die Boyce-Codd-Normalform war ursprünglich als Vereinfachung der 3NF gedacht, führte aber zu einer neuen Normalform, die diese verschärft: Eine Relation ist automatisch frei von transitiven Abhängigkeiten, wenn alle Determinanten Schlüsselkandidaten sind.
Negativbeispiel: BCNF verletzt
[Bearbeiten | Quelltext bearbeiten]In diesem Beispiel gibt es eine einfache Datenbank, in der die Vereinszugehörigkeit von Sportlern gespeichert wird. Es sollen die folgenden Bedingungen gelten:
- jeder Verein bietet nur eine Sportart an.
- ein Sportler kann in verschiedenen Vereinen spielen, aber nur, wenn diese Vereine unterschiedliche Sportarten anbieten. Damit wird sichergestellt, dass der Sportler nie gegen einen Verein spielt, in dem er selbst Mitglied ist.
Name | Sportart | Verein |
---|---|---|
Schuster | Fußball | FC Musterhausen |
Leitner | Fußball | FC Musterhausen |
Leitner | Eishockey | EC Beispielstadt |
Aus den oben genannten Bedingungen folgt, dass das Attribut Sportart funktional abhängig vom Attribut Verein ist (Verein → Sportart), d. h. Verein ist eine Determinante. Jedoch ist Verein kein Schlüsselkandidat. Mögliche Schlüsselkandidaten sind {Name,Verein} und {Name,Sportart}. Eine Konvertierung in BCNF ist möglich, indem (Name, Verein) als Primärschlüssel verwendet und die Relation aufgeteilt wird:
Lösung
[Bearbeiten | Quelltext bearbeiten]
|
|
Zerlegungsalgorithmus
[Bearbeiten | Quelltext bearbeiten]Es existiert ein Algorithmus, der relationale Schemata durch Zerlegung (engl. decomposition) in die Boyce-Codd-Normalform überführt. Alle Schemata werden dabei solange aufgespalten, bis keines mehr die BCNF bricht. Jede Aufspaltung erfolgt anhand einer, die BCNF verletzenden, funktionalen Abhängigkeit. Die Attribute der verletzenden Abhängigkeit bilden das erste neue Schema, und die restlichen Attribute plus die Determinante ein weiteres Schema. Die beiden neuen Schemata enthalten von den ursprünglichen funktionalen Abhängigkeiten lediglich solche, welche nur Attribute des jeweiligen Schemas nutzen, der Rest geht verloren.
Folgender Pseudocode beschreibt den Zerlegungsalgorithmus:[1]
1: | Gegeben ist ein relationales Schema , mit der Menge aller Attribute und der Menge der funktionalen Abhängigkeiten über diesen Attributen. |
2: | Die Ergebnismenge Dekomposition, bestehend aus den zerlegten Schemata, wird mit initialisiert. |
3: | Solange es ein Schema in der Menge Dekomposition gibt, das nicht in der BCNF ist, führe folgende Zerlegung aus: |
4: | Sei eine Attributmenge für die eine funktionale Abhängigkeit definiert ist, welche der BCNF widerspricht. |
5: | Ersetze in der Ergebnismenge Dekomposition durch zwei neue Schemata , ein Schema bestehend nur aus den Attributen der Abhängigkeit, welche die BCNF ursprünglich verletzt hat; und , ein Schema mit allen Attributen, außer denen die nur in der abhängigen Menge und nicht in der Determinante enthalten sind. Die Menge der funktionalen Abhängigkeiten enthält nur noch die Abhängigkeiten, welche lediglich Attribute aus enthalten, entsprechendes gilt für . Damit fallen alle Abhängigkeiten weg, welche Attribute aus beiden Schemata benötigen. |
6: | Ergebnis: Dekomposition – eine Menge von relationalen Schemata, welche in der BCNF sind. |
Durchlauf des Algorithmus am obigen Beispiel (ohne Darstellung aller trivialen Abhängigkeiten):
- 1: R = ( { Name, Sportart, Verein }, { ( { Name, Sportart } → { Verein } ), ( { Verein } → { Sportart } ), ( { Name, Verein } → { Name, Verein } ) } )
- 2: Dekomposition = { R }
- 3: da R aus Dekomposition nicht die BCNF erfüllt mache folgendes:
- 4,5: { Verein } → { Sportart } ist die Abhängigkeit, die die Verletzung der BCNF bedingt, damit ist = ( { Verein, Sportart }, { ( { Verein } → { Sportart }) } ) und = ( { Name, Verein }, { ( { Name, Verein } → { Name, Verein } ) } )
- 6: Ergebnis:
Unterschied zur 3NF
[Bearbeiten | Quelltext bearbeiten]Die BCNF-Normalform ist strenger hinsichtlich der erlaubten funktionalen Abhängigkeiten: in Relationsschemata in 3NF können einige Informationen doppelt vorkommen, in der BCNF jedoch nicht.
Vierte Normalform (4NF)
[Bearbeiten | Quelltext bearbeiten]Erläuterung
[Bearbeiten | Quelltext bearbeiten]Ein Relationenschema ist dann in der 4. Normalform, wenn es in der BCNF ist und nur noch triviale mehrwertige Abhängigkeiten (MWA) enthält.
Einfach ausgedrückt: Es darf innerhalb einer Relation nicht mehrere 1:n- oder m:n-Beziehungen zu einem Schlüsselwert geben, die thematisch/inhaltlich nichts miteinander zu tun haben. Gehört etwa zu einem Schlüsselwert i-mal Attribut a, aber davon unabhängig auch j-mal Attribut b, ist die 4NF verletzt.
Anschaulich ausgedrückt: Die 4NF untersucht n-äre Beziehungen (mehr als zwei Tabellen stehen gleichzeitig in Beziehung) und ob diese korrekt modelliert wurden.
Negativbeispiel: 4NF verletzt
[Bearbeiten | Quelltext bearbeiten]Personnummer | Haustier | Fahrzeug |
---|---|---|
1 | Katze | Volkswagen |
1 | Katze | Ferrari |
1 | Hamster | Volkswagen |
1 | Hamster | Ferrari |
2 | Hund | Porsche |
Zu einer Personennummer gibt es mehrere Haustiere und Fahrzeuge. Haustiere und Fahrzeuge einer Person haben aber prinzipiell nichts miteinander zu tun; man sagt, sie sind »voneinander unabhängig«. Als Primärschlüssel kommt nur eine Kombination aus allen drei Attributen in Frage, somit ist die Tabelle in 3NF. Personnummer → Haustier ist dabei eine mehrwertige Abhängigkeit, Personnummer → Fahrzeug auch. Da diese beiden MWAs unabhängig voneinander sind, ist die 4NF verletzt.
Die Beispielgrafik zeigt die fehlerhafte Modellierung der mehrwertigen Abhängigkeiten und die korrekte Lösung. Zwischen Haustier und Fahrzeug besteht keine Beziehung, somit war die Beziehung „besitzt“ falsch modelliert.
Lösung
[Bearbeiten | Quelltext bearbeiten]
|
|
Hinweis
[Bearbeiten | Quelltext bearbeiten]Folgendes Relationsschema erfüllt die 4NF, obwohl auch hier mehrere MWAs vorliegen:
Person | Partner | Kind |
---|---|---|
1 | 2 | Gabi |
1 | 81 | Peter |
1 | 99 | Hilbert |
2 | 1 | Gabi |
2 | 77 | Hans |
Person → Partner und Person → Kind sind zwar zwei MWAs, aber diese beiden sind auch untereinander abhängig: Partner → Kind. Solche untereinander abhängigen MWAs werden erst in 5NF gelöst.
Fünfte Normalform (5NF)
[Bearbeiten | Quelltext bearbeiten]Erläuterung
[Bearbeiten | Quelltext bearbeiten]Eine Relation ist in 5NF, wenn sie in der 4NF ist und keine mehrwertigen Abhängigkeiten enthält, die voneinander abhängig sind.
Einfach ausgedrückt: Es darf innerhalb einer Relation nicht mehrere 1:n- oder m:n-Beziehungen zu einem Schlüsselwert geben, die thematisch/inhaltlich miteinander verknüpft sind. Gehört etwa zu einem Schlüsselwert i-mal Attribut a, aber davon abhängig auch j-mal Attribut b, ist die 5NF verletzt.
Die 5NF verlangt also vereinfachte Relationen, aus denen aber durch Projektions- und Verbundoperationen alle Informationen der ursprünglichen Relation wiederherstellbar sein müssen. Sie ist somit sehr generell gehalten und dadurch (vorerst) die letzte Normalform. So können Relationen in einzelne Abfragen aufgeteilt werden und durch spätere Verbundsoperationen wieder zusammengefügt werden, wobei eine Teilmenge des so genannten kartesischen Produkts entsteht.
Die 5NF unterstützt insoweit die Konsistenz, als dass sich durch das Aufteilen auch neue Kombinationen ergeben können, falls beim Hinzufügen einer Information sich theoretisch auch andere Kombinationen ergeben würden, die aber nicht berücksichtigt werden, wenn alle Attribute in einer einzigen Tabelle der Relation stehen.
Negativbeispiel: 5NF verletzt
[Bearbeiten | Quelltext bearbeiten]Die folgende Relation zeigt, welche Lieferanten welche Bauteile an welches Projekt liefern können:
Lieferant | Teil | Projekt |
---|---|---|
Müller | Schraube | Projekt 1 |
Müller | Nagel | Projekt 2 |
Maier | Nagel | Projekt 1 |
Die Relation muss weiter zerteilt werden, denn es ist auch vom Projekt abhängig, welche Teile bei diesem benötigt werden. Wichtig ist auch, dass sich die Relation aufteilen lässt, ohne dass Informationen verloren gehen.
Lösung
[Bearbeiten | Quelltext bearbeiten]Um diese Relation in die 5. Normalform umzuwandeln, müssen drei Relationen erstellt werden (Lieferant–Teil, Teil–Projekt und Lieferant–Projekt).
- Welche Teile kann welcher Lieferant liefern?
Lieferant | Teil |
---|---|
Müller | Schraube |
Müller | Nagel |
Maier | Nagel |
- Welche Teile werden von welchem Projekt benötigt?
Teil | Projekt |
---|---|
Schraube | Projekt 1 |
Nagel | Projekt 2 |
Nagel | Projekt 1 |
- Welche Projekte können von welchem Lieferanten beliefert werden?
Lieferant | Projekt |
---|---|
Müller | Projekt 1 |
Müller | Projekt 2 |
Maier | Projekt 1 |
Hinweis
[Bearbeiten | Quelltext bearbeiten]Anders als bei der Umformung zwischen den bisherigen Normalformen wird durch diese Umwandlung etwas anderes durch die neuen Relationen ausgedrückt als zuvor in der 4. Normalform.
Das merkt man leicht, wenn man die drei Relationen aus dem Beispiel oberhalb wieder vereinigt:
Lieferant | Teil | Projekt |
---|---|---|
Müller | Schraube | Projekt 1 |
Müller | Nagel | Projekt 2 |
Müller | Nagel | Projekt 1 |
Maier | Nagel | Projekt 1 |
Neu ist das Tupel: Müller – Nagel – Projekt 1.
Denn Müller könnte theoretisch das Projekt 1 mit Nägeln beliefern, da
- er auch Projekt 2 mit Nägeln beliefert und
- Projekt 1 auch Nägel benötigt (die jedoch bisher von Maier geliefert wurden).
Die Überführung in 5NF ist also nur dann möglich, wenn man die Möglichkeiten der Verbindungen aus drei Beziehungen ausdrücken möchte und nicht eine konkrete Verbindung zwischen den dreien haben möchte. Diese Aufteilung ergibt bei der richtigen Anwendung neue Informationen, wie hier, dass Müller Projekt 1 auch mit Nägeln beliefern könnte.
Bemerkungen
[Bearbeiten | Quelltext bearbeiten]Schwächen im Datenmodell aufgrund fehlender Normalisierung können – neben den typischen Anomalien – einen höheren Aufwand bei einer späteren Weiterentwicklung bedeuten. Andererseits kann beim Datenbankentwurf aus Überlegungen zur Performance bewusst auf Normalisierungsschritte verzichtet werden (Denormalisierung). Typisches Beispiel dafür ist das Sternschema im Data-Warehouse.
Die Erstellung eines normalisierten Schemas wird durch automatische Ableitung aus einem konzeptuellen Datenmodell gestützt; hierzu dient in der Praxis ein erweitertes Entity-Relationship-Modell (ERM) oder ein Klassendiagramm der Unified Modeling Language (UML) als Ausgangspunkt. Das aus dem konzeptionellen Entwurf abgeleitete Relationenschema kann dann mit Hilfe der Normalisierungen überprüft werden; es existieren jedoch Formalismen und Algorithmen, die diese Eigenschaft bereits sicherstellen können.
Statt des ursprünglichen von Peter Chen 1976 entwickelten ER-Modells werden heute erweiterte ER-Modelle verwendet: Das Structured-ERM (SERM), das E3R-Modell, das EER-Modell sowie das von der SAP AG verwendete SAP-SERM.
Befindet sich ein Relationenschema nicht in der 1NF, so nennt man diese Form auch Non-First-Normal-Form (NF²) oder Unnormalisierte Form (UNF).
Der Prozess der Normalisierung und Zerlegung einer Relation in die 1NF, 2NF und 3NF muss die Wiederherstellbarkeit der ursprünglichen Relation erhalten, das heißt die Zerlegung muss verbundtreu und abhängigkeitstreu sein.
Merkregeln
[Bearbeiten | Quelltext bearbeiten]- Ist die Relation in 1. Normalform und besteht der Primärschlüssel aus nur einem Attribut und gibt es keinen anderen Schlüssel, der aus mehreren Attributen besteht, so liegt automatisch die 2. Normalform vor.
- Ist eine Relation in 2. Normalform und besitzt sie außer dem Primärschlüssel höchstens ein weiteres Attribut, das nicht Teil eines Schlüssels ist, so liegt die Tabelle in 3. Normalform vor.
Literatur
[Bearbeiten | Quelltext bearbeiten]- Ramez Elmasri, Shamkant B. Navathe: Grundlagen von Datenbanksystemen. Pearson Studium, 2002, ISBN 3-8273-7021-3
- Alfons Kemper, Andre Eickler: Datenbanksysteme. Eine Einführung. Oldenbourg, München 2004, ISBN 3-486-27392-2
- Stefan M. Lang, Peter C. Lockemann: Datenbankeneinsatz. Springer, Berlin u. a. 1995, ISBN 3-540-58558-3.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Der Königsweg: Normalisierung. Hochschule der Medien Stuttgart
- Grundlagen der Datenbanknormalisierung. Microsoft Hilfe und Support
- Normalisierung von Datenbanken. Richard-Wossidlo-Gymnasium Ribnitz-Damgarten
- Erklärung der Normalformen. Ziemer’s Informatik
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Philip M. Lewis, Arthur Bernstein, Michael Kifer: Databases and transaction processing: an application-oriented approach. Addison-Wesley, 2002, ISBN 0-201-70872-8, S. 232.