====== Lösung: Schweizer Regionen ======
{{:de:modul:m290_guko:learningunits:lu06:loesungen:gemeinden_kva_crowsfoot.drawio.png?direct&1200|Crow's-Foot-Diagramm Schweizer Regionen}}
//Klicken Sie aufs Bild, um es vergrössert anzuzeigen.//
===== Fremdschlüssel =====
* **kantons_kennzeichen** steht in **gemeinde**. Ein Kanton hat viele Gemeinden, eine Gemeinde gehört zu genau einem Kanton (1:n).
* **anlage_id** steht ebenfalls in **gemeinde**. Eine Kehrichtverbrennungsanlage wird von mehreren Gemeinden genutzt, eine Gemeinde nutzt genau eine Anlage (1:n) – zwei Fremdschlüssel in derselben Tabelle.
Mehrere Fremdschlüssel in derselben Tabelle sind kein Fehler: Sie treten immer dann auf, wenn eine Entität an zwei unabhängigen 1:n-Beziehungen die "viele"-Seite ist.
**Besonderheit:** Der Primärschlüssel von kanton ist **kantons_kennzeichen CHAR(2)** – kein INT wie in allen anderen Tabellen. Das ist ein sogenannter **natürlicher Schlüssel**: "ZH", "BE", "GR" sind von Natur aus eindeutig und ändern sich nie, eine künstliche Zusatz-ID wäre hier unnötig. Der Fremdschlüssel in gemeinde übernimmt exakt denselben Typ (CHAR(2)) – Primär- und Fremdschlüssel müssen immer vom gleichen Datentyp sein.
===== Datentypen =====
^ Spalte ^ Typ ^ Begründung ^
| kantons_kennzeichen | CHAR(2) | Natürlicher Schlüssel, immer genau 2 Zeichen ("ZH", "BE" …) |
| gemeinde_id, anlage_id | INT | Ganzzahlige, künstliche IDs |
| einwohnerzahl | INT | Ganze Zahl |
| flaeche | DECIMAL(6,2) | Fläche mit Nachkommastellen, exakt – der grösste Kanton (GR, ca. 7105 km²) passt in 4 Vorkommastellen |
| plz | CHAR(4) | Einzelne, repräsentative Postleitzahl |
| name | VARCHAR | Textlänge variabel |
===== SQL: Tabellen erstellen =====
Fremdschlüssel-Spalten sind angelegt, aber noch **ohne FOREIGN-KEY-Constraint** – den setzen wir später im Modul.
CREATE TABLE kanton (
kantons_kennzeichen CHAR(2) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
einwohnerzahl INT,
flaeche DECIMAL(6,2)
);
CREATE TABLE kva (
anlage_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
ort VARCHAR(20)
);
CREATE TABLE gemeinde (
gemeinde_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
einwohnerzahl INT,
plz CHAR(4),
kantons_kennzeichen CHAR(2),
anlage_id INT
);