Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m290_guko:learningunits:lu08:theorie:e_many-to-many [2026/08/13 16:06] – ↷ Seite von modul:m290_guko:learningunits:lu08:theorie:e_many-to-many nach de:modul:m290_guko:learningunits:lu08:theorie:e_many-to-many verschoben msuter | de:modul:m290_guko:learningunits:lu08:theorie:e_many-to-many [2026/10/17 16:46] (aktuell) – gelöscht gkoch | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== LU08e: N: | ||
| - | |||
| - | **Ziel:** Sie modellieren eine **Many-to-Many**-Beziehung (Posts ↔ Kategorien) korrekt mit einer **Zwischentabelle** '' | ||
| - | |||
| - | **Voraussetzung: | ||
| - | (Die Verknüpfung **users ↔ posts** ist 1:N; **posts ↔ categories** ist N:M.) | ||
| - | |||
| - | ==== Warum N:M auflösen? ==== | ||
| - | In einer relationalen Tabelle kann ein Fremdschlüssel **immer nur auf genau eine** Zielzeile verweisen. | ||
| - | Bei **N:M** gilt jedoch: **ein Post → mehrere Kategorien** und **eine Kategorie → mehrere Posts**. | ||
| - | |||
| - | |||
| - | Das lässt sich mit **einem** FK-Feld nicht sauber abbilden: | ||
| - | |||
| - | * FK in '' | ||
| - | * FK in '' | ||
| - | * Kommaliste in einer Spalte (z. B. '' | ||
| - | * Mehrere FK-Spalten (z. B. '' | ||
| - | |||
| - | Die folgenden Tabellen-Skizzen visualisieren diese Ansätze – **alles sind schlechte Lösungen** (siehe oben): | ||
| - | |||
| - | {{: | ||
| - | |||
| - | **Lösung: die Zwischentabelle '' | ||
| - | Wir trennen die Objekte ('' | ||
| - | So bleibt jede Beziehung **eindeutig** modelliert, Primärschlüssel bleiben eindeutig, Fremdschlüssel sind **prüfbar**, | ||
| - | |||
| - | |||
| - | === N:M mit Zwischentabelle === | ||
| - | |||
| - | **posts ↔ categories (N:M) – korrekt über Zwischentabelle '' | ||
| - | {{: | ||
| - | |||
| - | ===== 1) Zwischentabelle anlegen (mit Fremdschlüsseln) ===== | ||
| - | Eine Zeile = **genau eine Zuordnung** '' | ||
| - | **CASCADE** sorgt dafür, dass Zuordnungen automatisch gelöscht werden, wenn ein Post oder eine Kategorie gelöscht wird. | ||
| - | |||
| - | <WRAP center box 80% round> | ||
| - | <code sql> | ||
| - | |||
| - | CREATE TABLE post_category ( | ||
| - | post_id | ||
| - | category_id INT NOT NULL, | ||
| - | PRIMARY KEY (post_id, category_id), | ||
| - | FOREIGN KEY (post_id) REFERENCES posts (post_id) ON DELETE CASCADE ON UPDATE CASCADE, | ||
| - | FOREIGN KEY (category_id) REFERENCES categories (category_id) ON DELETE CASCADE ON UPDATE CASCADE | ||
| - | ); | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | ===== 2) N: | ||
| - | (IDs gemäss **LU08c**) | ||
| - | |||
| - | <WRAP center box 80% round> | ||
| - | <code sql> | ||
| - | INSERT INTO post_category (post_id, category_id) VALUES | ||
| - | (1, 4), -- Hasselt → Belgien | ||
| - | (1, 1), -- Hasselt → Städtereise | ||
| - | |||
| - | (2, 5), -- Utrecht → Niederlande | ||
| - | (2, 1), -- Utrecht → Städtereise | ||
| - | |||
| - | (3, 6), -- Lissabon → Portugal | ||
| - | (3, 1), -- Lissabon → Städtereise | ||
| - | |||
| - | (4, 5), -- Maastricht → Niederlande | ||
| - | (4, 1), -- Maastricht → Städtereise | ||
| - | |||
| - | (5, 8), -- Montenegro Roadtrip → Montenegro | ||
| - | (5, 2), -- Montenegro Roadtrip → Abenteuer | ||
| - | (5, 3), -- Montenegro Roadtrip → Roadtrip | ||
| - | |||
| - | (6, 9), -- Oman → Oman | ||
| - | (6, 2), -- Oman → Abenteuer | ||
| - | (6, 3), -- Oman → Roadtrip | ||
| - | |||
| - | (7, 10), -- Chicago → USA | ||
| - | (7, 1); -- Chicago → Städtereise </ | ||
| - | |||
| - | |||
| - | ===== 3) Praxis: CASCADE ===== | ||
| - | Beim Löschen eines Posts (oder einer Kategorie) werden die **Zuordnungen in '' | ||
| - | |||
| - | <WRAP center box 80% round> | ||
| - | <code sql> | ||
| - | -- Demo: Post #2 löschen | ||
| - | DELETE FROM posts WHERE post_id = 2; | ||
| - | |||
| - | -- Kontrolle: Mappings zu Post #2 sind weg | ||
| - | SELECT * FROM post_category WHERE post_id = 2; </ | ||
| - | </ | ||
| - | |||
| - | **Erwartung: | ||
| - | |||
| - | ===== Zusammenfassung ===== | ||
| - | |||
| - | * **N:M** wird **immer** über eine **Zwischentabelle** mit **einer Paarung pro Zeile** modelliert: //(post_id, category_id)// | ||
| - | * **Fremdschlüssel** sichern die Datenqualität; | ||
| - | |||
| - | ==== Weiterführende Videos ==== | ||
| - | <WRAP center tip round 80%> | ||
| - | [[https:// | ||
| - | </ | ||
| - | |||
| - | <WRAP tip round 80% center> | ||
| - | **Ausblick auf LU09:** Wir formulieren dieselben Abfragen für mehrere Tabellen </ | ||