Stell dir vor, du hast zwei Tabellen: eine mit Infos über Studierende und eine andere mit Infos über Kurse. Wie würdest du ausdrücken, welche Studierenden in welchen Kursen eingeschrieben sind? Du könntest eine Spalte in der Studierenden-Tabelle anlegen, in der alle Kurse gespeichert werden, aber das wird schnell chaotisch. Eine der besten Lösungen ist es, Fremdschlüssel zu benutzen!
Fremdschlüssel (FOREIGN KEY) ist eine Spalte oder eine Gruppe von Spalten, die verwendet wird, um eine Beziehung zwischen Tabellen herzustellen. Er verweist auf eine Spalte (meistens PRIMARY KEY) in einer anderen Tabelle und sorgt so für referenzielle Integrität zwischen den Daten. Wenn also ein Studierender in einem Kurs eingeschrieben ist, können wir sicher sein, dass dieser Kurs auch wirklich existiert.
Fremdschlüssel:
- Helfen, die Datenkonsistenz zu wahren, indem sie sicherstellen, dass Einträge in einer Tabelle zu Daten in einer anderen passen.
- Machen die Datenbank verständlich und logisch organisiert.
- Vereinfachen die Datenverarbeitung, verhindern Duplikate und Fehler.
Beispiel aus dem echten Leben
Stell dir eine Bibliothek vor. Die Tabelle books enthält eine Liste von Büchern, und die Tabelle members eine Liste von Leser*innen. Um nachzuvollziehen, wer welches Buch ausgeliehen hat, können wir eine Tabelle borrowed_books erstellen, die auf books und members per Fremdschlüssel verweist. So wissen wir immer genau, wer welches Buch ausgeliehen hat.
Beziehungstypen zwischen Tabellen
Fremdschlüssel ermöglichen es, verschiedene Beziehungen zwischen Tabellen zu beschreiben. Lass uns die drei wichtigsten Typen anschauen:
1. Eins-zu-Eins-Beziehung (ONE-TO-ONE)
Das ist die einfachste Beziehung: Ein Eintrag in einer Tabelle entspricht genau einem Eintrag in einer anderen Tabelle. Zum Beispiel kann die Tabelle users Infos über User enthalten, und die Tabelle profiles zusätzliche Infos wie Adressen oder Fotos.
SQL-Beispiel für eine ONE-TO-ONE-Beziehung:
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username TEXT NOT NULL
);
CREATE TABLE profiles (
profile_id SERIAL PRIMARY KEY,
user_id INT UNIQUE REFERENCES users(user_id), -- verweist auf users.user_id
address TEXT
);
Hier ist die Spalte user_id in der Tabelle profiles ein Fremdschlüssel, der auf user_id in der Tabelle users verweist.
Beispiel für die Tabelle users:
| user_id - PRIMARY KEY | username |
|---|---|
| 1 | alice |
| 2 | bob |
| 3 | charlie |
Beispiel für die Tabelle profiles:
| profile_id - PRIMARY KEY | user_id - FOREIGN KEY | address |
|---|---|---|
| 1 | 1 | Berlin, Germany |
| 2 | 2 | Paris, France |
| 3 | 3 | Tokyo, Japan |
2. Eins-zu-Viele-Beziehung (ONE-TO-MANY)
Das ist die beliebteste Beziehung. Zum Beispiel kann ein Kunde viele Bestellungen machen. In diesem Fall wird die Tabelle customers mit der Tabelle orders über einen Fremdschlüssel verbunden.
SQL-Beispiel für eine ONE-TO-MANY-Beziehung:
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(customer_id), -- verweist auf customers.customer_id
order_date DATE NOT NULL
);
Die Tabelle orders kann viele Einträge enthalten, die auf einen Eintrag in der Tabelle customers verweisen.
Beispiel für die Tabelle customers:
| customer_id - PRIMARY KEY | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Beispiel für die Tabelle orders:
| order_id - PRIMARY KEY | customer_id - FOREIGN KEY | order_date |
|---|---|---|
| 1 | 1 | 2024-12-01 |
| 2 | 1 | 2024-12-05 |
| 3 | 2 | 2024-12-03 |
| 4 | 3 | 2024-12-07 |
3. Viele-zu-Viele-Beziehung (MANY-TO-MANY)
Manchmal kann ein Eintrag in einer Tabelle mit mehreren Einträgen in einer anderen Tabelle verbunden sein – und umgekehrt. Zum Beispiel melden sich Studierende für Kurse an, und in einem Kurs können viele Studierende sein. Dafür wird meistens eine Zwischentabelle erstellt.
SQL-Beispiel für eine MANY-TO-MANY-Beziehung:
-- studierende
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
-- kurse
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
title TEXT NOT NULL
);
-- "einschreibung eines bestimmten studenten in einen bestimmten kurs"
CREATE TABLE enrollments (
student_id INT REFERENCES students(student_id), -- verweist auf id des studenten
course_id INT REFERENCES courses(course_id), -- verweist auf id des kurses
PRIMARY KEY (student_id, course_id)
);
Hier spielt die Tabelle enrollments die Rolle einer "Brücke" zwischen students und courses.
Beispiel für die Tabelle students:
| student_id - PRIMARY KEY | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Beispiel für die Tabelle courses:
| course_id - PRIMARY KEY | title |
|---|---|
| 1 | SQL Basics |
| 2 | Data Structures |
| 3 | Algorithms |
Beispiel für die Tabelle enrollments:
| student_id - FOREIGN KEY | course_id - FOREIGN KEY |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
Vorteile von Fremdschlüsseln
- Daten bleiben konsistent. Wenn ein Fremdschlüssel auf einen nicht existierenden Eintrag zeigt, lässt PostgreSQL kein Insert oder Update zu.
- Tabellenarbeit wird einfacher. Fremdschlüssel machen es easy, Daten zwischen Tabellen zu verknüpfen und komplexe Abfragen wie
JOINzu machen. - Automatisches Verhalten. Du kannst Aktionen beim Löschen oder Aktualisieren von verbundenen Einträgen einstellen (z.B. Cascade Delete, Set
NULLusw.).
Wie sieht ein Fremdschlüssel in PostgreSQL aus?
Syntax zum Erstellen eines Fremdschlüssels beim Anlegen einer Tabelle:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(customer_id) -- fremdschlüssel-verweis
);
Hier:
customer_id— das ist der Fremdschlüssel.- Er verweist auf
customer_idin der Tabellecustomers.
Du kannst den Fremdschlüssel auch explizit mit FOREIGN KEY angeben:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Fun Fact
Der Begriff "Fremdschlüssel" (FOREIGN KEY) stammt aus der Theorie der relationalen Datenbanken, die in den 1970ern von Edgar Codd entwickelt wurde. Krass, oder? Die Grundidee ist so stark, dass sie immer noch ein zentrales Element moderner Datenbanken ist. Wer sagt, dass Klassiker nicht aktuell sind?
Jetzt weißt du, was ein Fremdschlüssel ist und warum er so wichtig ist. Du wirst noch lernen, wie man sie beim Erstellen von Tabellen anlegt und wie man Cascading Actions richtig nutzt. Aber das kommt in den nächsten Vorlesungen!
GO TO FULL VERSION