====== 2.6) Normalformen ======
Die Kriterien eines guten Datenbankentwurfs sind einerseits möglichst geringe **Redundanz** und andererseits von **Einfügen, Lösch- und Änderungsanomalien** abhängig.
Um Redundanzen und Anomalien zu vermeiden, führen wir den Begriff **Normalform** ein, der uns hilft unerwünschte Eigenschaften der Datenbank zu vermeiden.
===== 1. Normalform (1NF) =====
**Ein Relationenschema R ist in 1NF wenn der Wertebereich aller Attribute von R atomar sind. D.h. wenn keine mehrwertigen Attribute vorkommen.**
==== Beispiel - CD Lieder====
^__CD_ID__^Name^Titelliste^
|4711|All That You Can Leave Behind (U2)|Beautiful Day, Walk On, Kite, Wild Honey|
|4712|Tattou You (Rolling Stones)|Start Me Up, Hang Fire, Slave|
* Das Feld **Name** beinhaltet Album und Interpret
* Das Feld **Titelliste** enthält eine Aufzählung aller Titel
=== Fehler/Problem===
* Zur Sortierung nach Interpret muss das Feld **Name** in Album und Interpret aufgeteilt werden
* Den Titel können (mit einfachen Mitteln) nur alle gleichzeitig als Titelliste oder gar nicht dargestellt werden
-> Das Relationenschema ist **nicht** in 1. Normalform!
===Lösung 1NF===
^__CD_ID__^Album^Interpret^__Titel__^
|4711|All That You Can Leave Behind|U2|Beautiful Day|
|4711|All That You Can Leave Behind|U2|Walk On|
|4711|All That You Can Leave Behind|U2|Kite|
|4711|All That You Can Leave Behind|U2|Wild Honey|
|4712|Tattoo You|Rolling Stones|Start Me Up|
|4712|Tattoo You|Rolling Stones|Hang Fire|
|4712|Tattoo You|Rolling Stones|Slave|
===== 2. Normalform (2NF) =====
**Ein Relationenschema R ist in zweiter Normalform, wenn es in 1NF ist, und jedes Nicht-Schlüsselfeld vom ganzen Primärschlüssel (der auch aus mehreren Feldern bestehen kann) abhängig ist.
\\
Wichtig ist, dass Datenfelder nicht nur von einem Teilschlüsselfeld, sondern vom gesamten Schlüssel funktional abhängig sind.** \\
Jedes Tupel muss immer vom gesamten Schlüssel abhängen, sonst ist es nicht in 2. Normalform!
{{:inf:inf8bi_201819:2:pasted:20181113-192339.png?direct}}
==== Beispiel 1 ====
Gegeben ist folgende Tabelle:
^__CD_ID__^Album^Interpret^__Track__^Titel^
|4711|All That You Can Leave Behind|U2|1|Beautiful Day|
|4711|All That You Can Leave Behind|U2|2|Walk On|
|4711|All That You Can Leave Behind|U2|3|Kite|
|4712|Tattoo You|Rolling Stones|1|Start Me Up|
|4712|Tattoo You|Rolling Stones|2|Hang Fire|
===Problem===
z.B.: Durch ein Update des Albums kommt es zu einer Dateninkonsistenz
^__CD_ID__^Album^Interpret^__Track__^Titel^
|4711|All That You Can Leave Behind|U2|1|Beautiful Day|
|4711|All That You Can Leave Behind|U2|2|Walk On|
|4711|All That You Can Leave Behind|U2|3|Kite|
|4712^Sticky Fingers|Rolling Stones|1|Start Me Up|
|4712|Tattoo You|Rolling Stones|2|Hang Fire|
=== Lösung 2NF ===
^__CD_ID__^Album^Interpret^
|4711|All That You Can Leave Behind|U2|
|4712|Tattoo You|Rolling Stones|
^//__CD_ID__//^__Track__^Titel^
|4711|1|Beautiful Day|
|4711|2|Walk On|
|4711|3|Kite|
|4712|1|Start Me Up|
|4712|2|Hang Fire|
==== Beispiel 2 ====
^__PLZ__^__Nachname__^Ort^Geburtsdatum^
|3300|Muster|Amstetten|03.05.2003|
|3300|Maier|Amstetten|05.06.2002|
|3304|Wimmer|St. Georgen|03.05.2003|
Problem: Der Ort hängt nicht vom gesamten Schlüssel (__PLZ__,__Nachname__) ab, sondern nur von einem Teil des Primärschlüssels (PLZ)!
===== 3. Normalform (3NF) =====
**Ein Relationenschema R ist genau dann in 3NF, wenn es die 1NF und die 2NF erfüllt, und wenn kein nicht primes Attribut von einem Schlüssel in R transitiv abhängt.**
\\
\\
**Transitivitätsregel K→X, X→A : K→A**
{{:inf:inf8bi_201819:2:pasted:20181113-192422.png?direct}}
==== Beispiel 1 ====
Gegeben sei eine Tabelle mit folgenden Feldern:
^___CD_ID___^Album^Interpret^Band-Gründungsjahr^
|4711|All That You Can Leave Behind|U2|1976|
|4712|Sticky Fingers|Rolling Stones|1962|
|4713|Tattou You|Rolling Stones|1962|
Offensichtlich lässt sich der **Interpret** einer CD aus der **CD_ID** bestimmen. Das **Band-Gründungsjahr** der Band hängt dagegen vom **Interpret** und damit nur **!!transitiv!!** von der **CD_ID** ab.
=== Problem ===
Auch hier besteht eine Datenredundanz, wodurch Inkonsistenzen beim Ändern auftreten können.
^___CD_ID___^Album^Interpret^Band-Gründungsjahr^
|4711|All That You Can Leave Behind|U2|1976|
|4712|Sticky Fingers|Rolling Stones^1972^
|4713|Tattou You|Rolling Stones|1962|
=== Lösung ===
^___CD_ID___^Album^//Interpret//^
|4711|All That You Can Leave Behind|U2|
|4712|Sticky Fingers|Rolling Stones|
|4713|Tattoo You|Rolling Stones|
^___Interpret___^Band-Gründungsjahr^
|U2|1976|
|Rolling Stones|1962|
==== Beispiel 2 ====
^___ID___^PLZ^Nachname^Ort^Geburtsdatum^
|1|3300|Muster|Amstetten|03.05.2003|
|2|3300|Maier|Amstetten|05.06.2002|
|3|3304|Wimmer|St. Georgen|03.05.2003|
Problem:
Der Ort ist eigentlich von der PLZ abhängig
=== Lösung ===
Zwei Tabellen:
^__PLZ__^Ort^
|3300|Amstetten|
|3304|St. Georgen|
^___ID___^PLZ^Nachname^Geburtsdatum^
|1|3300|Muster|03.05.2003|
|2|3300|Maier|05.06.2002|
|3|3304|Wimmer|03.05.2003|
----