Die sinnvolle Aufteilung zu speichernder Daten auf mehrere Tabellen und Felder ist eine wesentliche Voraussetzung für das Erstellen einer gut funktionierenden Datenbank. Diese Tätigkeit nennt man normalisieren einer Datenbank. Eine relationale Datenbank sollte den Normalformen entsprechen, und beim Normalisieren sollte man die Normalformen idealerweise systematisch, eine nach der anderen, abarbeiten. Eine korrekt normalisierte Datenbank verhindert anschließend doppelte (redundante) oder sich widersprechende (inkonsistente) Daten.
Eine Tabelle soll keine Felder enthalten, die aus anderen Feldern berechnet werden können (Dafür sind Abfragen zuständig).
Verkäufe | ||||
---|---|---|---|---|
VerkaufsNr | Verkaufsdatum | Nettopreis | MwSt | Bruttopreis |
1 | 03.01. | 100 | 19% | 119 |
2 | 04.01. | 50 | 12% | 60 |
In diesem Beispiel erscheint der erste Datensatz in sich stimmig, aber der Mehrwertsteuersatz des zweiten Datensatzes ist definitiv falsch. Und egal, wie man rechnet, der Bruttopreis kann auch nicht stimmen. MwSt und Bruttopreis gehören auch gar nicht erst in die Tabelle, denn der Mehrwertsteuersatz ist fix, und damit kann der Bruttopreis mit Hilfe einer Abfrage errechnet werden.
Verkäufe | ||
---|---|---|
VerkaufsNr | Verkaufsdatum | Nettopreis |
1 | 03.01. | 100 |
2 | 04.01. | 50 |
Die erste Normalform bestimmt, wofür jeweils ein Feld benötigt wird: Eine Tabelle befindet sich in der ersten Normalform, wenn die Werte in jedem Feld und in jedem Datensatz atomar sind, d.h. sich nicht mehr in kleinere Einheiten zerlegen lassen.
Personen | ||
---|---|---|
IDPerson | Name | Anschrift |
1 | Peter Parker | 20 Ingram St, Flushing, NY 11375 |
2 | Peter Feldmann | Römerberg 23, 60311 Frankfurt am Main |
3 | Olaf Scholz | Willy-Brandt-Str. 1 10557 Berlin |
Falls man versucht, aus dieser Tabelle z. B. alle Personen mit einer bestimmten Postleitzahl abzufragen, wäre man vor eine unlösbare Aufgabe gestellt: Mal befindet sich vor der Postleitzahl ein Semikolon, mal ein Komma, und den Benutzern würden bestimmt noch ein paar andere lustige Trennzeichen einfallen - falls sie überhaupt an eine PLZ denken...
Der Name lässt sich in Vorname und Nachname zerlegen und die Anschrift zu Straße, PLZ und Stadt. Je nach Anwendung könnte es auch sinnvoll sein, die Hausnummer in einem eigenen Feld zu speichern. Allerdings kann man dazu keine universelle Aussage treffen - das hängt davon ab, was die Anwendung eigentlich leisten soll: Für einen Briefträger ist das sicher hilfreich, während es übertrieben wäre, wenn es nur um die allgemeine Erfassung von Kundendaten geht.
Personen | ||||||
---|---|---|---|---|---|---|
IDPerson | Vorname | Nachname | Straße | HausNr | PLZ | Stadt |
1 | Peter | Parker | Ingram St | 20 | NY 11375 | Flushing |
2 | Peter | Feldmann | Römerberg | 23 | 60311 | Frankfurt am Main |
3 | Olaf | Scholz | Willy-Brandt-Str. | 1 | 10557 | Berlin |
Eine Tabelle befindet sich in der zweiten Normalform, wenn sie der ersten Normalform entspricht und darüber hinaus jeder Datensatz nur Felder enthält, die sich auf das Objekt beziehen, das durch den Primärschlüssel dargestellt wird.
Werkstattkunden | |||
---|---|---|---|
IDKunde | Nachname | AutoKZ1 | AutoKZ2 |
1 | Hübner | F RH 2000 | F RH 2001 |
2 | Becker | GG AF 123 |
Die Autokennzeichen haben bei den Kunden nichts zu suchen, weil sie nichts
mit dem Primärschlüsselfeld IDKunde
zu tun haben. Gemäß der zweiten
Normalform müssen sie aus obiger Tabelle entfernt werden und gehören in eine
eigene Tabelle. Dann können auch mehr als zwei Kennzeichen pro Kunde dargestellt
werden.
Werkstattkunden | |
---|---|
IDKunde | Nachname |
1 | Hübner |
2 | Becker |
PKWs | |
---|---|
Kunde | AutoKZ |
1 | F RH 2000 |
1 | F RH 2001 |
2 | GG AF 123 |
Eine Tabelle befindet sich in der dritten Normalform, wenn sie der zweiten Normalform entspricht und darüber hinaus alle Felder, die nicht den Primärschlüssel bilden, voneinander unabhängig sind.
Orte | |||
---|---|---|---|
IDOrt | Ort | NrLand | Land |
1 | München | 2 | Bayern |
2 | Bamberg | 2 | Baden-Württemberg |
3 | Berlin | 3 | Berlin |
Hier wurde nicht nur die Nummer des Bundeslandes, sondern auch noch der
Klartext dazu abgelegt. Land
ist aber von NrLand
abhängig, also wurde gegen die dritte Normalform verstoßen. Durch diesen Verstoß
konnte im zweiten Datensatz eine Diskrepanz zwischen NrLand
und
Land
entstehen. Nach der dritten Normalform darf nur
NrLand
in der Tabelle stehen.
Orte | ||
---|---|---|
IDOrt | Ort | NrLand |
1 | München | 2 |
2 | Bamberg | 2 |
3 | Berlin | 3 |
Länder | |
---|---|
IDLand | Land |
1 | Baden-Württemberg |
2 | Bayern |
3 | Berlin |
Über die schon genannten Normalformen hinaus gibt es noch weitere Normalformen (BCNF, 4NF, 5NF), aber in der Praxis kommen Datenstrukturen, die eine weitergehende Normalisierung erforderlich machen, seltener vor. Wer eine Datenbank bis 3NF strukturieren kann, wird in aller Regel wohl auch kaum noch schwerwiegend gegen diese höheren Normalformen verstoßen. Wer sich dennoch näher mit der Theorie beschäftigen will, findet eine Liste von Fachbüchern bei Amazon.