habe mal eine Frage bezüglich der Modellierung von Datenbanken.
Sorry, es wird sehr viel Text werden.
Ich entwickel meine DBs nach Möglichkeit immer zunächst im ERM/ERD
und erstelle daraus das relationale Modell.
Mir sind 6 Regeln bekannt, die eindeutig festlegen, bei welchen Beziehungen
es wie viel Tabellen geben sollte.
Aber vor Kurzem hatte ich ein Gespräch (ja fast schon ein Streitgespräch) über
folgenden Sachverhalt:
Es existieren drei Autofahrer und drei Autos. Allerdings fährt nicht jeder ein Auto
und somit wird auch nicht jedes Auto gefahren (z.B. wegen Werkstattaufenthalt)
- Code: Alles auswählen
Dirk----------BMW Z4
Hans Porsche 911
Franz---------Audi A6
Hans fährt kein Auto und der Porsche wird nicht gefahren.
In der ERM/ERD Schreibweise arbeite ich nicht nur mit der Chen-Notation (1:1 usw.)
sondern auch mit der Min-/Max Notation.
- Code: Alles auswählen
---------- [0,1] [0,1] ---------
| Fahrer |----------/\----------| Autos |
---------- \/ ---------
1:1
Also, ein Fahrer fährt mindestens KEIN Auto. Hans ist hier derjenige, der kein Auto fahren kann.
Maximal kann aber von einem Fahrer nur EIN Auto gefahren werden. Deswegen links oben: [0,1]
0 ist das Minimum und 1 das Maximum
Auf der rechten Seite ist das Minimum ebefalls 0, weil das Auto nicht zwingend gefahren werden
muss. Wenn aber ein Auto gefahren wird, dann von genau einem Fahrer.
Hier sind also beide Seiten optional bzw. nicht-obligatorisch.
Trotz dieser Situation handelt es sich immer noch um eine 1:1 Beziehung.
In dieser Konstellation können Leerfelder in den Tabellen entstehen. Wenn man nur mit zwei
Tabellen arbeitet, ist es sogar völlig egal welche PK als FK in der anderen Tabelle untergebracht
wird. Es entstehen definitiv Leerfelder.
Nur wenn man die Zuordnung in einer dritten Tabelle herstellt, gibt es keine Leerfelder und der
Entwurf sollte korrekt sein.
- Code: Alles auswählen
Zunächst die beiden Tabellen
--------------- ---------------
| Fahrer (PK) | | Autos (PK) |
--------------- ---------------
| Dirk | | BMW Z4 |
| Hans | | Porsche 911 |
| Franz | | Audi A6 |
--------------- ---------------
- Code: Alles auswählen
Nun lasse ich z.B. den PK der rechten Seite als FK auf die linke Seite wandern.
Man sieht, dass ein Leerfeld entsteht, weil Hans kein Auto fährt:
----------------------------- ---------------
| Fahrer (PK) | Autos (FK) | | Autos (PK) |
----------------------------- ---------------
| Dirk | BMW Z4 | | BMW Z4 |
| Hans | | | Porsche 911 |
| Franz | Audi A6 | | Audi A6 |
----------------------------- ---------------
- Code: Alles auswählen
Lasse ich hingegen den PK der linken Seite als FK auf die rechte Seite wandern, passiert
im Prinzip das selbe. Man sieht, dass ein Leerfeld entsteht, weil der Porsche 911 nicht
gefahren wird:
--------------- -----------------------------
| Fahrer (PK) | | Autos (PK) | Fahrer (FK) |
--------------- -----------------------------
| Dirk | | BMW Z4 | Dirk |
| Hans | | Porsche 911 | |
| Franz | | Audi A6 | Franz |
--------------- -----------------------------
Erst wenn ich in einer dritten Tabelle die beiden PKs als FKs hineinehme und damit
die entsprechende Zuordnung treffe, kann ich die Leerfelder verhindern:
- Code: Alles auswählen
--------------- ----------------------------- ---------------
| Fahrer (PK) | | Fahrer (FK) | Autos (FK) | | Autos (PK) |
--------------- ----------------------------- ---------------
| Dirk | | Dirk | BMW Z4 | | BMW Z4 |
| Hans | | Franz | Audi A6 | | Porsche 911 |
| Franz | ----------------------------- | Audi A6 |
--------------- ---------------
Nachtrag. Hier habe ich in meiner dritten Tabelle (also die in der Mitte) den PK vergessen.
Da eine Spalte beide Attribute, nämlich FK UND PK annehmen kann, seien hier die FKs
auch gleichzeitig die PKs. In diesem Fall reicht sogar nur eine FK-Spalte als PK aus. ;-)
Nun ist u.a. das Problem der Leerfelder gelöst. Die Referentielle Integrität sollte auch
hergestellt sein, aber jetzt natürlich die Frage: LOHNT SICH DAS?
Sind Leerfelder egal?
Wie sieht es mit der Performance in der DB aus? (Wie kann man das messen?)
Ein Leerfeld benöigt Speicherplatz...eine neue Tabelle aber auch.
Lohnt sich dieser Ansatz erst ab 1000de von Einträgen?
Womit begründe ich im Kern den Einsatz von drei Tabellen?
Danke für Eure Geduld
Dickus
