CodeGym /Kurse /SQL SELF /Modellierung der Beziehung ONE-TO-MANY zwis...

Modellierung der Beziehung ONE-TO-MANY zwischen Tabellen

SQL SELF
Level 19 , Lektion 3
Verfügbar

Jetzt ist es Zeit, unsere Skills zu erweitern und eine der am häufigsten vorkommenden Beziehungen in relationalen Datenbanken zu bauen – die ONE-TO-MANY-Beziehung.

Stell dir eine kleine Firma vor. Ein Mitarbeiter kann nur in einer Abteilung arbeiten, aber in einer Abteilung können Dutzende solcher Mitarbeiter sein. Wir haben zwei reale Objekte: Mitarbeiter und Abteilungen. Die Beziehung zwischen ihnen kann man so beschreiben: "Eine Abteilung kann viele Mitarbeiter haben", oder formalisiert "eins zu viele" (ONE-TO-MANY).

Genauso findest du ONE-TO-MANY-Beziehungen überall:

  • ein Kunde kann viele Bestellungen machen;
  • ein Autor kann viele Bücher schreiben;
  • ein Lehrer kann mehreren Schülern unterrichten.

In einer relationalen Datenbank wird die ONE-TO-MANY-Beziehung durch einen Foreign Key (FOREIGN KEY) umgesetzt. Eine der Spalten der "viele"-Tabelle (MANY) verweist auf den Primary Key der "eins"-Tabelle (ONE).

Wie erstellt man eine ONE-TO-MANY-Beziehung

Schauen wir uns das klassische Beispiel an: die Beziehung zwischen Kunden und Bestellungen. Ein Kunde kann viele Bestellungen machen, aber jede Bestellung gehört nur zu einem Kunden. Wir erstellen zwei Tabellen: customers (Kunden) und orders (Bestellungen).

Tabelle customers

Das ist unsere "eins"-Tabelle. Sie speichert Infos über die Kunden.

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY, -- Einzigartige Kunden-ID
    name TEXT NOT NULL              -- Name des Kunden
);

Tabelle orders

Das ist die "viele"-Tabelle. Sie speichert Bestellungen, wobei jede Bestellung einen Foreign Key customer_id hat, der auf customer_id aus der customers-Tabelle zeigt.

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,           -- Einzigartige Bestellungs-ID
    order_date DATE NOT NULL,              -- Bestelldatum
    customer_id INT REFERENCES customers(customer_id) -- Foreign Key
);

Praktische Anwendung

Daten einfügen

Jetzt fügen wir ein paar Daten in unsere Tabellen ein, um die Beziehung zu testen.

Fügen wir Kunden in die customers-Tabelle ein:

INSERT INTO customers (name)
VALUES
    ('Ada Lovelace'),
    ('Grace Hopper'),
    ('Linus Torvalds');

Ergebnis:

customer_id name
1 Ada Lovelace
2 Grace Hopper
3 Linus Torvalds

Fügen wir Bestellungen in die orders-Tabelle ein:

INSERT INTO orders (order_date, customer_id)
VALUES
    ('2023-10-01', 1),  -- Bestellung von Ada
    ('2023-10-02', 2),  -- Bestellung von Grace
    ('2023-10-03', 1);  -- Noch eine Bestellung von Ada

Tabelle orders:

order_id order_date customer_id
1 2023-10-01 1
2 2023-10-02 2
3 2023-10-03 1

Wichtig: Beim Hinzufügen einer Bestellung musst du immer eine existierende customer_id angeben. Wenn du eine nicht existierende ID angibst, schmeißt die Datenbank einen Fehler. Das schützt die Datenintegrität.

Beziehung prüfen

Jetzt schauen wir uns an, wie unsere Tabellen verbunden sind. Zum Beispiel: Welche Bestellungen hat Ada Lovelace gemacht?

SELECT orders.order_id, orders.order_date, customers.name
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.name = 'Ada Lovelace';

Ergebnis:

order_id order_date name
1 2023-10-01 Ada Lovelace
3 2023-10-03 Ada Lovelace

Hier haben wir das JOIN-Kommando benutzt, um die beiden Tabellen über den Foreign Key zu verbinden. Praktisch, übersichtlich – und keine doppelten Daten!

Warum das Ganze?

Die ONE-TO-MANY-Beziehung ist mega verbreitet und super nützlich im echten Leben. Stell dir einen Online-Shop vor, mit tausenden Kunden und Millionen von Bestellungen. Anstatt die Kundendaten in jedem Bestellungs-Eintrag zu duplizieren, speichern wir die Infos zu den einzelnen Kunden in einer Tabelle und die Bestellungen in einer anderen. Das spart Speicherplatz und macht die Datenbank viel aufgeräumter.

Außerdem kannst du durch das Verknüpfen von Daten richtig coole Abfragen für Analysen machen. Zum Beispiel: "Wie viele Bestellungen hat jeder Kunde gemacht?" oder "Welche Kunden haben im letzten Monat bestellt?".

Schwierigkeiten und Stolperfallen

Hier stolpern Anfänger oft drüber:

Kein Foreign Key. Wenn du vergisst, den Foreign Key in der "viele"-Tabelle anzugeben, bleibt die Beziehung nur in deinem Kopf, aber die Datenbank kann sie nicht wirklich durchsetzen. Das heißt, du riskierst eine "kaputte" Datenbank, in der Bestellungen auf nicht existierende Kunden zeigen.

Versuch, einen Eintrag aus der "eins"-Tabelle zu löschen. Wenn du zum Beispiel einen Kunden aus customers löschst, bleiben seine Bestellungen in orders "verwaist". Um das zu vermeiden, kannst du ON DELETE CASCADE nutzen, damit beim Löschen eines Kunden auch automatisch seine Bestellungen gelöscht werden.

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT REFERENCES customers(customer_id) ON DELETE CASCADE
);

Jetzt, wenn du einen Kunden löschst:

DELETE FROM customers WHERE customer_id = 1;

werden auch alle seine Bestellungen gelöscht. Die Datenbank bleibt sauber wie eine frische Tasse Kaffee.

Fehler beim Einfügen von Daten. Wenn du versuchst, eine Bestellung mit einer nicht existierenden customer_id einzufügen, bekommst du einen Fehler wie:

ERROR:  insert or update on table "orders" violates foreign key constraint
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION