Datenbanken ohne Rätselraten

Tabellen, Zeilen und Schlüssel

11 min
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 email mit einem UNIQUE-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:

Eine holografische Tabelle aus Kapsel-Zeilen und Spalten; von den Bestelldatensätzen zu den Personendatensätzen spannen sich bernsteinfarbene Schlüssel-Fäden
Zeilen sind Datensätze, Spalten beschreiben ihre Eigenschaften, und der Faden von einer Bestellung zum Käufer ist eine Verbindung über den Schlüssel.

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:

Die ersten Käufer von «Kotomarket» in der Tabelle:
Query result
idfull_namecitysignup_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.

usersidfull_namecityordersiduser_idstatususer_id → id
Der Fremdschlüssel 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.

Check yourself
Wozu braucht man in einer Datenbank einen Fremdschlüssel (foreign key)?