# Datenbanken, Tabellen normalisieren.



## richardkrieger (1. Apr 2009)

Ok, will jetzt auch was nützliches machen 
Das ist nur eine Beschreibung, wie man am besten die Datenbanktabellen zusammenstellt und was hinter "Normalisierung" steht. Einfach erklärt(hoffe ich...) 

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     // user1 darf lesen
2|2|2     // user2 darf schreiben
3|3|1     // user3 darf lesen
4|3|2     // 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. "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     // user1 darf unbegrenzt lesen
2|2|2|0000-00-00     // user2 darf unbegrenzt schreiben
3|3|1|0000-00-00     // user3 darf unbegrenzt lesen
4|3|2|2020-01-01     // user3 darf bis 01.01.2020 schreiben

Beispiel hier ist sehr einfach. Stellen Sie sich eine reale Situation vor:
Sie haben Kunden, die von Ihnen Ware 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|............ was man halt so braucht

(Daten)Ware:
id|titel|beschreibung|einheit|......... weitere Parameter

(Daten)Gruppe:
id|gruppenname

(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 andern 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 ist 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. 

konnte leider keine Möglichkeit finden, die Tabellen schön darzustellen. vBulletin hat doch einen WYSIWYG-Editor wie mein Joomla oder nicht? Auf meiner Seite sehen die Tabellen wie Tabellen aus. Habe hier mit BBCode [noparse]
	
	
	
	





```

```
[/noparse] versucht, hat nix gebracht:

```
<table>
<tr><td>bla</td><td>bla</td></tr>
</table>
```


----------



## faetzminator (5. Apr 2009)

HTML/XHTML und Joomla -> PHP?

```
java-forum.org > Java - Programmierung  > Datenbankprogrammierung
```
Abgesehen davon, dass dir hier evtl jmd helfen kann, würde ich zuerst noch ein passenderes Forum suchen


----------

