Ein Datenbankschema beschreibt die Struktur einer Datenbank: Tabellen, Spalten, Datentypen, Constraints, Indizes, Views und weitere Objekte. Es ist der Bauplan, der festlegt, wie Daten gespeichert und miteinander verknüpft werden – die Grundlage für jedes saubere Datenmodell.
Schema vs. Datenbank
Der Begriff „Schema“ wird je nach System unterschiedlich verwendet:
- MySQL/MariaDB: Schema ist synonym zu Datenbank –
CREATE SCHEMAundCREATE DATABASEsind identisch - PostgreSQL: Eine Datenbank enthält mehrere Schemata als Namensräume (z. B.
public), in denen Tabellen und andere Objekte organisiert werden - Allgemein: In der Dokumentation vieler Systeme bezeichnet „Schema“ die gesamte Struktur einer Anwendungsdatenbank
Bestandteile eines Schemas
- Tabellen mit Spalten und Datentypen
- Constraints: Primärschlüssel, Fremdschlüssel, UNIQUE, NOT NULL, CHECK (siehe Primär- und Fremdschlüssel)
- Indizes für schnelle Zugriffe (siehe Indizes)
- Views als virtuelle Tabellen (siehe View)
- Stored Procedures und Funktionen (siehe Stored Procedures)
- Trigger für automatische Reaktionen (siehe Trigger)
Schema-Design-Prinzipien
Gutes Schema-Design folgt der Normalisierung: Daten werden in sinnvolle Tabellen zerlegt, Redundanzen vermieden und Beziehungen über Fremdschlüssel modelliert. Gleichzeitig sollte das Schema an die tatsächlichen Abfragen angepasst sein – mit passenden Indizes und Datentypen, damit die Performance stimmt.
Schema-Migrationen
Ein Schema ist selten statisch. Änderungen wie ALTER TABLE werden in der Praxis über Migrationen versioniert: Werkzeuge wie Flyway, Liquibase oder die Migrationssysteme von Django und Rails speichern jede Änderung als versionsnummerierte Datei und spielen sie kontrolliert auf. So lassen sich Entwicklungs-, Test- und Produktionsumgebungen synchron halten – Details im Artikel Datenbank-Migration.
Beispiel: Ein einfaches Schema
CREATE TABLE kunden (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(120) NOT NULL,
email VARCHAR(255) UNIQUE,
angelegt DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE bestellungen (
id INT AUTO_INCREMENT PRIMARY KEY,
kunde_id INT NOT NULL,
summe DECIMAL(10,2) NOT NULL,
CONSTRAINT fk_bestellung_kunde
FOREIGN KEY (kunde_id) REFERENCES kunden(id)
);
Schema und ORM
Wer mit einem ORM arbeitet, kann das Schema aus den Klassen generieren lassen – das ORM erzeugt die Tabellen passend zum Datenmodell. In PostgreSQL übernehmen Schemata zusätzlich die Rolle von Namensräumen für saubere Strukturierung großer Datenbanken (siehe PostgreSQL).