Fremdschlüssel bestimmen
Lösung geprüft
Die Aufgabe der heutigen Stunde ist der Fremdschlüssel! Der Primärschlüssel macht eine Zeile eindeutig – der Fremdschlüssel ist das, was Tabellen überhaupt erst miteinander verbindet. Ohne ihn hätte man lauter einzelne Tabellen, die nichts voneinander wissen.
Übung 1: T1 „Fahrzeuge" mit den Attributen Fahrzeug_ID, Marke_ID, Anzahl_Tueren, PS. T2 „Marken" mit den Attributen Marke_ID, Marke_Name, Hersteller_Land, Gruendungsdatum. Wo finden Sie einen Fremdschlüssel?
DB_02-2 Fremdschlüssel bestimmen (einfach): Füllen Sie alle Tabellen mit sinnvollen Datensätzen. Markieren Sie die Primärschlüssel wie gelernt; markieren Sie die Fremdschlüssel mit einer Farbe. Gegeben sind die Tabellen „Wurstsorten", „Farbstoffe", „Lieferanten" und „Orte".
Übung 1 – Fahrzeuge und Marken
Fahrzeuge(Fahrzeug_ID, Marke_ID, Anzahl_Tueren, PS)
^^^^^^^^^^ ^^^^^^^^
PK FK -> Marken.Marke_ID
Marken(Marke_ID, Marke_Name, Hersteller_Land, Gruendungsdatum)
^^^^^^^^
PK
Der Fremdschlüssel ist Marke_ID in der Tabelle
Fahrzeuge. Dort ist es ein Fremdschlüssel, in der Tabelle Marken
ist dasselbe Attribut der Primärschlüssel.
Woran man ihn erkennt
Ein Attribut ist ein Fremdschlüssel, wenn es in einer anderen
Tabelle der Primärschlüssel ist. Praktischer Trick: ein Attribut,
das auf _ID endet und nicht der eigene Primärschlüssel ist,
ist fast immer ein Fremdschlüssel.
Und die Richtung stimmt so herum und nicht andersherum. Man könnte ja fragen, warum die Marke nicht die Fahrzeuge kennt. Antwort: eine Marke hat viele Fahrzeuge, ein Fahrzeug hat aber genau eine Marke. Der Fremdschlüssel steht immer auf der Seite, wo „viele" steht – sonst müsste man in eine Zelle mehrere Werte schreiben, und das ist verboten.
DB_02-2 – Die Wurstsorten
Vier Tabellen, und die Fremdschlüssel bilden eine Kette.
Tabelle 1: Wurstsorten
| ID (PK) | Sorte_Name | Lieferant_ID (FK) | Mehrwertsteuersatz | Einkaufspreis | Farbstoff_ID (FK) |
|---|---|---|---|---|---|
| 1 | Fleischwurst | 1 | 7 | 3,49 | 2 |
| 2 | Salami | 2 | 7 | 5,20 | 1 |
Tabelle 2: Farbstoffe
| ID (PK) | Name | Gefaehrlichkeitsstufe |
|---|---|---|
| 1 | Echtes Karmin (E120) | 2 |
| 2 | Rote Bete Rot (E162) | 1 |
Tabelle 3: Lieferanten
| ID (PK) | Name | Postleitzahl (FK) | Status |
|---|---|---|---|
| 1 | Metzgerei Krause | 65183 | aktiv |
| 2 | Wurstwaren Nord | 20095 | aktiv |
Tabelle 4: Orte
| Postleitzahl (PK) | Ortname | Tel-Vorwahl |
|---|---|---|
| 65183 | Wiesbaden | 0611 |
| 20095 | Hamburg | 040 |
In Relationenschreibweise
Wurstsorten(ID, Sorte_Name, Lieferant_ID, Mehrwertsteuersatz,
Einkaufspreis, Farbstoff_ID)
PK FK->Lieferanten.ID FK->Farbstoffe.ID
Farbstoffe(ID, Name, Gefaehrlichkeitsstufe)
PK
Lieferanten(ID, Name, Postleitzahl, Status)
PK FK->Orte.Postleitzahl
Orte(Postleitzahl, Ortname, Tel-Vorwahl)
PK
Die Kette
Wurstsorten ---> Lieferanten ---> Orte
|
+---------> Farbstoffe
erDiagram
ORTE ||--o{ LIEFERANTEN : "Postleitzahl"
LIEFERANTEN ||--o{ WURSTSORTEN : "Lieferant_ID"
FARBSTOFFE ||--o{ WURSTSORTEN : "Farbstoff_ID"
WURSTSORTEN {
int ID PK
string Sorte_Name
int Lieferant_ID FK
int Mehrwertsteuersatz
decimal Einkaufspreis
int Farbstoff_ID FK
}
FARBSTOFFE {
int ID PK
string Name
int Gefaehrlichkeitsstufe
}
LIEFERANTEN {
int ID PK
string Name
int Postleitzahl FK
string Status
}
ORTE {
int Postleitzahl PK
string Ortname
string Tel_Vorwahl
}
Zwei Sachen fallen dabei auf. Erstens verweist Wurstsorten
auf zwei Tabellen gleichzeitig – eine Tabelle darf
beliebig viele Fremdschlüssel haben. Zweitens ist
Lieferanten gleichzeitig Kind (verweist auf Orte) und
Elterntabelle (Wurstsorten verweist darauf). Das ist völlig normal und
kommt in der nächsten Aufgabe nochmal ausführlich dran.
Warum der Ort nicht direkt in die Lieferanten gehört
Man könnte ja einfach Ortname und Vorwahl in
die Lieferanten-Tabelle schreiben. Drei Gründe, warum man das nicht macht:
- Redundanz: Bei fünfzig Lieferanten in Wiesbaden steht „Wiesbaden" fünfzigmal da.
- Änderungsanomalie: Ändert sich die Vorwahl, muss man sie an fünfzig Stellen ändern – und vergisst garantiert eine.
- Tippfehler: Einmal „Wiesbaden", einmal „Wiesbaden " mit Leerzeichen – und schon findet die Abfrage nur die Hälfte.
Das ist schon die halbe Normalisierung, die später als eigenes Thema drankommt. Hier sieht man den Grund dafür zum ersten Mal.
Und die referenzielle Integrität
Ein Fremdschlüssel ist nicht nur Dokumentation. Die Datenbank passt aktiv darauf auf:
- Man kann keine Wurstsorte mit
Lieferant_ID = 99eintragen, wenn es keinen Lieferanten 99 gibt - Man kann keinen Lieferanten löschen, solange noch Wurstsorten auf ihn verweisen
Deshalb heißt es referenzielle Integrität: die Verweise bleiben immer gültig, die Datenbank lässt gar nichts anderes zu.