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 SCHEMA und CREATE DATABASE sind 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).