Normalisierung: 1., 2. und 3. Normalform
Lösung geprüft
Die Aufgabe der heutigen Stunde ist die Normalisierung! Neun Teilaufgaben zu den ersten drei Normalformen. Das ist das Thema, bei dem es am meisten Punkte in der Klausur gibt und bei dem sich am meisten Leute unnötig schwertun – dabei steckt hinter allen drei Normalformen dieselbe Idee: jede Information soll genau einmal gespeichert werden, und zwar dort, wo sie hingehört.
1 Erklären Sie in eigenen Worten: Was bedeutet
„1. Normalform"?
2 Gegeben sei eine Relation mit KundenNr und Kunde.
a) Beschreiben Sie, wo die Nachteile dieser Struktur liegen.
b) Bringen Sie die Relation in die 1. Normalform.
3 Wie viele Attribute wird die Relation „Artikel"
insgesamt haben, wenn Sie diese in die 1NF bringen?
4 Erklären Sie in eigenen Worten: Was bedeutet
„2. Normalform"?
5 Relation „LCD_Flachbildschirme": a) Identifizieren
Sie den Primärschlüssel. b) Befindet sich die Relation in der 2NF? Wenn
nein: Bringen Sie die Relation in die 2NF.
6 Dasselbe für die Relation „Lexikoneintraege".
7 Erklären Sie in eigenen Worten: Was bedeutet
„3. Normalform"?
8 Relation „Lagerbestand": a) Primärschlüssel
identifizieren. b) Bestehen transitive Abhängigkeiten? Wenn ja:
Beseitigen Sie diese und stellen Sie die 3NF her.
9 Dasselbe für die Relation „Verliehene Bücher".
Aufgabe 1 – Die 1. Normalform
Eine Relation ist in der 1. Normalform, wenn jedes Attribut atomar ist – also unteilbar. In jeder Zelle steht genau ein Wert, keine Liste, keine Aufzählung, kein zusammengesetzter Text.
| Verstößt gegen 1NF | Warum |
|---|---|
"Josef Schmitt, Blochweg 3, 79312 Emmendingen" | Name, Straße, PLZ und Ort in einem Feld |
"Mathe, Info, Sport" | eine Liste in einer Zelle |
Spalten Fach1, Fach2, Fach3 | Wiederholungsgruppe – was macht man beim vierten Fach? |
Aufgabe 2 – Die Kundenrelation
KundenNr Kunde
1 Josef Schmitt, Blochweg 3, 79312 Emmendingen
2 Ann Woll, Hauptstraße 15, 79312 Emmendingen
a) Die Nachteile
- Man kann nicht gezielt suchen. „Alle Kunden aus Emmendingen" geht nur mit
LIKE '%Emmendingen%'– und das findet auch jemanden, der in der „Emmendinger Straße" in einer anderen Stadt wohnt. - Man kann nicht sinnvoll sortieren. Nach Nachname sortieren ist unmöglich, weil der Vorname vorne steht.
- Man kann nichts auswerten. „Wie viele Kunden pro Postleitzahl?" ist nicht beantwortbar.
- Man kann nichts einzeln ändern. Zieht jemand um, muss man den ganzen Text neu tippen und dabei Name und PLZ mit anfassen.
- Keine Prüfung möglich. Die Datenbank kann nicht kontrollieren, ob die PLZ fünfstellig ist – für sie ist alles ein Fließtext.
b) In der 1. Normalform
Kunden(KundenNr, Vorname, Nachname, Strasse, Hausnummer, PLZ, Ort)
^^^^^^^^
PK
1 Josef Schmitt Blochweg 3 79312 Emmendingen
2 Ann Woll Hauptstraße 15 79312 Emmendingen
Hausnummer und Straße trennt man, weil man sonst nicht nach Straße
sortieren kann. Und die Hausnummer bleibt VARCHAR und wird
kein INT – es gibt „3a" und „15-17".
Aufgabe 3 – Wie viele Attribute?
Aus den beiden Datensätzen liest man alle Einzelinformationen heraus, die irgendwo vorkommen:
| # | Attribut | Luftmatratze | Michael Kohlhaas |
|---|---|---|---|
| 1 | Artikelnummer | 1 | 2 |
| 2 | Artikelname | Luftmatratze | Michael Kohlhaas |
| 3 | Gewicht_kg | 3 | 0,25 |
| 4 | Garantie_Jahre | 2 | NULL |
| 5 | Preis_Euro | 31,70 | 6,90 |
| 6 | MwSt_Prozent | 19 | 7 |
| 7 | Seitenzahl | NULL | 250 |
Antwort: 7 Attribute.
Der interessante Teil ist das, was dabei auffällt: zwei Zellen bleiben leer. Ein Buch hat keine Garantie, eine Luftmatratze keine Seitenzahl. Die Relation ist damit zwar in der 1NF, aber der Entwurf ist trotzdem nicht gut – bei zwanzig verschiedenen Artikelarten hätte man dreißig Spalten, von denen pro Zeile fünf gefüllt sind.
Richtig löst man das später mit getrennten Tabellen für Bücher und Sportartikel oder mit einer Attribut-Wert-Tabelle. Das gehört nicht mehr zur 1NF, ist aber eine gute Beobachtung für die Antwort.
Aufgabe 4 – Die 2. Normalform
Eine Relation ist in der 2. Normalform, wenn sie in der 1NF ist und jedes Nicht-Schlüssel-Attribut vom gesamten Primärschlüssel abhängt – nicht nur von einem Teil davon.
Der wichtigste Satz dazu: Bei einem einfachen Primärschlüssel ist die 2NF automatisch erfüllt. Es gibt dann gar keinen „Teil" des Schlüssels, von dem etwas abhängen könnte. Die 2NF ist also nur bei zusammengesetzten Schlüsseln überhaupt ein Thema.
Aufgabe 5 – LCD_Flachbildschirme
Hersteller Seriennummer TypBez Preis
Sony 123456789 Blinkmaster 3C 199.00
Samsug 138829919 Summerspecial I 189.00
Sony 188549921 Blinkmaster 3C 199.00
Sony 139929191 110C 219.00
a) Der Primärschlüssel
(Hersteller, Seriennummer) – zusammengesetzt.
Seriennummern sind nur innerhalb eines Herstellers eindeutig. Sony und
Samsung könnten problemlos beide eine 123456789 vergeben. Nimmt man
dagegen an, dass die Seriennummern weltweit eindeutig sind, reicht
Seriennummer allein – dann wäre die Relation automatisch in
der 2NF und die Aufgabe hätte keine Pointe. Deshalb ist der
zusammengesetzte Schlüssel gemeint.
b) In der 2NF? Nein.
TypBez und Preis hängen nur von der
Seriennummer ab, nicht vom Hersteller. Das ist eine
partielle Abhängigkeit und verletzt die 2NF.
Geraete(Seriennummer, Hersteller, TypBez)
PK
Typen(TypBez, Preis)
PK
Nebenbei ist damit auch gleich ein zweites Problem weg: der Preis stand bei „Blinkmaster 3C" zweimal mit 199.00 in der Tabelle. Ändert sich der Preis, hätte man ihn an zwei Stellen ändern müssen – und eine vergessen. Jetzt steht er genau einmal da.
Aufgabe 6 – Lexikoneintraege
Buch_ID Seite Artikelname Lexikontitel
1 137 Windkraft Brockhaus
1 85 Goethe Brockhaus
2 137 Goethe Meyer
2 289 Wasserwerk Meyer
2 289 Windkraft Meyer
a) Der Primärschlüssel
(Buch_ID, Seite, Artikelname)
Alle drei werden gebraucht. Buch_ID und Seite reichen nicht: die Kombination (2, 289) kommt zweimal vor, weil auf Seite 289 zwei Artikel anfangen. Erst der Artikelname macht die Zeile eindeutig.
b) In der 2NF? Nein.
Lexikontitel hängt nur von Buch_ID ab – also
von einem Teil des Schlüssels. Wieder eine partielle Abhängigkeit.
Lexika(Buch_ID, Lexikontitel)
PK
Eintraege(Buch_ID, Seite, Artikelname)
PK PK PK
FK -> Lexika.Buch_ID
Man sieht den Gewinn direkt: „Brockhaus" stand zweimal da, „Meyer" dreimal. Jetzt steht jeder Lexikontitel genau einmal.
Aufgabe 7 – Die 3. Normalform
Eine Relation ist in der 3. Normalform, wenn sie in der 2NF ist und kein Nicht-Schlüssel-Attribut transitiv vom Primärschlüssel abhängt.
Transitiv heißt: über einen Umweg. Kurz gesagt – kein Nicht-Schlüssel-Attribut darf von einem anderen Nicht-Schlüssel-Attribut abhängen.
Schluessel -> Attribut A -> Attribut B
Das ist eine transitive Abhaengigkeit: B haengt eigentlich an A,
nicht am Schluessel. Also gehoert B zusammen mit A in eine eigene Tabelle.
Der Merkspruch, mit dem man sich alle drei Normalformen merken kann: Jedes Attribut hängt vom Schlüssel ab, vom ganzen Schlüssel und von nichts als dem Schlüssel. Der erste Teil ist die 1NF, der zweite die 2NF, der dritte die 3NF.
Aufgabe 8 – Lagerbestand
ID Artikel Anzahl Lieferant Lieferant_Ort
1 Locher 2 Herlitz Wiesbaden
2 Tacker 13 Bürohaus M München
3 Klebstoff 3 Herlitz Wiesbaden
4 Ordner 6 Leitz Hamburg
a) Der Primärschlüssel
ID – einfach, also ist die 2NF automatisch
erfüllt.
b) Transitive Abhängigkeiten? Ja.
Lieferant_Ort hängt von Lieferant ab und nicht
von der ID. Man sieht es direkt an den Daten: Herlitz steht
zweimal drin, und beide Male steht „Wiesbaden" daneben. Das ist kein
Zufall, sondern eine Abhängigkeit.
Lagerbestand(ID, Artikel, Anzahl, Lieferant_ID)
PK FK -> Lieferanten.ID
Lieferanten(ID, Name, Ort)
PK
Was man damit verhindert, heißt Änderungsanomalie: zieht Herlitz nach Mainz um, müsste man vorher jede Zeile mit Herlitz anfassen. Vergisst man eine, steht der Lieferant in derselben Datenbank an zwei Orten gleichzeitig.
Aufgabe 9 – Verliehene Bücher
ID Titel LeiherName Seitenzahl Regal-Nr.
1 Robinson Martina 189 1
2 Faust Josef 113 5
3 USA-Reisen Josef 288 7
4 Helmut Kohl Rico 95 7
a) Der Primärschlüssel
ID
b) Transitive Abhängigkeiten? Ja.
Seitenzahl und Regal-Nr. hängen vom
Buch ab, nicht vom Ausleihvorgang. Die Seitenzahl von
„Faust" ändert sich nicht dadurch, dass jemand anderes es ausleiht.
Buecher(Buch_ID, Titel, Seitenzahl, Regal_Nr)
PK
Ausleihen(ID, Buch_ID, LeiherName)
PK FK -> Buecher.Buch_ID
Der Denkfehler, den man hier leicht macht: die Tabelle heißt „Verliehene Bücher", also denkt man, es ginge um Bücher. Tatsächlich ist jede Zeile ein Ausleihvorgang. Deshalb gehört alles, was zum Buch selbst gehört, in eine eigene Tabelle.
Man könnte noch einen Schritt weitergehen und die Leiher auslagern –
„Josef" steht zweimal da. Gefordert war das nicht, weil
LeiherName tatsächlich direkt vom Ausleihvorgang abhängt und
damit keine transitive Abhängigkeit vorliegt. Für eine echte Datenbank
wäre eine Tabelle Leiher trotzdem sinnvoll, schon wegen der
Tippfehler.
Das Verfahren, das immer funktioniert
- 1NF: Gibt es Zellen mit mehreren Werten drin? Aufteilen.
- Primärschlüssel bestimmen. Ist er einfach, überspring Schritt 3.
- 2NF: Hängt ein Attribut nur von einem Teil des Schlüssels ab? Mit diesem Teil in eine eigene Tabelle.
- 3NF: Hängt ein Attribut von einem anderen Nicht-Schlüssel-Attribut ab? Beide zusammen in eine eigene Tabelle.
- Fremdschlüssel setzen, damit die Tabellen wieder verbunden sind.
flowchart TD
A["Die Relation, so wie sie gegeben ist"]
B{"Steht in einer Zelle<br>mehr als ein Wert?"}
B1["1NF: den Text in einzelne Spalten zerlegen<br>Aufgabe 2: Kunde wird zu Vorname, Nachname,<br>Strasse, Hausnummer, PLZ, Ort"]
C{"Primärschlüssel bestimmen:<br>einfach oder zusammengesetzt?"}
D{"Hängt ein Attribut nur von<br>einem Teil des Schlüssels ab?"}
D1["2NF: Teilschlüssel und die abhängigen<br>Attribute in eine eigene Tabelle<br>Aufgabe 6: Lexikontitel wird zu Lexika"]
E{"Hängt ein Nicht-Schlüssel-Attribut<br>von einem anderen ab?"}
E1["3NF: beide zusammen in eine<br>eigene Tabelle<br>Aufgabe 8: Lieferant_Ort wird zu Lieferanten"]
F["Fremdschlüssel setzen - fertig"]
A --> B
B -- ja --> B1
B1 --> C
B -- nein --> C
C -- "einfach: 2NF ist automatisch erfüllt" --> E
C -- zusammengesetzt --> D
D -- ja --> D1
D1 --> E
D -- nein --> E
E -- ja --> E1
E1 --> F
E -- nein --> F
Der schnellste Test in der Klausur: schau, welcher Wert in der Tabelle doppelt vorkommt. Steht „Herlitz – Wiesbaden" zweimal identisch da, ist das fast immer eine Abhängigkeit, die ausgelagert gehört. Redundanz ist der sichtbare Fingerabdruck einer verletzten Normalform.