Primärschlüssel und Fremdschlüssel: Tabellen sicher verknüpfen
Kurz: Ein Primärschlüssel identifiziert jede Zeile einer Tabelle eindeutig, ein Fremdschlüssel verweist auf den Primärschlüssel einer anderen Tabelle und verhindert so verwaiste Verweise.
Genauer: Relationale Datenbanken speichern Daten in getrennten Tabellen (Kunden, Bestellungen). Damit klar ist, welche Bestellung zu welchem Kunden gehört, braucht jede Zeile eine eindeutige Kennung (Primärschlüssel) und die verknüpfende Tabelle einen Verweis darauf (Fremdschlüssel).
Im Detail
Primärschlüssel (PRIMARY KEY)
Er ist eindeutig und nie leer (NOT NULL). Typisch sind eine fortlaufende Zahl (SERIAL/IDENTITY) oder eine UUID. Vorteile von künstlichen Schlüsseln: sie ändern sich nie. Natürliche Schlüssel (E-Mail, Steuernummer) können sich ändern oder doppelt auftreten und sind deshalb riskant. Ein Primärschlüssel kann aus mehreren Spalten bestehen (zusammengesetzter Schlüssel), etwa bei Zuordnungstabellen. Die Datenbank legt dafür automatisch einen Index an.
Fremdschlüssel (FOREIGN KEY)
Beispiel: bestellung.kunde_id REFERENCES kunde(id). Die Datenbank lehnt Einträge ab, deren kunde_id nicht existiert (referenzielle Integrität). Beim Löschen oder Ändern des Elternsatzes legt man das Verhalten fest: RESTRICT/NO ACTION (verbieten), CASCADE (mitlöschen), SET NULL (Verweis leeren). CASCADE ist bequem, kann aber unbeabsichtigt viele Zeilen löschen.
Praxis und Stolperfallen
- Fremdschlüsselspalten selbst indizieren (PostgreSQL tut es nicht automatisch); sonst werden Joins und Löschungen langsam.
- Beziehungstypen: 1:n (Fremdschlüssel in der n-Tabelle), n:m (eigene Zuordnungstabelle mit zwei Fremdschlüsseln).
- UUID oder Zahl? Zahlen sind kompakt und schnell, UUIDs lassen sich ohne Absprache verteilt erzeugen und verraten nichts über die Anzahl der Datensätze.
- Bei Massenimporten Fremdschlüssel nicht abschalten, sondern Daten in der richtigen Reihenfolge laden.
- Auch ohne Fremdschlüssel funktionieren Abfragen, aber Datenmüll schleicht sich ein.
Einordnung (Prüfung)
Schlüssel gehören zum relationalen Modell und zur Normalisierung. Merke: Primärschlüssel = eindeutig + nicht NULL; Fremdschlüssel = Verweis, sichert Integrität. Im ER-Modell werden Beziehungen mit Fremdschlüsseln umgesetzt.
Siehe auch: Joins, ER-Modell, Normalformen