Als Beispiel nehmen wir an, wir brauchen eine Auswertung, welche Benutzer welche Rechte haben. Wir haben 3 Benutzer "user1", "user2" und "user3" sowie 2 Berechtigungen: "lesen" und "schreiben".
Anfänger bauen normalerweise eine Tabelle mit allen Daten:
| benutzer | lesen | schreiben |
| user1 | ja | nein |
| user2 | nein | ja |
| user3 | ja | ja |
im Prinzip ist die Tabelle in Ordnung, ABER: wenn eine Weitere Berechtigung kommt, z.B. "ausführen", muss die Tabelle komplett umgebaut werden:
| benutzer | lesen | schreiben | ausführen |
| user1 | ja | nein | ja |
| user2 | nein | ja | nein |
| user3 | ja | ja | nein |
Das bedeutet nicht nur, dass Die Tabelle umgebaut werden muss, sondern auch das Programm, dass mit der Tabelle arbeitet.
Jetzt die Normalisierung:
Grundidee ist, dass jede Information nur einmal gespeichert werden soll. Bei der praktischen Realisierung sieht es so aus:
1. Tabellen werden in "Datentabellen" und "Beziehungstabellen" aufgeteilt.
2. Jede Tabelle hat ein Feld "id", dass eindeutig ist und wenn möglich von der Datenbank selbst hochgezählt wird(unique, autoincrement). Moderne Datenbanken bieten sowas.
Also teilen wir die Daten:
1. Datentabelle "user" mit 2 Feldern
| id | username |
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
2. Datentabelle "rechte" mit 2 Feldern
| id | recht |
| 1 | lesen |
| 2 | schreiben |
3. Beziehungstabelle "userrechte" mit 3 Feldern
| id | userid | rechtid |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
| 4 | 3 | 2 |
Also user1 darf lesen, user2 darf schreiben, user3 darf lesen, user3 darf schreiben .
Zugegeben, Feld "id" ist in der Tabelle "userrechte" in diesem Beispiel überflüssig. Unter realen Bedingungen braucht man es aber.
Also ist es immer so:
Datentabelle(user) ----> Beziehungstabelle(userrechte) <---- Datentabelle(rechte)
Es werden nur die id's abgespeichert. Man kann also Stammdaten beliebig ändern, id bleibt dieselbe.
Wenn in diesem Fall eine Berechtigung dazukommt, wird sie einfach in die Tabelle "rechte" gespeichert und bei Bedarf dem jeweiligen Benutzer in der Tabelle "userrechte" zugewiesen.
In der Beziehungstabelle können weitere relevante Daten gespeichert werden. Angenommen, jede Berechtigung hat ein Ablaufdatum, wobei "00.00.0000" bedeutet keine Begrenzung. user3 darf z.B. nur bis zum 01.01.2020 schreiben, aber unbegrenzt lesen. Dann sollte die Tabelle "userrechte" so aussehen:
| id | userid | rechtid | rechtbis |
| 1 | 1 | 1 | 0000-00-00 |
| 2 | 2 | 2 | 0000-00-00 |
| 3 | 3 | 1 | 0000-00-00 |
| 4 | 3 | 2 | 2020-01-01 |
Beispiel hier ist sehr einfach. Stellen Sie sich eine reale Situation vor:
Sie haben Kunden, die von Ihnen Waren beziehen, wobei Preise individuell mit jedem Kunden ausgemacht wurden. Kunden werden noch nach Gruppen geteilt, damit die Lieferungen gebündelt werden können.
NICHT NORMALISIERT:
| name | strasse | ort | telefon | ... | preis_ware1 | preis_ware2 | preis_ware3 | ... | gruppe1 | gruppe2 | ... |
| .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... | .... |
jetzt stellen Sie sich vor, es kommt neue Ware... oder neue Kundengruppe...
Dann muss man die KOMPLETTE Tabelle und das Programm ändern.
NORMALISIERT:
(Daten)Kunde:
| id | name | strasse | ort | telefon | fax |
| .... | .... | .... | .... | .... | .... |
(Daten)Ware:
| id | titel | beschreibung | einheit |
| .... | .... | .... | .... |
(Daten)Gruppe:
| id | gruppenname | fahrer |
| .... | .... | .... |
(Beziehung Kunde Ware)Kundenpreise:
| id | kundenid | warenid | preis |
| .... | .... | .... | .... |
(Beziehung Kunde Gruppe)Kundengruppen:
| id | kundenid | gruppenid |
| .... | .... | .... |
wenn in diesem Fall was neues dazukommt, wird es einfach in der jeweiligen Datentabelle abgespeichert. Danach kann man auch die Beziehung abspeichern.
SQL-Abfragen sehen dann natürlich anders aus. Dazu schauen Sie den "JOIN" der jeweiligen SQL-Variante an. Bei MySQL bekommt man z.B. Kundenpreise so:
SELECT * FROM Kunde,Ware,Kundenpreise WHERE Kunde.id=Kundenpreise.kundenid AND Ware.id=Kundenpreise.warenid
oder so ähnlich, habe es nicht geprüft.
Also ist die Normalisierung an sich eine einfache Sache. Damit ist es aber so wie immer: jemand hat eine Idee gehabt. Dann kamen welche, die irgendwas wissenschaftliches schreiben mussten, um einen "Professor..." oder "Dr..." auf die Visitenkarte zu bekommen. Damit es aber wissenschaftlich klingt, muss man Fachbegriffe erfinden und drumrum was bauen. In diesem Fall hat man noch "Normalisierungsstufen" erfunden, die im Prinzip garnix nützen, weil man selber sieht, was wohin kommt. :-)






