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