====== Lösung: Eishockeyverein ======
{{:de:modul:m290_guko:learningunits:lu06:loesungen:eishockey_crowsfoot.drawio.png?direct&1200|Crow's-Foot-Diagramm Eishockeyverein}}
//Klicken Sie aufs Bild, um es vergrössert anzusehen.//
===== Fremdschlüssel =====
* **block_id** steht in **spieler_in**. Ein Block hat viele Spieler:innen, eine Spielerin gehört zu genau einem Block (1:n) – der Fremdschlüssel steht auf der "viele"-Seite.
* **team_id** steht in **block**. Ein Team hat viele Blöcke, ein Block gehört zu genau einem Team (1:n).
* **trainer_id** steht in **team** (1:1-Beziehung). Ein Team kann bereits existieren, bevor ihm ein Trainer zugeteilt ist – die Trainerfrage klärt sich oft erst später in der Saison. Die Seite, die auch ohne Partner existieren kann, bekommt den Fremdschlüssel.
**1:1 in SQL wirklich erzwingen:** Der Fremdschlüssel allein reicht nicht aus – ohne zusätzliche Regel könnte derselbe Trainer zwei Teams zugewiesen werden. Dafür bräuchte **trainer_id** in der Tabelle team zusätzlich den Constraint **UNIQUE**.
===== Datentypen =====
^ Spalte ^ Typ ^ Begründung ^
| spieler_id, block_id, team_id, trainer_id | INT | Ganzzahlige, automatisch vergebene IDs |
| rueckennummer | INT | Es wird zwar nicht damit gerechnet, aber Rückennummern sind reine Ziffern ohne führende Nullen – INT ist hier vertretbar |
| position, name (überall) | VARCHAR | Textlänge variabel |
| altersklasse | VARCHAR(5) | Kurze Codes wie "U18", "U21" passen knapp – bewusst kurz gehalten |
| bezeichnung | VARCHAR(20) | Kurzer Blockname wie "1. Block" |
===== SQL: Tabellen erstellen =====
Fremdschlüssel-Spalten sind angelegt, aber noch **ohne FOREIGN-KEY-Constraint** – den setzen wir später im Modul.
CREATE TABLE trainer (
trainer_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE team (
team_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
altersklasse VARCHAR(5),
trainer_id INT UNIQUE
);
CREATE TABLE block (
block_id INT AUTO_INCREMENT PRIMARY KEY,
bezeichnung VARCHAR(20),
team_id INT
);
CREATE TABLE spieler_in (
spieler_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
rueckennummer INT,
position VARCHAR(20),
block_id INT
);