Computerfreak

Webkatalog und Infos für Computerfreaks und Interessierte

  • Schrift vergrößern
  • Standard-Schriftgröße
  • Schriftgröße verkleinern
Start Tips und Tricks Datenbanken, Tabellen normalisieren

Datenbanken, Tabellen normalisieren

E-Mail Drucken PDF

Tabellen normalisieren

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. :-)

Zuletzt aktualisiert am Donnerstag, den 25. Juni 2009 um 09:02 Uhr  

Wer ist online

  • [Bot]
Now online:
  • 1 guest
  • 1 robot
Latest members:
  • Unfossehedo Send PM
  • lisitswnyb Send PM
  • Liaittyfearse Send PM
  • gahToopay Send PM
  • InOrgeFreek Send PM
Google PageRank module - Camelpark SEO centrum


Anmeldung

Benutzername

Passwort

Angemeldet bleiben

Alexa stats und Google PageRank