====== LU04b - Die Crow’s-Foot-Notation ======
{{:modul:m290_guko:learningunits:lu04:theorie:daniel-shapiro-d-vbdk5rqr0-unsplash_converted_medium.jpg?nolink&400|}}
„Crow’s Foot“ bedeutet übersetzt **Krähenfuss**. Der Name kommt vom Symbol für //many// (viele), das wie ein kleiner Krähenfuss aussieht. {{:modul:m290_guko:learningunits:lu04:theorie:crows_foot.png?nolink&50|}}
Die **Crow’s-Foot-Notation** stellt eine Datenbank so dar, dass man sofort erkennt:
* wie **Entitäten** (Tabellen) miteinander verknüpft sind,
* wie viele Objekte (Instanzen) einer Entität mit wie vielen Objekten einer anderen verbunden sein können (= **Kardinalität**),
* welche **Primärschlüssel (PK)** und **Fremdschlüssel (FK)** definiert sind,
* welche **Attribute** zu einer Tabelle gehören (auf Wunsch auch mit Datentypen).
Damit kann die Crow’s-Foot-Notation Teil eines **logischen Datenbankschemas** sein und bildet die Brücke von der Analyse (Chen-Notation) zur technischen Umsetzung in SQL.
==== Kardinalitäten in der Crow’s-Foot-Notation ====
Die **Kardinalität** beschreibt die Art der Beziehung zwischen zwei Entitäten. Es gibt drei Haupttypen:
1. **One-to-One (1:1)**
Eine Instanz von Entität A gehört genau zu einer Instanz von Entität B.
Beispiel:
* Ein:e Mitarbeitende ↔ genau ein Arbeitsplatz
* Jeder Reisepass ↔ genau eine Person
Darstellung: Linie mit kurzem Strich auf beiden Seiten.
{{:modul:m290_guko:learningunits:lu04:theorie:one-to-one.png?nolink&400|One-to-One Beziehung}}
//One-to-One (1:1) Beziehung: __Ein__ Auto kann (gleichzeitig) immer nur __einen__ Fahrer, __eine__ Fahrerin haben. __Eine__ Fahrerin, __ein__ Fahrer kann (gleichzeitig) nur immer __Ein__ Auto fahren.//
2. **One-to-Many (1:N)**
Eine Instanz von Entität A kann mit vielen Instanzen von Entität B verbunden sein.
Umgekehrt gehört jede Instanz von B zu genau einer Instanz von A.
Beispiel:
* Ein Regisseur ↔ viele Filme
* Ein Spotify-Artist ↔ viele Songs
* Eine Klasse ↔ viele Lernende
Darstellung: Linie mit Strich (= „eins“) auf Seite A und einem „Krähenfuss“ (drei Linien) auf Seite B.
{{:modul:m290_guko:learningunits:lu04:theorie:one-to-many.png?nolink&400|One-to-Many Beziehung}}
//One-to-Many (1:n) Beziehung: __Ein__ Regisseur, __eine__ Regisseurin kann __mehrere__ Filme drehen. __Ein__ Film wird (in der Regel) nur von __einem__ Regisseur, __einer__ Regisseurin gedreht. //
3. **Many-to-Many (M:N)**
Mehrere Instanzen von Entität A können mit mehreren Instanzen von Entität B verknüpft sein.
Beispiel:
* Mehrere Schauspieler:innen ↔ spielen in mehreren Filmen
* Viele Lernende ↔ besuchen mehrere Module
* Viele Songs ↔ sind in mehreren Playlists enthalten
Darstellung: Krähenfüsse auf beiden Seiten der Beziehung.
{{:modul:m290_guko:learningunits:lu04:theorie:many-to-many.png?nolink&400|Many-to-Many Beziehung}}
//Many-to-Many (n:m) Beziehung: __Ein:e__ Schauspieler:in kann in __mehreren__ Filme spielen. __Ein__ Film kann __mehrere__ Schauspieler:innen haben. //
Die folgende Abbildung zeigt alle möglichen Kardinalitäten:
{{:modul:m290:learningunits:lu03:theorie:crow-notation-chart-4127045304.png?300|Alle möglichen Kardinalitäten in der Crow’s-Foot-Notation}}
==== Warum Crow’s-Foot-Notation? ====
Die **Crow’s-Foot-Notation** wird oft in der Praxis eingesetzt, weil sie eine **klare und technische Darstellung** bietet.
Im Unterschied zur Chen-Notation, die eher **fachlich und abstrakt** ist, dient Crow’s-Foot als **Brücke zur Umsetzung in SQL**:
* Sie zeigt **Entitäten als Tabellen** mit ihren Attributen.
* Sie markiert **Primärschlüssel (PK)** und **Fremdschlüssel (FK)**.
* Sie stellt **Beziehungen und Kardinalitäten** (1:1, 1:n, n:m) deutlich dar.
* Es können auch die Datentypen der Attribute (Spalten) vermerkt werden.
Damit ist sie die **letzte Station vor der praktischen Umsetzung** mit SQL-Befehlen wie //CREATE TABLE …//.
Crow’s-Foot wird also vor allem von **Entwickler:innen, Datenbank-Designer:innen und Lernenden** genutzt, die den Schritt von der Analyse (Chen) zur technischen Umsetzung (SQL) machen.
==== Beispiel Crow’s-Foot-Notation ====
Stellen wir uns einen **Online-Buchshop** vor. Wir haben die Entitäten:
* **Kunde**
* **Bestellung**
* **Produkt**
Beziehungen:
* Ein Kunde kann viele Bestellungen aufgeben (1:N).
* Eine Bestellung kann mehrere Produkte enthalten, und ein Produkt kann in vielen Bestellungen vorkommen (M:N).
{{:modul:m290_guko:learningunits:lu04:theorie:bestellung_crows_feet.drawio_1_.png?direct&600|}}
Darstellung in Crow’s-Foot-Notation:
* Linie zwischen Kunde und Bestellung, mit Strich (1) auf der Kundenseite und Krähenfuss (N) auf der Bestellungsseite.
* Linie zwischen Bestellung und Produkt mit Krähenfuss auf beiden Seiten.
===== Beispiel: Vom Schema zur Tabelle =====
Ausgangspunkt ist ein kleines **Crow’s Foot Schema**:
{{:modul:m290_guko:learningunits:lu04:theorie:film_regisseur_crowsfoot.drawio_1_.png?direct&600|}}
* **Regisseur** (RegisseurID **PK**, Name)
* **Film** (FilmID **PK**, Titel, Jahr, RegisseurID **FK**)
* Beziehung: **1 Regisseur ↔ n Filme**
==== Umsetzung in SQL ====
**1. Datenbank anlegen**
CREATE DATABASE filmdatenbank;
USE filmdatenbank;
**2. Tabelle "regisseur" anlegen**
CREATE TABLE regisseur (
regisseur_id INT AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
birthday DATE,
PRIMARY KEY (regisseur_id)
);
**3. Tabelle "film" anlegen**
CREATE TABLE film (
film_id INT AUTO_INCREMENT,
titel VARCHAR(50) NOT NULL,
jahr YEAR,
regisseur_id INT,
PRIMARY KEY (film_id),
FOREIGN KEY (regisseur_id) REFERENCES regisseur(regisseur_id)
);
**4. Daten einfügen**
Fügen Sie mit Webstorm manuell (Tabelle anklicken und dann -> "Edit Data" (Tabellen-Icon)) ein paar Daten in die beiden Tabellen. Sie können zur Inspiration Daten aus der Tabelle //imbd_top_1000// verwenden, welche wir zu einem früheren Zeitpunkt bereits importiert haben.
**5. Daten abfragen**
Mit einem Select können wir beide Tabellen gleichzeitig abfragen:
SELECT f.titel, f.jahr, r.name AS regisseur
FROM film f, regisseur r
WHERE f.regisseur_id = r.regisseur_id;
Was zu einem ähnlichen Ergebnis, wie hier führen könnte:
^ Titel ^ Jahr ^ Regisseur ^
| Inception | 2010 | Christopher Nolan |
| Lost in Translation | 2003 | Sofia Coppola |
----
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]]