====== 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 );