Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m290_guko:learningunits:lu08:theorie:e_many-to-many [2025/10/19 22:55] – angelegt gkoch | modul:m290_guko:learningunits:lu08:theorie:e_many-to-many [2025/10/26 18:18] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 6: | Zeile 6: | ||
| (Die Verknüpfung **users ↔ posts** ist 1:N; **posts ↔ categories** ist N:M.) | (Die Verknüpfung **users ↔ posts** ist 1:N; **posts ↔ categories** ist N:M.) | ||
| - | ==== Warum N:M auflösen? | + | ==== Warum N:M auflösen? ==== |
| - | In einer relationalen Tabelle | + | In einer relationalen Tabelle |
| Bei **N:M** gilt jedoch: **ein Post → mehrere Kategorien** und **eine Kategorie → mehrere Posts**. | Bei **N:M** gilt jedoch: **ein Post → mehrere Kategorien** und **eine Kategorie → mehrere Posts**. | ||
| - | Das lässt sich **nicht** mit einem einzigen FK-Feld abbilden: | ||
| - | - FK in '' | ||
| - | - FK in '' | ||
| - | - Kommaliste in einer Spalte (z. B. '' | ||
| - | - mehrere FK-Spalten (z.B. category_id1, | ||
| - | Gleich hier ein paar Tabellen, die die einzelnen vorhin aufgeführten Punkte visualisieren | + | Das lässt sich mit **einem** FK-Feld nicht sauber abbilden: |
| - | {{:modul:m290_guko:learningunits: | + | * 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 '' | **Lösung: die Zwischentabelle '' | ||
| Wir trennen die Objekte ('' | Wir trennen die Objekte ('' | ||
| - | So bleibt jede Beziehung eindeutig modelliert, Primärschlüssel bleiben eindeutig, Fremdschlüssel sind prüfbar, und Abfragen bleiben klar und performant. | + | So bleibt jede Beziehung |
| - | === Visualisierung (Kontext) | + | === N:M mit Zwischentabelle |
| - | **users ↔ posts (1:N)** | + | |
| - | {{: | + | |
| **posts ↔ categories (N:M) – korrekt über Zwischentabelle '' | **posts ↔ categories (N:M) – korrekt über Zwischentabelle '' | ||
| Zeile 40: | Zeile 40: | ||
| CREATE TABLE post_category ( | CREATE TABLE post_category ( | ||
| - | post_id | + | |
| - | category_id INT NOT NULL, | + | category_id INT NOT NULL, |
| - | PRIMARY KEY (post_id, category_id), | + | PRIMARY KEY (post_id, category_id), |
| - | FOREIGN KEY (post_id) REFERENCES posts (post_id) ON DELETE CASCADE ON UPDATE CASCADE, | + | 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 | + | FOREIGN KEY (category_id) REFERENCES categories (category_id) ON DELETE CASCADE ON UPDATE CASCADE |
| ); | ); | ||
| </ | </ | ||
| Zeile 92: | Zeile 92: | ||
| **Erwartung: | **Erwartung: | ||
| - | |||
| - | ===== 4) Aufgaben ===== | ||
| - | |||
| - | * **Aufgabe A:** Fügen Sie eine neue Kategorie `Benelux` (slug: benelux) ein und ordnen Sie //Hasselt – 10 Highlights// | ||
| - | * **Aufgabe B:** Löschen Sie die Kategorie // | ||
| ===== Zusammenfassung ===== | ===== Zusammenfassung ===== | ||
| - | * **N:M** wird **immer** über eine **Zwischentabelle** mit **einer Paarung pro Zeile** modelliert: //(post_id, category_id)// | + | |
| - | * **Fremdschlüssel** sichern die Datenqualität; | + | * **Fremdschlüssel** sichern die Datenqualität; |
| + | |||
| + | ==== Weiterführende Videos ==== | ||
| + | <WRAP center tip round 80%> | ||
| + | [[https:// | ||
| + | </ | ||
| <WRAP tip round 80% center> | <WRAP tip round 80% center> | ||
| **Ausblick auf LU09:** Wir formulieren dieselben Abfragen für mehrere Tabellen </ | **Ausblick auf LU09:** Wir formulieren dieselben Abfragen für mehrere Tabellen </ | ||