🏗️ SQL Lehrpfad 2: Joins & Design

SQL 08: n:m Beziehungen & Junction Tables

Lerne viele-zu-viele Beziehungen mit Junction Tables, zusammengesetzten Primärschlüsseln und 3-Wege-Joins professionell abzubilden.

💡 1. Warum Junction Tables (Verknüpfungstabellen)?

In relationalen Datenbanken kann ein Fremdschlüssel immer nur auf genau eine Zeile zeigen. Um eine n:m Beziehung (ein Student ↔ viele Kurse / ein Kurs ↔ viele Studenten) abzubilden, teilen wir sie über eine Junction Table in zwei 1:n Beziehungen auf:

┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐ │ studenten │ 1 n │ einschreibungen │ n 1 │ kurse │ ├─────────────────────────┤ ───────────── ├─────────────────────────┤ ───────────── ├─────────────────────────┤ │ PK id │ │ PK,FK student_id │ │ PK id │ │ matrikelnummer │ │ PK,FK kurs_id │ │ kurs_code │ │ vorname, nachname │ │ semester │ │ titel │ │ studiengang │ │ note │ │ ects │ └─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘

🔑 2. Zusammengesetzter Primärschlüssel & 3-Wege-Join

Der Primärschlüssel der Zwischentabelle besteht aus beiden Fremdschlüsseln (PRIMARY KEY (student_id, kurs_id)). Dadurch wird garantiert, dass sich ein Student nicht versehentlich doppelt für denselben Kurs einschreibt:

-- 3-Wege-Join zur Auflösung der n:m-Beziehung:
SELECT 
    s.matrikelnummer,
    s.vorname || ' ' || s.nachname AS student_name,
    k.kurs_code,
    k.titel AS kurs_titel,
    e.semester,
    e.note
FROM studenten s
JOIN einschreibungen e ON s.id = e.student_id
JOIN kurse k ON e.kurs_id = k.id
ORDER BY s.nachname, k.kurs_code;
🌉 Didaktische Analogie: Die Hängebrücke zwischen zwei Inseln

Die Tabelle studenten ist die eine Insel, die Tabelle kurse die andere. Die Junction Table einschreibungen ist die Hängebrücke dazwischen! Sie verbindet beide Welten und trägt zusätzliche Informationen wie den Zeitpunkt des Übertritts (Semester) und das Ergebnis (Note).

📑 3. Cheat-Sheet: n:m Pattern

Element SQL-Code Bedeutung
Composite PK PRIMARY KEY (a_id, b_id) Verhindert doppelte Verknüpfungen
FK mit Cascade FOREIGN KEY (a_id) REFERENCES t1(id) ON DELETE CASCADE Löscht Verknüpfungen beim Entfernen einer Entität
Beziehungs-Attribute note REAL, datum TEXT Zusatzdaten, die nur für das Paar (A, B) gelten
3-Wege-Join FROM a JOIN j ON a.id = j.a_id JOIN b ON j.b_id = b.id Löst die n:m-Verknüpfung in lesbare Daten auf

🎯 Aufgaben & Checkliste in aufgabe.sql

💻 In Web-IDE öffnen → ← Zurück zu SQL 07