Tabellen, Zeilen und Schlüssel
What you'll learn
- Tabellen, Zeilen und Spalten unterscheiden und erklären, warum jede Zeile einen Primärschlüssel braucht (meist
id) - Verbindungen zwischen Tabellen über Fremdschlüssel erkennen:
orders.user_id → users.id - einen Surrogatschlüssel (
IDENTITY, ) von einem natürlichen Schlüssel (E-Mail, ISBN) unterscheiden und begründen, warum ein Primärschlüssel unveränderlich sein muss - die Eindeutigkeit eines Feldes wie
emailmit einemUNIQUE-Constraint festschreiben, ohne es zum Primärschlüssel zu machen
Das Verzeichnis ist geöffnet. QUERY entfaltet über dem Schreibtisch ein Hologramm: Tausende Datensätze hängen in einem gleichmäßigen Raster in der Luft, zwischen einigen spannen sich dünne bernsteinfarbene Fäden. Du greifst nach einem, und er klingt wie eine Saite. Das ist kein Haufen Dateien. Das ist ein Gewebe.
Tabellen, Zeilen, Spalten
Eine relationale Datenbank ähnelt einem ordentlich geführten Katalog: Die Daten liegen in Tabellen, und innerhalb jeder Tabelle gibt es Spalten (welche Eigenschaften gespeichert werden) und Zeilen (die einzelnen Datensätze).
Nimm die Käufertabelle users: Jede Zeile ist ein Käufer der alten Erde, und die Spalten beschreiben id, full_name, email, country, city, signup_date.
Damit Menschen mit gleichem Namen nicht verwechselt werden, hat jede Zeile einen Primärschlüssel () — einen eindeutigen Bezeichner, meistens die Spalte id. Über ihn können andere Tabellen mit einem Fremdschlüssel () auf diese Zeile verweisen. In einer Bestellung orders gibt es zum Beispiel user_id — so merkt sich die Bestellung ihren Käufer. Genau diese bernsteinfarbenen Fäden im Hologramm sind die Verbindungen über Schlüssel.
QUERY: Solange der Schlüssel hält, hält der Faden. Anderthalb Jahrhunderte sind vergangen, und jede Bestellung erinnert sich noch an ihren Menschen.
Führe die Abfrage aus und sieh dir an, wie die Käufer von «Kotomarket» aussehen — Datensätze, die seit den Tagen des alten Netzes niemand mehr geöffnet hat:

Tables, rows, columns
A relational database is like a tidy catalog: the data is sorted into tables, and inside each table there are columns (what properties we store) and rows (the individual records).
Take the buyers’ table users: each row is one buyer from old Earth, and the columns describe their id, full_name, email, country, city, signup_date.
So that people with the same name don’t get confused, every row has a — a unique identifier, usually the id column. Through it, other tables can reference this row using a . For example, an order in orders has a user_id — that’s how an order remembers its buyer. Those amber threads on the hologram are exactly these key-based links.
QUERY: As long as the key holds, the thread holds. A century and a half on, every order still remembers its person.
Run the query and see what Kotomarket’s buyers look like — records no one has opened since the days of the old Net:
| id | full_name | city | signup_date |
|---|---|---|---|
| 1 | Артём Волков | Санкт-Петербург | 2024-10-20 |
| 2 | Екатерина Алексеев | Екатеринбург | 2025-01-25 |
| 3 | Николай Никитин | Алматы | 2024-09-21 |
| 4 | Екатерина Иванов | Новосибирск | 2024-05-04 |
| 5 | Елена Петров | Казань | 2025-01-05 |
| 6 | Ирина Кузнецов | Новосибирск | 2024-09-12 |
Ein Primärschlüssel hilft, eine einzelne Zeile zuverlässig zu finden (meist id). Ein Fremdschlüssel verbindet Tabellen: orders.user_id → users.id zeigt zum Beispiel, zu welchem Käufer eine Bestellung gehört. Als Nächstes entfaltet QUERY vor dir die vollständige Karte des Schnappschusses — alle fünf Tabellen.
orders.user_id verweist auf den Primärschlüssel users.id — so merkt sich eine Bestellung ihren Käufer.Natürlicher Schlüssel oder Surrogatschlüssel
Woher kommt ein Primärschlüssel? Es gibt zwei Möglichkeiten. Ein natürlicher Schlüssel ist ein reales Attribut, das ohnehin eindeutig ist: die E-Mail eines Käufers, die ISBN eines Buches, ein Währungscode. Ein Surrogatschlüssel ist ein künstlicher Bezeichner ohne Bedeutung außerhalb der Datenbank: eine Autonummerierung oder eine . In «Kotomarket» werden überall Surrogat-id verwendet — eine klassische, saubere Lösung:
-- Klucz sztuczny: baza sama wydaje kolejny numer (PostgreSQL)
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE, -- naturalny kandydat żyje obok jako UNIQUE
full_name TEXT NOT NULL
);
Warum? Die wichtigste Eigenschaft eines Primärschlüssels ist: Er darf sich nicht ändern. Auf den PK verweisen die Fremdschlüssel anderer Tabellen. Ändert sich sein Wert, müssten alle Fäden gleichzeitig aktualisiert werden — in orders, in events, überall. Und wirklich „ewige“ natürliche Attribute gibt es kaum: Menschen ändern E-Mail-Adressen und Nachnamen, Telefonnummern werden neu vergeben, sogar ISBNs erscheinen in neuen Ausgaben. Eine Surrogat-id ändert sich nie — gerade weil sie nichts bedeutet.
Jeder Primärschlüssel muss eindeutig, nicht NULL und stabil sein. Natürliche Schlüssel eignen sich eher für kleine, unveränderliche Nachschlagetabellen — etwa den Währungscode 'RUB' aus ISO 4217. Die Eindeutigkeit eines natürlichen Kandidaten wie email schreibst du mit einem separaten UNIQUE-Constraint fest, wie im Beispiel oben: Die Verbindungen bleiben erhalten, die Daten bleiben korrekt, und ein Käufer darf trotzdem seine E-Mail ändern.
Ein kleiner Vorgriff: Die Syntax zum Anlegen von Tabellen und Constraints (CREATE TABLE, PRIMARY KEY, UNIQUE) behandeln wir in Kapitel 9. Achte hier nur auf die Struktur des Schlüssels: Eine Surrogat-id wurde zum Primärschlüssel, während email daneben als UNIQUE abgesichert ist.
Interview question
Frage aus dem Vorstellungsgespräch: Worin unterscheidet sich ein Surrogatschlüssel von einem natürlichen Schlüssel, und welchen würdest du für eine Nutzertabelle wählen?
Starke Antwort: Ein natürlicher Schlüssel ist ein reales, eindeutiges Attribut (E-Mail, ISBN), ein Surrogatschlüssel ein künstlicher Bezeichner (eine IDENTITY-Spalte oder eine ). Für Nutzer würde ich einen Surrogatschlüssel wählen: Ein Primärschlüssel darf sich nicht ändern, weil Fremdschlüssel auf ihn verweisen, und E-Mail-Adressen ändern sich. Die Eindeutigkeit der E-Mail wird stattdessen mit einem separaten UNIQUE-Constraint festgeschrieben. Natürliche Schlüssel sind in stabilen Nachschlagetabellen sinnvoll, etwa bei ISO-4217-Währungscodes.