Die Normalisierung erfolgt in mehreren Schritten:
Wir werden im folgenden als Beispiel die Reisekostentabelle aus
Abschnitt
3 betrachten.
Wir werden auch aufzeigen, in welche Tabelle die berechneten Datenfelder
"Gesamtvergütung" und "Summe" (siehe Formular in Abschnitt
1) aufzunehmen sind, wenn sie nicht entfernt werden.
Rechnungs-
nummer |
Datum | Name | Vorname | Straße | PLZ | Ort | Kostenart | Anzahl | Einzelvergütung |
Fettgedruckte Attribute: Primärschlüssel
Abhilfe:
Attribute mit Nicht-atomaren-Attributwerten werden in mehrere Attribute
aufgeteilt. Eine Wiederholungsgruppe wird aus der Tabelle entfernt und
in einer eigenen Tabelle untergebracht.
Unsere Reisekostentabelle enthält keine nicht-atomaren Attributwerte,
ist also bereits in der ersten Normalform.
Vollständig funktional abhängig bedeutet, daß das Nicht-Schlüsselattribut nicht nur von einem Teil der Attribute eines zusammengesetzten Schlüsselkandidaten funktional abhängig ist, sondern von allen Teilen.
Beispiel:
In der Reisekostentabelle sind die Attribute "Datum", "Name", "Vorname",
"Straße", "PLZ" und "Ort" nur funktional abhängig vom Attribut
"Rechnungsnummer" und völlig unabhängig vom Attribut "Kostenart".
Das Attribut "Einzelvergütung" ist dagegen nur funktional abhängig
von der "Kostenart" und hat nichts mit der "Rechnungsnummer" zu tun. Lediglich
das Attribut "Anzahl" ist vom zusammengesetzten Primärschlüssel
voll funktional abhängig.
Abhilfe:
Datenfelder, die von einem Schlüsselkandidaten (hier nur der Primärschlüssel)
nicht vollständig funktional abhängig sind, werden in weiteren
Tabellen untergebracht. Der Teil des Schlüsselkandidaten, von dem
ein ausgelagertes Datenfeld funktional abhängig ist, wird Primärschlüssel
der neuen Tabelle. Als Ergebnis erhalten wird die drei folgenden Tabellen.
Rechnungsnummer | Datum | Name | Vorname | Straße | PLZ | Ort |
---|---|---|---|---|---|---|
Rechnungsnummer | Kostenart | Anzahl |
---|---|---|
Kostenart | Einzelvergütung |
---|---|
Fettgedruckte Attribute: Primärschlüssel
Das berechnete Attribut "Summe" wäre hier in der Tabelle "Reise" zu führen. Das berechnete Attribut "Gesamtvergütung" kann nicht in "Positionen" geführt werden, da es nur von der "Anzahl" und der "Kostenart" funktional abhängig ist, aber nicht von der Rechnungsnummer. Das Attribut "Gesamtvergütung" könnte dann in einer weiteren Tabelle "Vergütung" mit den Attributen "Kostenart", "Anzahl" und "Gesamtvergütung" ("Kostenart" und "Anzahl" wären dann zusammengesetzter Primärschlüssel) untergebracht werden. Die berechneten Datenfelder verbleiben, falls sie mitgeführt werden, auch bei den folgenden Normalisierungen in den genannten Tabellen.
Beachten Sie:
Zwischen den Tabellen "Kostenarten" und "Positionen" besteht ebenfalls eine 1:n Beziehung, da jede in "Kostenarten" aufgeführte Kostenart mehrfach in der Tabelle "Positionen" erscheinen kann (nämlich bei verschiedenen Rechnungsnummern).
Dagegen besteht zwischen den Tabellen "Reise" und "Kostenarten" gar keine Beziehung, da sie kein gemeinsames Attribut aufweisen.
Wir werden in Abschnitt 5 näher auf
Beziehungen zwischen Tabellen eingehen.
Beispiel:
In der Tabelle "Reise" sind die Attribute "Vorname", "Straße"
und "PLZ" abhängig vom Attribut "Name", nicht vom Primärschlüssel.
Außerdem ist "Ort" abhängig von "PLZ" (X=Rechnungsnummer, Y=PLZ,
Z=Ort; zu jeder Rechnungsnummer gehört eine PLZ und zu jeder PLZ ein
Ort, also zu jeder Rechnungsnummer ein Ort).
Abhilfe:
Die transitiv abhängigen Datenfelder werden in weitere Tabellen
ausgelagert, da sie nicht direkt vom Schlüsselkandidaten abhängen,
sondern nur indirekt.
Da ein Name nicht eindeutig ist, wird jedem Angestellten eine Personalnummer
zugeordnet. Diese ist Primärschlüssel der neuen Tabelle "Personal".
Alternativ könnte ein zusammengesetzter Primärschlüssel
aus Name, Vorname und Geburtsdatum benutzt werden (dieser sollte hinreichend
eindeutig sein).
Rechnungsnummer | Datum | Personalnummer |
---|---|---|
Personalnummer | Name | Vorname | Straße | PLZ |
---|---|---|---|---|
PLZ | Ort |
---|---|
Fettgedruckte Attribute: Primärschlüssel
Wiederum besteht zwischen den Tabellen "Personal" und "Reise" sowie zwischen "PLZ" und "Personal" eine 1:n Beziehung, da ein Mitarbeiter mit einer bestimmten Personalnummer mehrere Dienstreisen machen kann und mehrere Mitarbeiter dieselbe Postleitzahl haben können.
Nach der dritten Normalisierung ergeben sich also folgende Tabellen, Datenfelder und Beziehungen:
Beachten Sie:
Die Boyce-Codd-Normalform ist eine Weiterentwicklung der Dritten Normalform. In der Dritten Normalform kann es vorkommen, daß ein Teil eines (zusammengesetzten) Schlüsselkandidaten funktional abhängig ist von einem Teil eines anderen Schlüsselkandidaten. Die Boyce-Codd-Normalform verhindert dies.
Beispiel:
Der Tabelle "Positionen" wird das Attribut "Kostenartnummer" hinzugefügt.
Dieses Attribut ist eindeutig für jede "Kostenart". Dann sind "Rechnungsnummer"
und "Kostenart" sowie "Rechnungsnummer" und "Kostenartnummer" zusammengesetzte
Schlüsselkandidaten.
Rechnungsnummer | Kostenart | Kostenartnummer | Anzahl |
---|---|---|---|
Fettgedruckte Attribute: Primärschlüssel
Kursiv gedruckte Attribute: weiterer Schlüsselkandidat
Die Relation "Positionen" ist in Erster Normalform, da sie keine Wiederholungsgruppe hat und in Zweiter Normalform, da "Anzahl" als einziges Nicht-Schlüsselattribut von beiden Schlüsselkandidaten voll funktional abhängig ist. Sie ist auch in Dritter Normalform, da es außer "Anzahl" keine weiteren Nicht-Schlüsselattribute gibt. Offensichtlich gibt es aber eine funktionale Abhängigkeit von "Kostenart" und "Kostenartnummer", die nichts mit der Rechnungsnummer zu tun hat.
Die Relation ist nicht in Boyce-Codd Normalform. Das Attribut "Kostenartnummer" ist Determinant, da "Kostenart" funktional abhängig von "Kostenartnummer" ist. Der Determinant ist aber nicht Schlüsselkandidat, sondern nur Teil eines Schlüsselkandidaten.
Abhilfe:
Aufteilung der Tabelle "Positionen" in die zwei folgenden Tabellen.
Geht man von der ursprünglichen Reisekostendatenbank aus, so würde
die Tabelle "Kostenarten" noch das Feld "Einzelvergütung" enthalten.
Rechnungsnummer | Kostenart | Anzahl |
---|---|---|
Kostenart | Kostenartnummer |
---|---|
Beachten Sie:
Personalnummer | Haustier |
---|---|
Die Personalnummer bestimmt unter Umständen nicht nur ein einziges Haustier, sondern eine ganze Liste verschiedener Haustiere. Hier liegt eine mehrwertige Abhängigkeit (im Gegensatz zur funktionalen Abhängigkeit) vor. Eine mehrwertige Abhängigkeit einer Attributmenge Y von einer Attributmenge X ist trivial, wenn Y Teil von X ist oder die Relation nur aus X und Y besteht. Im Beispiel ist Y=Haustier, X=Personalnummer und die Relation besteht nur aus X und Y. Anschaulich: die mehrwertige Abhängigkeit ist trivial, wenn sich die Tabelle nicht weiter zerlegen läßt.
Personalnummer | Haustier | Fahrzeugtyp |
---|---|---|
Zwischen Personalnummer und Haustier sowie zwischen Personalnummer und Fahrzeugtyp gibt es eine mehrwertige Abhängigkeit. Zwischen Haustier und Fahrzeugtyp gibt es keinerlei Abhängigkeit, so daß zu jeder Personalnummer alle Kombinationen dieser beiden Attribute auftauchen können. Die Relation ist in Boyce-Codd-Normalform, da es keine funktionale Abhängigkeit zwischen Attributen gibt. Die Personalnummer alleine ist aber kein Schlüsselkandidat der Relation.
Wie soll aber z. B. in dieser Tabelle eine Personalnummer gespeichert
werden, zu der zwei Haustiere und zwei Fahrzeuge gehören? Mögliche
Varianten:
Personalnummer | Haustier | Fahrzeugtyp |
---|---|---|
11112 | Hund | Porsche |
11112 | Katze | BMW |
Personalnummer | Haustier | Fahrzeugtyp |
---|---|---|
11112 | Hund | Porsche |
11112 | Katze | Porsche |
11112 | Hund | BMW |
11112 | Katze | BMW |
Personalnummer | Haustier | Fahrzeugtyp |
---|---|---|
11112 | Hund | NULL |
11112 | Katze | NULL |
11112 | NULL | Porsche |
11112 | NULL | BMW |
NULL repräsentiert einen nicht vorhandenen Wert. Auf den ersten Blick ist die letzte Variante die sinnvollste, da hier klar hervorgeht, das zwischen "Haustier" und "Fahrzeugtyp" keinerlei Abhängigkeit besteht. Die sogenannte Existentielle Integrität verlangt aber, daß kein Schlüsselattribut einen NULL-Wert hat.
Abhilfe:
Aufteilung der Tabelle in zwei Tabellen:
Personalnummer | Haustier |
---|---|
Personalnummer | Fahrzeugtyp |
---|---|
Dann liegen nur noch triviale mehrwertige Abhängigkeiten vor und die Relationen sind in Vierter Normalform.
Die Fünfte Normalform wird auch als Project Join Normalform (PJNF) bezeichnet.
Eine Relation R genügt der Join-Abhängigkeit (R1, R2, ..., Rn) genau dann, wenn R gleich dem Join von R1, R2, ..., Rn ist. Die R1, R2, ... sind Teilmengen aller Attribute von R. Eine Join-Abhängigkeit ist trivial, wenn ein Ri aus (R1, R2, ..., Rn) gleich R ist
Beispiel:
Personalnummer | Haustier | Fahrzeugtyp |
---|---|---|
11112 | Hund | Porsche |
11112 | Katze | Porsche |
11112 | Hund | BMW |
11112 | Katze | BMW |
Da jede Kombination von Haustier und Fahrzeugtyp auftaucht, ist die Relation R=(Personalnummer, Haustier, Fahrzeugtyp) gleich dem Join von R1=(Personalnummer, Haustier) und R2=(Personalnummer, Fahrzeugtyp). Also genügt R der Join-Abhängigkeit (R1, R2).
Fach | Kurs | Name |
---|---|---|
Mathematik | Mathe1 | Müller |
Physik | PhysikA | Müller |
Mathematik | Mathe1 | Huber |
Mathematik | Mathe2 | Kelz |
Jedes Fach bietet verschiedene Kurse an, die von verschiedenen Teilnehmern besucht werden. Kein Teilnehmer besucht alle Kurse und kein Kurs wird von allen Teilnehmern besucht. Also sind alle drei Attribute wichtig, um die nötige Information darzustellen. Im Gegensatz zum obigen Beispiel bei der vierten Normalform gibt es keine mehrwertigen Abhängigkeiten, da "Kurs" und "Name" nicht unabhängig sind, sondern die Paarungen wichtige Information enthalten.
Die Relation enthält redundante Information, läßt sich
aber nicht als Join von R1=(Fach, Kurs) und R2=(Fach, Name) darstellen
(es tauchen überflüssige Zeilen auf). Die Relation genügt
also nicht der Join-Abhängigkeit (R1, R2). Eine Aufteilung der Tabelle
in die zwei Tabellen R1 und R2 ist nicht sinnvoll.
Fach | Kurs |
---|---|
Mathematik | Mathe1 |
Physik | PhysikA |
Mathematik | Mathe2 |
Fach | Name |
---|---|
Mathematik | Müller |
Physik | Müller |
Mathematik | Huber |
Mathematik | Kelz |
Fach | Kurs | Name |
---|---|---|
Mathematik | Mathe1 | Müller |
Mathematik | Mathe1 | Huber |
Mathematik | Mathe1 | Kelz |
Physik | PhysikA | Müller |
Mathematik | Mathe2 | Müller |
Mathematik | Mathe2 | Huber |
Mathematik | Mathe2 | Kelz |
Wichtig:
Obwohl wir hier mehr Zeilen haben als vorher, haben wir plötzlich
weniger Informationen, da die Information über die wirklichen Kombinationen
von "Kurs" und "Name" teilweise verlorengeht.
Interessanterweise genügt die Relation aber zwei anderen Join-Abhängigkeiten,
nämlich der trivialen Join-Abhängigkeit R=R1=(Fach, Kurs, Name)
sowie der Join-Abhängigkeit R1=(Fach, Kurs), R2=(Fach, Name) und R3=(Kurs,
Name). Wie man leicht nachprüft, ist R gleich dem Join von R3 mit
dem Join von R1 und R2:
Kurs | Name |
---|---|
Mathe1 | Müller |
PhysikA | Müller |
Mathe1 | Huber |
Mathe2 | Kelz |
Fach | Kurs | Name |
---|---|---|
Mathematik | Mathe1 | Müller |
Physik | PhysikA | Müller |
Mathematik | Mathe1 | Huber |
Mathematik | Mathe2 | Kelz |
Ist die Relation dann in Fünfter Normalform?
Nein, da weder R1, R2 oder R3 Schlüsselkandidaten sind. Der einzige
Schlüsselkandidat besteht aus allen drei Attributen "Fach", "Kurs"
und "Name".
Abhilfe:
Aufteilung der Tabelle in die drei folgenden Tabellen (für die
es dann nur noch triviale Join-Abhängigkeiten gibt):
Fach | Kurs |
---|---|
Fach | Name |
---|---|
Kurs | Name |
---|---|
Relationen in Fünfter Normalform lassen sich nicht weiter aufteilen.