====== 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| ----