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] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m290_guko:learningunits:lu08:theorie:e_many-to-many [2026/08/13 16:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden 216.73.216.62 | ||
|---|---|---|---|
| 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): | ||
| + | |||
| + | {{de: | ||
| + | |||
| + | **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 '' | ||
| + | {{de: | ||
| + | |||
| + | ===== 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 </ | ||