In diesem Kapitel lernst du Schritt für Schritt, wie du eine Datenbank so entwirfst, dass sie nicht nur funktioniert, sondern auch langfristig übersichtlich, konsistent und effizient bleibt. Dazu gehört zunächst das Verständnis von
Primärschlüsseln, also eindeutigen Kennzeichen für jeden Datensatz, mit denen du deine Daten sicher identifizieren kannst. Außerdem beschäftigen wir uns mit Fremdschlüsseln, die dafür sorgen, dass Tabellen miteinander verknüpft werden können und die Datenintegrität gewahrt bleibt.
Ein weiterer wichtiger Baustein ist die Normalisierung. Sie hilft dir, Redundanzen zu vermeiden, also doppelte oder unnötige Daten, und sorgt dafür, dass deine Datenbank logisch und klar strukturiert ist.
Schließlich schauen wir uns die verschiedenen Beziehungen zwischen Tabellen an – etwa „eins zu eins“, „eins zu viele“ oder „viele zu viele“ – und wie du diese in deinem Datenbankmodell korrekt abbildest.
Wenn du diese Grundlagen verinnerlichst, legst du das Fundament für ein sauberes Datenbankdesign, das sowohl für kleine Projekte als auch für komplexe Anwendungen tragfähig ist.
8.1 Primärschlüssel
Ein Primärschlüssel ist eine der wichtigsten Grundlagen für ein sauberes Datenbankdesign. Er stellt sicher, dass jeder Datensatz in einer Tabelle eindeutig identifiziert werden kann. Ohne Primärschlüssel könnten Datensätze leicht doppelt vorkommen oder schwer auffindbar sein, was Abfragen und die Datenpflege deutlich erschwert.
Ein Primärschlüssel kann aus einer einzigen Spalte bestehen, wie einer ID, oder aus mehreren Spalten kombiniert werden, wenn nur die Kombination der Werte jeden Datensatz eindeutig macht. Diese Kombination nennt man einen zusammengesetzten Schlüssel.
Beispiel
CREATE TABLE benutzer (
id INT PRIMARY KEY,
name VARCHAR(50),
alter INT
);In diesem Beispiel sorgt die Spalte id dafür, dass jeder Benutzer eindeutig identifiziert wird. Selbst wenn zwei Benutzer denselben Namen oder dasselbe Alter haben, bleibt die ID einzigartig.
Praxis-Tipps
- Verwende stabile Werte für Primärschlüssel, die sich nicht ändern, z. B. keine Namen oder E-Mail-Adressen.
- Automatisch inkrementierende Zahlen (
AUTO_INCREMENTin MySQL oderSERIALin PostgreSQL) eignen sich gut, da sie die Verwaltung erleichtern. - Primärschlüssel sind besonders wichtig für Beziehungen zwischen Tabellen, da Fremdschlüssel immer auf Primärschlüssel verweisen.
8.2 Fremdschlüssel
Fremdschlüssel sind das Bindeglied zwischen Tabellen in einer relationalen Datenbank. Sie sorgen dafür, dass Daten konsistent bleiben und ermöglichen es, Beziehungen zwischen Datensätzen herzustellen. Ein Fremdschlüssel verweist immer auf den Primärschlüssel einer anderen Tabelle. Auf diese Weise wird sichergestellt, dass nur gültige Werte eingetragen werden und die Datenintegrität gewahrt bleibt.
Durch Fremdschlüssel lassen sich auch komplexe Abfragen durchführen, zum Beispiel um Daten aus mehreren Tabellen zu verknüpfen. Sie bilden die Grundlage für JOIN-Operationen und sind entscheidend, wenn man Daten strukturiert analysieren möchte.
Beispiel
CREATE TABLE bestellungen (
id INT PRIMARY KEY,
benutzer_id INT,
betrag DECIMAL(10,2),
FOREIGN KEY (benutzer_id) REFERENCES benutzer(id)
);In diesem Beispiel zeigt die Spalte benutzer_id auf die id-Spalte der Tabelle benutzer. Dadurch wird sichergestellt, dass nur existierende Benutzer Bestellungen haben können. Ungültige Benutzer-IDs können nicht eingetragen werden.
Praxis-Tipps
- Fremdschlüssel sichern die Datenintegrität. Du kannst definieren, wie sich die Datenbank bei Löschungen oder Änderungen verhält, z. B.
ON DELETE CASCADEfür automatische Löschungen oderON DELETE RESTRICTzur Verhinderung der Löschung. - Fremdschlüssel erleichtern die Nutzung von JOINs und relationalen Abfragen, da die Tabellen sauber verknüpft sind.
- Überprüfe, dass der Fremdschlüssel auf eine Spalte verweist, die als Primärschlüssel oder mit einem eindeutigen Index definiert ist.
- Fremdschlüssel tragen dazu bei, Datenredundanz zu vermeiden, weil gemeinsame Informationen nicht mehrfach gespeichert werden müssen.
8.3 Normalisierung
Normalisierung ist ein zentraler Prozess im Datenbankdesign, der dafür sorgt, dass Daten logisch, konsistent und redundanzfrei gespeichert werden. Dabei werden die Daten schrittweise auf verschiedene Tabellen verteilt, sodass jede Information nur einmal gespeichert wird. Die Normalisierung erfolgt in mehreren Stufen, den Normalformen. Hier zeigen wir, wie sich eine Tabelle Schritt für Schritt verändert.
Ausgangstabelle (nicht normalisiert)
Stellen wir uns ein einfaches Bestellungssystem vor:
| benutzer_name | stadt | bestellung_id | produkt | betrag | |
|---|---|---|---|---|---|
| Anna | anna@mail.com | Berlin | 1 | Laptop | 1200 |
| Anna | anna@mail.com | Berlin | 2 | Maus | 25 |
| Ben | ben@mail.com | Hamburg | 3 | Monitor | 300 |
Problem: Benutzerinformationen, inklusive Stadt, werden mehrfach gespeichert. Änderungen müssen an mehreren Stellen erfolgen.
1. Normalform (1NF)
Die 1NF sorgt dafür, dass jede Spalte atomar ist und die Tabelle einen Primärschlüssel besitzt:
| id | benutzer_name | stadt | bestellung_id | produkt | betrag | |
|---|---|---|---|---|---|---|
| 1 | Anna | anna@mail.com | Berlin | 1 | Laptop | 1200 |
| 2 | Anna | anna@mail.com | Berlin | 2 | Maus | 25 |
| 3 | Ben | ben@mail.com | Hamburg | 3 | Monitor | 300 |
Die Tabelle hat nun einen eindeutigen Primärschlüssel für jede Zeile. Redundanzen bestehen allerdings weiterhin.
2. Normalform (2NF)
In der 2NF werden die Daten nach vollständiger Abhängigkeit vom Primärschlüssel getrennt. Wir erstellen separate Tabellen für Benutzer und Bestellungen:
Benutzer-Tabelle
| benutzer_id | name | stadt | |
|---|---|---|---|
| 1 | Anna | anna@mail.com | Berlin |
| 2 | Ben | ben@mail.com | Hamburg |
Bestellungen-Tabelle
| bestellung_id | benutzer_id | produkt | betrag |
|---|---|---|---|
| 1 | 1 | Laptop | 1200 |
| 2 | 1 | Maus | 25 |
| 3 | 2 | Monitor | 300 |
Jetzt werden Benutzerinformationen nur einmal gespeichert. Bestellungen verweisen über benutzer_id auf die Benutzer-Tabelle.
3. Normalform (3NF)
Die 3NF eliminiert transitive Abhängigkeiten, z. B. wenn die Stadt separat verwaltet werden soll. Wir lagern die Stadt in eine eigene Tabelle aus:
Benutzer-Tabelle
| benutzer_id | name | |
|---|---|---|
| 1 | Anna | anna@mail.com |
| 2 | Ben | ben@mail.com |
Stadt-Tabelle
| stadt_id | stadt |
|---|---|
| 1 | Berlin |
| 2 | Hamburg |
Benutzer-Stadt-Verknüpfung
| benutzer_id | stadt_id |
|---|---|
| 1 | 1 |
| 2 | 2 |
Ergebnis: Alle Daten sind logisch getrennt, jede Information wird nur einmal gespeichert, und es gibt keine transitiven Abhängigkeiten mehr.
Praxis-Tipps
- Normalisierung reduziert Redundanzen und sichert konsistente Daten.
- Zu starke Normalisierung kann die Performance bei JOIN-Abfragen belasten; in solchen Fällen ist gezielte Denormalisierung sinnvoll.
- Plane Normalisierung bereits beim Entwurf, um spätere Umstrukturierungen zu vermeiden.
8.4 Datenbankbeziehungen
Datenbankbeziehungen definieren, wie Tabellen miteinander verbunden sind. Ein korrektes Modellieren der Beziehungen ist entscheidend für Datenintegrität, Konsistenz und effiziente Abfragen. Die drei wichtigsten Beziehungstypen sind 1:1, 1:n und n:m.
1:1 (Eins-zu-Eins)
Bei einer 1:1-Beziehung ist jeder Datensatz in Tabelle A genau einem Datensatz in Tabelle B zugeordnet und umgekehrt. Diese Beziehungen eignen sich, wenn zusätzliche Informationen ausgelagert werden sollen, die nicht für alle Datensätze relevant sind.
Beispiel: Benutzer und Profilbilder
Ein Benutzer hat genau ein Profilbild:
Benutzer-Tabelle
| benutzer_id | name | |
|---|---|---|
| 1 | Anna | anna@mail.com |
| 2 | Ben | ben@mail.com |
Profilbilder-Tabelle
| profilbild_id | benutzer_id | bild_url |
|---|---|---|
| 1 | 1 | anna.jpg |
| 2 | 2 | ben.jpg |
CREATE TABLE profilbilder (
profilbild_id INT PRIMARY KEY,
benutzer_id INT UNIQUE,
bild_url VARCHAR(255),
FOREIGN KEY (benutzer_id) REFERENCES benutzer(benutzer_id)
);
1:n (Eins-zu-Viele)
Bei einer 1:n-Beziehung kann ein Datensatz in Tabelle A mit mehreren Datensätzen in Tabelle B verbunden sein. Dies ist der häufigste Beziehungstyp.
Beispiel: Benutzer und Bestellungen
Ein Benutzer kann mehrere Bestellungen haben:
Bestellungen-Tabelle
| bestellung_id | benutzer_id | produkt | betrag |
|---|---|---|---|
| 1 | 1 | Laptop | 1200 |
| 2 | 1 | Maus | 25 |
| 3 | 2 | Monitor | 300 |
CREATE TABLE bestellungen (
bestellung_id INT PRIMARY KEY,
benutzer_id INT,
produkt VARCHAR(50),
betrag DECIMAL(10,2),
FOREIGN KEY (benutzer_id) REFERENCES benutzer(benutzer_id)
);
n:m (Viele-zu-Viele)
Bei einer n:m-Beziehung können mehrere Datensätze in Tabelle A mit mehreren Datensätzen in Tabelle B verbunden sein. Solche Beziehungen werden über eine Zwischentabelle abgebildet.
Beispiel: Benutzer und Kurse
Ein Benutzer kann mehrere Kurse belegen, und ein Kurs kann von mehreren Benutzern besucht werden.
Benutzer-Tabelle
| benutzer_id | name |
|---|---|
| 1 | Anna |
| 2 | Ben |
Kurse-Tabelle
| kurs_id | kurs_name |
|---|---|
| 1 | SQL Grundlagen |
| 2 | Fortgeschrittene SQL |
Zwischentabelle Benutzer_Kurse
| benutzer_id | kurs_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
CREATE TABLE benutzer_kurse (
benutzer_id INT,
kurs_id INT,
PRIMARY KEY (benutzer_id, kurs_id),
FOREIGN KEY (benutzer_id) REFERENCES benutzer(benutzer_id),
FOREIGN KEY (kurs_id) REFERENCES kurse(kurs_id)
);
Praxis-Tipps
- 1:1-Beziehungen eignen sich für optionale oder selten genutzte Daten, die ausgelagert werden sollen.
- 1:n-Beziehungen sind der Standard für „Haupt-zu-Detail“-Strukturen wie Benutzer und Bestellungen.
- n:m-Beziehungen erfordern immer eine Zwischentabelle zur Vermeidung von Datenredundanz.
- Beziehungen korrekt zu modellieren verbessert die Datenintegrität und vereinfacht Abfragen und Wartung.
8.5 Zusammenfassung
In diesem Kapitel hast du gelernt, wie Primär- und Fremdschlüssel genutzt werden, um Datensätze eindeutig zu identifizieren und Tabellen sicher miteinander zu verknüpfen. Du weißt nun, wie Normalisierung Redundanzen reduziert und die Datenbank effizient und logisch strukturiert, sodass jede Information nur einmal gespeichert wird. Außerdem kennst du die wichtigsten Arten von Datenbankbeziehungen – 1:1, 1:n und n:m – und weißt, wie sie korrekt modelliert werden, um Abfragen und Datenintegrität zu erleichtern. Dieses Wissen bildet die Grundlage für ein sauberes, gut durchdachtes Datenbankdesign.
Im nächsten Kapitel werden wir uns mit fortgeschrittenen Themen wie Views, Stored Procedures, Triggern und Transaktionen beschäftigen.
Quiz zu Datenbankdesign
Teste dein Wissen mit diesen Fragen:
Was ist ein Primärschlüssel?
a) Eine Spalte, die auf eine andere Tabelle verweist.
b) Eine Spalte, die jeden Datensatz eindeutig identifiziert.
c) Eine Spalte, die doppelte Werte enthalten darf.
Welche Normalform erfordert, dass es keine transitiven Abhängigkeiten gibt?
a) 1NF
b) 2NF
c) 3NF
Welche Beziehung besteht, wenn ein Benutzer mehrere Bestellungen haben kann?
a) 1:1
b) 1:n
c) n:m
Antworten:
1. b) Eine Spalte, die jeden Datensatz eindeutig identifiziert.
2. c) 3NF
3. b) 1:n
Was sind eigentlich Datenbanken und Tabellen?
Im Alltag sammeln sich überall Informationen an: Kundendaten im Onlineshop,...
Artikel lesenAggregatfunktionen: SUM, COUNT, AVG & Co. im Vergleich
Aggregatfunktionen sind spezielle SQL-Funktionen, die aus einer Menge von Werten...
Artikel lesenNULL-Werte in SQL: Was sie wirklich bedeuten und wie du damit umgehst
Auf einer Party fragst du jemanden nach seinem Geburtsdatum –...
Artikel lesenEXPLAIN: Wie du SQL-Abfragen analysierst und optimierst
Datenbanken sind das Herzstück vieler Anwendungen und Systeme. Je größer...
Artikel lesenWas ist ein Datenbankschema?
Bevor eine Stadt gebaut wird, gibt es immer einen Plan:...
Artikel lesenCTEs verstehen: Dein Einstieg in die SQL-WITH-Klausel
SQL-Abfragen können schnell unübersichtlich werden, besonders wenn du mehrere Verschachtelungen...
Artikel lesenIndexes verstehen: Warum manche Queries ewig dauern und andere nicht
Hattest du jemals eine SQL-Query, die mal in Millisekunden und...
Artikel lesenGROUP BY richtig verstehen: typische Fehler und wie du sie vermeidest
Die GROUP BY-Klausel gehört zu den mächtigsten Werkzeugen in SQL...
Artikel lesen