Was gehört in die Persistenzschicht?
Schema & Tabellen
Struktur der Daten mit Spaltentypen. In Dokument-DBs implizit, aber trotzdem vorhanden.
Schlüssel
Primärschlüssel identifizieren Zeilen, Fremdschlüssel sichern Beziehungen ab.
Constraints
NOT NULL, UNIQUE, CHECK – Regeln, die auch bei Bugs im Code gelten.
Indizes
Machen die häufigsten Abfragen schnell, kosten aber Schreibleistung und Speicher.
Migrationen
Versionierte Skripte, die das Schema reproduzierbar weiterentwickeln.
Transaktionen
SQL vs. NoSQL
SQL (relational) heißt: Daten in Tabellen mit festem Schema, Beziehungen über Fremdschlüssel, Abfragen per SQL. NoSQLBegriff · NoSQLSammelbegriff für nicht-relationale Datenbanken – Dokument-, Key-Value-, Wide-Column- und Graph-Datenbanken, optimiert für bestimmte Zugriffsmuster statt für Joins. ist ein Sammelbegriff für alles Nicht-Relationale – Dokumente, Key-Value, Wide-Column, Graphen. Der Kernunterschied liegt im Modellieren: SQL fragt „Welche Daten gibt es?“, NoSQL fragt „Wie werden sie gelesen?“.
- Datenmodell
SQL (relational)Tabellen mit Zeilen und Spalten
NoSQLDokumente, Schlüssel-Werte, Spalten-Familien oder Graphen
- Schema
SQL (relational)fest, vorab definiert („schema on write“)
NoSQLflexibel, pro Datensatz verschieden („schema on read“)
- Modellieren nach
SQL (relational)Entitäten – normalisiert, ohne Redundanz
NoSQLZugriffsmustern – zusammen, was zusammen gelesen wird
- Beziehungen
SQL (relational)Fremdschlüssel und Joins
NoSQLeingebettet oder per Referenz, Joins selten
- Abfragen
SQL (relational)SQL – standardisiert, beliebig kombinierbar
NoSQLproduktspezifische APIs, auf bekannte Abfragen optimiert
- Konsistenz
SQL (relational)ACID – sofort konsistent
NoSQLoft BASE – „irgendwann“ konsistent, einstellbar
- Skalierung
SQL (relational)vertikal (größerer Server) + Read-Replicas
NoSQLhorizontal (mehr Knoten), Partitionierung eingebaut
- Vertreter
SQL (relational)PostgreSQL, Azure SQL, MySQL, Oracle
NoSQLMongoDB, Cosmos DB, Redis, Cassandra, Neo4j
| Kriterium | SQL (relational) | NoSQL |
|---|---|---|
| Datenmodell | Tabellen mit Zeilen und Spalten | Dokumente, Schlüssel-Werte, Spalten-Familien oder Graphen |
| Schema | fest, vorab definiert („schema on write“) | flexibel, pro Datensatz verschieden („schema on read“) |
| Modellieren nach | Entitäten – normalisiert, ohne Redundanz | Zugriffsmustern – zusammen, was zusammen gelesen wird |
| Beziehungen | Fremdschlüssel und Joins | eingebettet oder per Referenz, Joins selten |
| Abfragen | SQL – standardisiert, beliebig kombinierbar | produktspezifische APIs, auf bekannte Abfragen optimiert |
| Konsistenz | ACID – sofort konsistent | oft BASE – „irgendwann“ konsistent, einstellbar |
| Skalierung | vertikal (größerer Server) + Read-Replicas | horizontal (mehr Knoten), Partitionierung eingebaut |
| Vertreter | PostgreSQL, Azure SQL, MySQL, Oracle | MongoDB, Cosmos DB, Redis, Cassandra, Neo4j |
Warum NoSQL bei der Konsistenz nachgibt, erklärt das CAP-TheoremBegriff · CAP-TheoremEin verteiltes System kann bei einem Netzwerkausfall zwischen Knoten (Partition) nur Konsistenz oder Verfügbarkeit garantieren, nicht beides.: Fällt das Netz zwischen Knoten aus, muss ein verteiltes System zwischen Konsistenz und Verfügbarkeit wählen.
Dieselben Daten, drei Speicher
PostgreSQL
Normalisiert in Tabellen, zusammengesetzt per Join:
SELECT t.id, t.title, t.due_date, array_agg(g.name) AS tags
FROM task AS t
LEFT JOIN task_tag AS tt ON tt.task_id = t.id
LEFT JOIN tag AS g ON g.id = tt.tag_id
WHERE t.user_id = 42 AND NOT t.done
GROUP BY t.id
ORDER BY t.due_date;MongoDB
Ein Dokument enthält alles, was zusammen gelesen wird – die Tags eingebettet:
db.tasks.insertOne({
userId: 42,
title: "Steuererklärung",
due: ISODate("2026-11-30"),
done: false,
tags: ["privat", "finanzen"],
});
db.tasks.createIndex({ userId: 1, done: 1, due: 1 });
db.tasks.find({ userId: 42, done: false }).sort({ due: 1 });Redis
Kein Ersatz für die Datenbank, sondern Ergänzung – schnelle, oft ablaufende Werte:
# Session für eine Stunde
SET session:8f3a2c '{"userId":42}' EX 3600
# Rate Limit: Zähler pro User und Minute
INCR ratelimit:user:42:202610101945
EXPIRE ratelimit:user:42:202610101945 60
# Cache für die Task-Liste, wird beim Ändern gelöscht
SET cache:tasks:user:42 '[{"id":1,"title":"Steuererklärung"}]' EX 300Welcher Speicher wann?
- Relational
BeispielePostgreSQL, Azure SQL, MySQL
Stark beiTransaktionen, Joins, Konsistenz
Sinnvoll fürGeschäftsdaten mit Beziehungen – der Standard
- Dokument
BeispieleMongoDB, Azure Cosmos DB, Firestore
Stark beiverschachtelte JSON-Objekte, flexible Struktur
Sinnvoll fürKataloge, Profile, Inhalte, die als Ganzes gelesen werden
- Key-Value
BeispieleRedis, Azure Cache for Redis
Stark beiZugriff per Schlüssel in unter 1 ms
Sinnvoll fürCache, Sessions, Rate Limits, Locks
- Wide-Column
BeispieleApache Cassandra, ScyllaDB
Stark beiriesige Schreiblast, verteilt über viele Knoten
Sinnvoll fürIoT, Events, Logs mit bekannten Abfragen
- Graph
BeispieleNeo4j, Cosmos DB (Gremlin)
Stark beiBeziehungen über viele Ebenen
Sinnvoll fürEmpfehlungen, Netzwerke, Berechtigungen
- Zeitreihen
BeispieleTimescaleDB, InfluxDB, Azure Data Explorer
Stark beizeitgestempelte Werte, Aggregation
Sinnvoll fürMetriken, Sensordaten, Monitoring
- Suche
BeispieleElasticsearch, OpenSearch, Azure AI Search
Stark beiVolltext, Relevanz, Facetten
Sinnvoll fürProduktsuche – ergänzend zur Haupt-DB
- Object Storage
BeispieleAzure Blob Storage, Amazon S3
Stark beigroße Dateien, sehr günstig
Sinnvoll fürUploads, Bilder, Backups, Exporte
| Kriterium | Beispiele | Stark bei | Sinnvoll für |
|---|---|---|---|
| Relational | PostgreSQL, Azure SQL, MySQL | Transaktionen, Joins, Konsistenz | Geschäftsdaten mit Beziehungen – der Standard |
| Dokument | MongoDB, Azure Cosmos DB, Firestore | verschachtelte JSON-Objekte, flexible Struktur | Kataloge, Profile, Inhalte, die als Ganzes gelesen werden |
| Key-Value | Redis, Azure Cache for Redis | Zugriff per Schlüssel in unter 1 ms | Cache, Sessions, Rate Limits, Locks |
| Wide-Column | Apache Cassandra, ScyllaDB | riesige Schreiblast, verteilt über viele Knoten | IoT, Events, Logs mit bekannten Abfragen |
| Graph | Neo4j, Cosmos DB (Gremlin) | Beziehungen über viele Ebenen | Empfehlungen, Netzwerke, Berechtigungen |
| Zeitreihen | TimescaleDB, InfluxDB, Azure Data Explorer | zeitgestempelte Werte, Aggregation | Metriken, Sensordaten, Monitoring |
| Suche | Elasticsearch, OpenSearch, Azure AI Search | Volltext, Relevanz, Facetten | Produktsuche – ergänzend zur Haupt-DB |
| Object Storage | Azure Blob Storage, Amazon S3 | große Dateien, sehr günstig | Uploads, Bilder, Backups, Exporte |
Was es sonst noch gibt
SQL + horizontal
NewSQL
SQL und ACID, aber über viele Knoten verteilt: CockroachDB, Google Spanner, YugabyteDB.
Ein System, viele Modelle
Multi-Model
Azure Cosmos DB spricht Dokument, Key-Value, Graph und Cassandra. Auch PostgreSQL wird mit JSONB und Extensions vielseitig.
Alles im RAM
In-Memory & spaltenbasiert
SAP HANA hält Daten spaltenweise im Arbeitsspeicher und kann Transaktionen und Analysen zugleich.
Analyse statt Betrieb
Data Warehouse & Lakehouse
Für Auswertungen über Millionen Zeilen (OLAPBegriff · OLTP vs. OLAPOLTP (Online Transaction Processing) sind viele kleine, schnelle Lese- und Schreibzugriffe im Betrieb; OLAP (Online Analytical Processing) sind große Auswertungen über viele Daten.): Databricks, Snowflake, Microsoft Fabric, BigQuery.
Für KI
Vektor-Datenbanken
Finden ähnliche EmbeddingsBegriff · Vektor-DatenbankSpeichert Embeddings (Zahlenvektoren, die Bedeutung abbilden) und findet die ähnlichsten Einträge – Grundlage für semantische Suche und RAG mit Sprachmodellen., etwa für RAG: pgvector, Qdrant, Azure AI Search.
Ohne Server
Embedded
Läuft als Bibliothek in der App: SQLite für Mobile und Tests, DuckDB für lokale Analysen.
Fragen für die Entscheidung
- 01
Müssen mehrere Änderungen gemeinsam gelingen?
→ relationalBestellung + Zahlung + Lagerbestand: Transaktionen und Fremdschlüssel sind hier unverzichtbar.
- 02
Wird ein Datensatz fast immer als Ganzes gelesen?
→ DokumentEin Produkt mit wechselnden Attributen oder ein Benutzerprofil mit Einstellungen.
- 03
Reicht der Zugriff per Schlüssel, darf es flüchtig sein?
→ Key-ValueSession-Daten, zwischengespeicherte API-Antworten, Zähler für Rate Limits.
- 04
Geht es um Beziehungsketten?
→ Graph„Freunde von Freunden“, „wer hat über welche Gruppe Zugriff auf was?“
- 05
Willst du auswerten statt betreiben?
→ Warehouse / LakehouseBerichte und Dashboards über Jahre an Daten, getrennt von der Produktionsdatenbank.
- 06
Sind es große Binärdateien?
→ Object StoragePDFs, Bilder, Videos – in der Datenbank nur der Verweis.