Datenbanken, Tabellen normalisieren.

Status
Nicht offen für weitere Antworten.

richardkrieger

Aktives Mitglied
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]
HTML:
[/noparse] versucht, hat nix gebracht:
HTML:
<table>
<tr><td>bla</td><td>bla</td></tr>
</table>
 

faetzminator

Gesperrter Benutzer
HTML/XHTML und Joomla -> PHP?
Code:
java-forum.org > Java - Programmierung  > Datenbankprogrammierung
Abgesehen davon, dass dir hier evtl jmd helfen kann, würde ich zuerst noch ein passenderes Forum suchen :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T 2 Tabellen aus 2 Datenbanken miteinander vergleichen Datenbankprogrammierung 6
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
R Datenbanken erstellen Datenbankprogrammierung 3
I Hilfe zu Multidimensionalen Datenbanken Datenbankprogrammierung 1
D Java Datenbanken Datenbankprogrammierung 1
T Lagerprogramm mit Datenbanken Datenbankprogrammierung 21
K Verschiedene Datenbanken - Was sollte ich lernen? Datenbankprogrammierung 11
M SQLite Zwei Datenbanken synchronisieren Datenbankprogrammierung 8
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
F MySQL+ Netbeans: Datenbanken mit Automatisch generierten Entity Classes get und set Datenbankprogrammierung 2
M Hash in Bezug auf Datenbanken unklar Datenbankprogrammierung 3
M Datenbankschema in relationalen Datenbanken Datenbankprogrammierung 3
Ananaskirsche Verschlüsselung von Datenbanken Datenbankprogrammierung 1
T Datenbanken-PDF Datenbankprogrammierung 15
Y Derby/JavaDB Benutzung von eingebetteten Datenbanken Datenbankprogrammierung 4
G Datenbanken in Java Datenbankprogrammierung 9
K Zwei Datenbanken miteinander auf Unterschiede vergleichen Datenbankprogrammierung 2
B Datenbanken schützen vor Zugriff Datenbankprogrammierung 3
M Beziehungsfrage Datenbanken Datenbankprogrammierung 5
L Große Datenbanken - Designproblem Datenbankprogrammierung 3
E Zwischen Datenbanken wechseln Datenbankprogrammierung 13
L Synchronisieren von 2 Datenbanken Datenbankprogrammierung 2
T a x b x c x....n Matrizen in Datenbanken Datenbankprogrammierung 5
P DatenBanken mit Netbeans erstellen Datenbankprogrammierung 17
K Grundfragen zu Datenbanken Datenbankprogrammierung 28
H Rechnen in Datenbanken - JDBC Mittel der Wahl? Datenbankprogrammierung 32
J Unterstützung für verschiedene Datenbanken Datenbankprogrammierung 2
T MySQL Auflistung aller Datenbanken??? Datenbankprogrammierung 9
J In viele verschiedene Datenbanken einfügen Datenbankprogrammierung 3
C MySQL Hibernate mit 2 Datenbanken Datenbankprogrammierung 12
V Hibernate mit 2 Datenbanken Datenbankprogrammierung 3
W MySQL Datenbanken auslesen Datenbankprogrammierung 3
M prinzipielle Frage zu Datenbanken und jars ... Datenbankprogrammierung 2
R PreparedStatement mit verschiedenen Datenbanken Datenbankprogrammierung 2
brainray Bei MySQL alle Datenbanken eines Servers abfragen Datenbankprogrammierung 3
R 1 Programm, 2 Datenbanken Datenbankprogrammierung 15
S Standard für Datenbanken Datenbankprogrammierung 3
G Datenbanken abgleichen Datenbankprogrammierung 4
P Insert into mit zwei Datenbanken Datenbankprogrammierung 3
G Effektive Methode zum durchsuchen von SQL-Datenbanken Datenbankprogrammierung 7
M Datenbanken synchronisieren Datenbankprogrammierung 2
P Datenbanken auswahl, anforderungen Datenbankprogrammierung 29
K Daten in Datenbanken einfügen Datenbankprogrammierung 6
G H2: Erstellen von Datenbanken verhindern Datenbankprogrammierung 2
Y Datenbanken Datenbankprogrammierung 6
M Maximale Kapazität von Datenbanken Datenbankprogrammierung 2
S Objektorientierte Datenbanken Datenbankprogrammierung 4
F Zwischen Datenbanken wählen auf SQL-Server Datenbankprogrammierung 4
G Umlaut-Problem mit Firebird Datenbanken Datenbankprogrammierung 8
I Datenbanken mit MySQL einrichten Datenbankprogrammierung 11
G Step-by-Step Anleitung für Datenbanken Datenbankprogrammierung 3
N Abfrage über zwei Datenbanken Datenbankprogrammierung 9
M Treiber für mysql Datenbanken Datenbankprogrammierung 2
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
Ataria SQLite Werte aus zwei Tabellen zusammenführen Datenbankprogrammierung 8
I H2 - GUI Tool.... sehe aber keine Tabellen Datenbankprogrammierung 2
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
H JDBC Tabellen ausgeben Datenbankprogrammierung 8
Kirby.exe Tabellen Zeilen combinen und splitten Datenbankprogrammierung 3
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
M Sql Tabellen erstellen Datenbankprogrammierung 3
F Tabellen automatisch erstellen wenn sie nicht existieren Datenbankprogrammierung 6
C Mapping mit Annotations von 2 Tabellen Datenbankprogrammierung 22
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
L Join zweier Tabellen in SQL Datenbankprogrammierung 2
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
feinperligekohlensaeure MySQL Dynamische Tabellen. Wie kann man es besser machen? Datenbankprogrammierung 3
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
D Count(*) auf 2 Tabellen anwenden Datenbankprogrammierung 7
D MySQL Many to Many Tabellen in Java abbilden? Datenbankprogrammierung 4
V SQLite 2 Tabellen vergleichen und nur Unterschiedliche Sätze rausgeben. Datenbankprogrammierung 31
F Tabellen verbinden Datenbankprogrammierung 13
L0MiN Wie kann ich eine bestimmte Seite aus verschiedenen Excel-Tabellen in eine neue Exceldatei kopieren? Datenbankprogrammierung 1
U Kann die Tabellen nicht finden Datenbankprogrammierung 0
D umschalten zwischen verschiedene Tabellen Datenbankprogrammierung 1
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
T Tabellen von nicht mehr vorhandenen Entities werden generiert Datenbankprogrammierung 0
J MySQL Workbench Tabellen werden verschoben Datenbankprogrammierung 1
M MySQL Tabellen dynamisch erstellen Datenbankprogrammierung 12
T Ähnliche Wrapperklassen + DB-Tabellen Datenbankprogrammierung 1
K HSQLDB Einzelne Tabellen abfragen? Datenbankprogrammierung 4
T Tabellen Alias Datenbankprogrammierung 7
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
J Tabellen in Tabellen finden Datenbankprogrammierung 4
S versionierte Tabellen Datenbankprogrammierung 2
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
I Was ist besser: Tabellen oder Spalten Datenbankprogrammierung 1
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
C SQL-Statement SELECT über 3 Tabellen Datenbankprogrammierung 5
G 2 Tabellen und ein spezieller Eintrag Datenbankprogrammierung 2
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
R PostgreSQL Tabellen hinzufügen, falls nicht vorhanden Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben