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:b_fk-grundlagen [2026/08/13 16:06] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m290_guko:learningunits:lu08:theorie:b_fk-grundlagen [2026/08/13 16:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden 216.73.216.62 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU08b: Warum Fremdschlüssel bzw. mehrere Tabellen? ====== | ||
| + | |||
| + | ==== Ausgangslage ==== | ||
| + | Naheliegend ist: **Alles in eine Tabelle** (Post + Autor + Kategorie). | ||
| + | In echten Blogs (z. B. WordPress) führt das aber zu **Wiederholungen**, | ||
| + | |||
| + | Wir bleiben beim Reiseblog-Beispiel von der letzten Seite [[https:// | ||
| + | |||
| + | |||
| + | ==== Beispiel: Alles in einer Tabelle (schlechte Idee) ==== | ||
| + | <WRAP center box 80% round>< | ||
| + | -- Eine Tabelle für alles: Post + Autor + Kategorie (redundant!) | ||
| + | CREATE TABLE blog_posts ( | ||
| + | id INT AUTO_INCREMENT PRIMARY KEY, | ||
| + | post_title | ||
| + | post_content | ||
| + | author_name | ||
| + | author_email | ||
| + | category_name | ||
| + | created_at | ||
| + | ); </ | ||
| + | |||
| + | **Daten einfügen (nur eine Kategorie pro Zeile möglich): | ||
| + | <WRAP center box 80% round>< | ||
| + | INSERT INTO blog_posts | ||
| + | (post_title, | ||
| + | VALUES | ||
| + | (' | ||
| + | ' | ||
| + | ' | ||
| + | |||
| + | (' | ||
| + | ' | ||
| + | ' | ||
| + | |||
| + | (' | ||
| + | ' | ||
| + | 'Caro Steig', | ||
| + | </ | ||
| + | |||
| + | <WRAP round 80% center> | ||
| + | **Warum nur //eine// Kategorie pro Zeile?** | ||
| + | Komma-Listen wirken bequem, sind aber ungünstig: | ||
| + | |||
| + | * **Keine Prüfung / kein FK((Foreign Key = Fremdschlüssel)).** Die Datenbank (DB) kann bei «Belgien, Städtereise» **nicht** prüfen, ob diese Kategorien wirklich existieren. ((Wenn Kategorien und Posts in **separate Tabellen** liegen und per Fremdschlüssel verbunden sind, kontrolliert die DB beim Speichern, ob «Belgien» in der Kategorien-Tabelle vorhanden ist.)) → Tippfehler bleiben unbemerkt ((z. B. «Belgien, Städtereisen» statt «Belgien, Städtereise»)). | ||
| + | * **Unzuverlässiges Filtern.** Suchen mit LIKE liefern leicht Teiltreffer/ | ||
| + | * **Schwierig auszuwerten & langsam.** Zählen/ | ||
| + | |||
| + | **Besser:** Pro Zeile **eine** Kategorie. Für mehrere Kategorien pro Post (N: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | **Auszug:** | ||
| + | {{ de: | ||
| + | |||
| + | <WRAP box round 80% center> | ||
| + | **Probleme auf einen Blick:** | ||
| + | * **Redundanz**: | ||
| + | * **Fehleranfällig**: | ||
| + | * **Aufwendig**: | ||
| + | * **Nur eine Kategorie möglich**: Idealerweise möchten wir aber mehrere Kategorien pro Blog-Post vergeben – z.B. beim Blog-Post «Utrecht – 10 Sehenswürdigkeiten»: | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Tippfehler in Kategorie: sichtbare Folgen ==== | ||
| + | Ein fehlender Buchstabe reicht: **Städtereise** vs. **Stätdereise**. | ||
| + | |||
| + | <WRAP center box 80% round>< | ||
| + | INSERT INTO blog_posts | ||
| + | (post_title, | ||
| + | VALUES | ||
| + | (' | ||
| + | ' | ||
| + | 'Caro Steig', | ||
| + | </ | ||
| + | |||
| + | **Direkte Folgen in Abfragen:** | ||
| + | <WRAP center box 80% round> | ||
| + | ^ Abfrage ^ Zweck ^ Effekt bei Tippfehler ^ | ||
| + | | <code sql> | ||
| + | | <code sql> | ||
| + | </ | ||
| + | |||
| + | ==== Teil-Update: | ||
| + | Nur **eine** von mehreren Zeilen eines Autors wird geändert → inkonsistente Daten. | ||
| + | |||
| + | <WRAP center box 80% round>< | ||
| + | UPDATE blog_posts | ||
| + | SET author_email = ' | ||
| + | WHERE id = 1; | ||
| + | |||
| + | SELECT id, post_title, author_name, | ||
| + | FROM blog_posts | ||
| + | WHERE author_name = ' | ||
| + | |||
| + | **Ergebnis: | ||
| + | <WRAP center box 80% round> | ||
| + | ^ id ^ post_title | ||
| + | | 1 | Hasselt – 10 Highlights | ||
| + | | 2 | Utrecht – 10 Sehenswürdigkeiten | Martin Merten | martin@wetraveltheworld.de | ||
| + | </ | ||
| + | //Gleicher Autor, unterschiedliche E-Mail → Daten sind inkonsistent.// | ||
| + | |||
| + | <WRAP center tip round 80%> | ||
| + | [[https:// | ||
| + | </ | ||
| + | |||
| + | ==== Ausblick ==== | ||
| + | Auf der nächsten Seite bauen wir genau dieses Mehrtabellen-Schema **mit Fremdschlüsseln** auf und füllen es mit den obigen Reiseblog-Beispieldaten. | ||