Normalisierung beschreibt den Vorgang, Tabellen einer Datenbank dahingehend zu strukturieren, sodass sie keine vermeidbaren Redundanzen enthalten. Normalisierte Tabellen sorgen für eine konsistente und fehlerunanfällige Datenhaltung.
Ein Entwickler hat die Aufgabe bekommen, die Datenbank für das Wirtschaftssystem der Firma Failution zu implementieren. Die Firma möchte folgenden Informationen seiner Kunden speichern:
Der Entwurf des Entwicklers sieht wie folgt aus:
KND_Name | KND_Firma | KND_Adresse | KND_Notiz | KND_Notiz2 | BST_Datum | BST_Bezahlt | ART_1 | ART_2 |
---|---|---|---|---|---|---|---|---|
Max Mustermann | Mustermann Consulting | Musterstrasse 1, 12345 Musterstadt | 10.10.2010 | 1 | 10x Thin-Client BAER (1.6 Ghz,Sound,VGA,USB) 199.99 | 15x Thin-Client NP (1.0 Ghz,Sound,VGA+DVI,USB) 179.99 Auslauf | ||
Theodor Tester | Test-Solutions AG | Testweg 16, 55353 Testort | Offene Rechnung | 15.02.2011 | 1x Thin-Client BAER (1.6 Ghz,Sound,VGA,USB) 199.99 | |||
Theodor Tester | Test-Solutions AG | Testweg 16, 55353 Testort | Offene Rechnung | 15.02.2011 | 1x Thin-Client BAER (1.6 Ghz,Sound,VGA,USB) 199.99 |
Die erste Normalform liegt vor, wenn eine Tabelle die folgenden Bedingungen erfüllt:
Der oben angezeigt Entwurf erfüllt keine der drei Bedingungen - die Gründe sind:
Beherzigt man die oben genannten drei Regeln lässt sich das Konzept wie folgt überarbeiten:
ID | KND_Vorname | KND_Nachname | KND_Firma | KND_Strasse | KND_HausNr | KND_PLZ | KND_Ort | KND_Notiz | BST_Datum | BST_Bezahlt | ART_Anzahl | ART_Bez | ART_Details | ART_Auslauf | ART_Preis |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Max | Mustermann | Mustermann Consulting | Musterstrasse | 1 | 12345 | Musterstadt | 10.10.2010 | ja | 10 | Thin-Client BAER | 1.6 Ghz,Sound,VGA,USB | nein | 199.99 | |
2 | Max | Mustermann | Mustermann Consulting | Musterstrasse | 1 | 12345 | Musterstadt | 10.10.2010 | ja | 15 | Thin-Client NP | 1.0 Ghz,Sound,VGA+DVI,USB | ja | 179.99 | |
3 | Theodor | Tester | Test-Solutions AG | Testweg | 16 | 55353 | Testort | Offene Rechnung | 15.02.2011 | nein | 1 | Thin-Client BAER | 1.6 Ghz,Sound,VGA,USB | nein | 199.99 |
Was wurde geändert?
Die zweite Normalform liegt vor, wenn die folgenden Bedingungen erfüllt werden:
Diese Bedingungen werden vom aktuellen Entwurf nicht erfüllt:
ID | KND_Vorname | KND_Nachname | KND_Firma | KND_Strasse | KND_HausNr | KND_PLZ | KND_Ort | KND_Notiz | BST_Datum | BST_Bezahlt | ART_Anzahl | ART_Bez | ART_Details | ART_Auslauf | ART_Preis |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Max | Mustermann | Mustermann Consulting | Musterstrasse | 1 | 12345 | Musterstadt | 10.10.2010 | ja | 10 | Thin-Client BAER | 1.6 Ghz,Sound,VGA,USB | nein | 199.99 | |
2 | Max | Mustermann | Mustermann Consulting | Musterstrasse | 1 | 12345 | Musterstadt | 10.10.2010 | ja | 15 | Thin-Client NP | 1.0 Ghz,Sound,VGA+DVI,USB | ja | 179.99 | |
3 | Theodor | Tester | Test-Solutions AG | Testweg | 16 | 55353 | Testort | Offene Rechnung | 15.02.2011 | nein | 1 | Thin-Client BAER | 1.6 Ghz,Sound,VGA,USB | nein | 199.99 |
Es sind Spalten vorhanden, die nicht vom Primärschlüssel ID (Kunde) abhängig sind:
Abgesehen davon, dass die Tabelle sehr unübersichtlich ist, werden Informationen mehrfach definiert (beispielsweise die Kunden- und Artikelinformationen, unnötige Datenredundanz) und sind somit anfällig für Anomalien.
Diese Tabelle muss in mehrere Tabellen aufgeteilt werden - ein korrekter Ansatz wäre:
Dedizierte Tabellen für:
KUNDEN | ||||||||
---|---|---|---|---|---|---|---|---|
KND_Nr | KND_Vorname | KND_Nachname | KND_Firma | KND_Strasse | KND_HausNr | KND_PLZ | KND_Ort | KND_Notiz |
1 | Max | Mustermann | Mustermann Consulting | Musterstrasse | 1 | 12345 | Musterstadt | |
2 | Theodor | Tester | Test-Solutions AG | Testweg | 16 | 55353 | Testort | Offene Rechnung Nr.3 |
ARTIKEL | ||||
---|---|---|---|---|
ART_Nr | ART_Bezeichnung | ART_Details | ART_Auslauf | ART_Einzelpreis |
1 | Thin-Client BAER | 1.6 Ghz,Sound,VGA,USB | nein | 199.99 |
2 | Thin-Client NP | 1.0 Ghz,Sound,VGA+DVI,USB | ja | 179.99 |
BESTELLUNGEN | |||
---|---|---|---|
BST_Nr | KND_Nr | BST_Datum | BST_Bezahlt |
1 | 1 | 10.10.2010 | ja |
2 | 2 | 15.02.2011 | nein |
BESTELL_POS | |||
---|---|---|---|
BPOS_Nr | BST_Nr | ART_Nr | BPOS_Anzahl |
1 | 1 | 1 | 10 |
2 | 1 | 2 | 15 |
3 | 2 | 1 | 1 |
Was wurde geändert?
Die dritte Normalform liegt vor, wenn die folgenden Bedingungen erfüllt werden:
Die Tabellen ARTIKEL, BESTELLUNGEN und BESTELL_POS liegen bereits in der dritten Normalform vor - lediglich die Tabelle KUNDEN liegt noch nicht in der dritten Normalform vor.
Der Grund ist das Feld KND_Ort. Der Name eines Orts ist von seiner zugehörigen Postleitzahl, KND_PLZ, und nicht vom Kunden abhängig. Dieses Feld wird also in einer weiteren dedizierten Tabelle ausgelagert:
KUNDEN | |||||||
---|---|---|---|---|---|---|---|
KND_Nr | KND_Vorname | KND_Nachname | KND_Firma | KND_Strasse | KND_HausNr | KND_Ort | KND_Notiz |
1 | Max | Mustermann | Mustermann Consulting | Musterstrasse | 1 | 1 | |
2 | Theodor | Tester | Test-Solutions AG | Testweg | 16 | 2 | Offene Rechnung Nr.3 |
ORTE | ||
---|---|---|
ORT_Nr | ORT_PLZ | ORT_Name |
1 | 12345 | Musterstadt |
2 | 55353 | Testort |
Orte werden nun in einer dedizierten Tabelle gesichert - eine Verknüpfung zu den Kundeninformationen erfolgt über einen Fremdschlüssel.
Warum? Ganz einfach - Postleitzahlen können auch durchaus mit einer 0 beginnen, in einem solchen Fall würde die 0 abgeschnitten werden und zu Fehlinformationen führen.