Was macht datenbankdesign?
Grundsätze des Datenbankdesigns und Entscheidungsfindung. Schema-Design, Indexierungsstrategie, ORM-Auswahl, serverlose Datenbanken.
Überblick
Dieses Skill-Dokument beschreibt Prinzipien und Entscheidungsprozesse für das Design von Datenbanken. Es behandelt:
- Schema-Design: Normalisierung, Denormalisierung, Beziehungen (1:1, 1:N, N:M), Primär- und Fremdschlüssel.
- Indexierungsstrategie: Auswahl von Index-Typen (B-Baum, Hash, GiST, GIN), Composite-Indizes, Index-Only-Scans, Auswirkungen auf Schreib- und Leseleistung.
- ORM-Auswahl: Kriterien für die Wahl eines ORM (z. B. SQLAlchemy, Prisma, TypeORM, Django ORM), Trade-offs zwischen Abstraktion und Performance, Unterstützung für komplexe Abfragen.
- Serverlose Datenbanken: Einsatz von Datenbanken wie Amazon Aurora Serverless, Google Cloud Spanner, CockroachDB Serverless, Azure Cosmos DB. Vorteile: automatische Skalierung, Pay-per-Use, geringer Verwaltungsaufwand. Nachteile: Latenz bei Kaltstarts, Einschränkungen bei Transaktionen.
Verwendung
Dieser Skill kann in beliebigen Kontexten eingesetzt werden, in denen Datenbankdesign-Entscheidungen getroffen werden müssen. Er eignet sich für:
- Projektinitialisierung: Auswahl der Datenbanktechnologie und des Schemas basierend auf den Anforderungen.
- Optimierung bestehender Systeme: Identifikation von Engpässen und Verbesserung der Indexierung oder des Schemas.
- ORM-Migration: Bewertung und Wechsel zwischen verschiedenen ORMs.
- Serverlose Architekturen: Entscheidung für serverlose Datenbanken und Konfiguration.
Entscheidungsmatrix
| Kriterium | Empfohlene Lösung | Begründung |
|---|---|---|
| Hohe Schreiblast | NoSQL (z. B. MongoDB, Cassandra) | Horizontale Skalierung, flexible Schemas |
| Komplexe Abfragen | Relationale Datenbank (z. B. PostgreSQL, MySQL) | ACID-Transaktionen, JOINs, Indizes |
| Geringe Latenz | In-Memory-Datenbank (z. B. Redis, Memcached) | Sub-Millisekunden-Zugriff |
| Automatische Skalierung | Serverlose Datenbank (z. B. Aurora Serverless) | Elastizität, kein Kapazitätsmanagement |
| Einfache Entwicklung | ORM (z. B. Prisma, SQLAlchemy) | Abstraktion, weniger Boilerplate-Code |
Best Practices
- Schema-Design: Beginne mit einer normalisierten Struktur und denormalisiere nur bei nachgewiesenen Performance-Problemen.
- Indexierung: Erstelle Indizes basierend auf häufig ausgeführten Abfragen (
SELECT,JOIN,WHERE). Vermeide übermäßige Indexierung, da sie Schreiboperationen verlangsamt. - ORM: Wähle ein ORM, das zur Sprache und zum Ökosystem passt. Achte auf Unterstützung für komplexe Abfragen und Transaktionen.
- Serverlos: Nutze serverlose Datenbanken für Anwendungen mit variabler Last oder saisonalen Spitzen. Plane für Kaltstart-Latenz.
Beispiele
Beispiel 1: Wahl zwischen SQL und NoSQL
# Für ein Social-Media-Feed mit vielen Lese-/Schreiboperationen und flexiblem Schema
# Empfehlung: MongoDB
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['social_media']
posts = db['posts']
# Einfügen eines Beitrags mit flexiblen Feldern
post = {"user": "alice", "content": "Hallo Welt!", "timestamp": "2023-10-01", "tags": ["news"]}
posts.insert_one(post)
Beispiel 2: Optimierung einer Abfrage mit Index
-- Langsame Abfrage ohne Index
SELECT * FROM orders WHERE customer_id = 12345;
-- Hinzufügen eines Index
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
-- Schnelle Abfrage mit Index
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 12345;
Beispiel 3: ORM mit Prisma (Node.js)
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
// Alle Benutzer mit ihren Bestellungen abrufen
const users = await prisma.user.findMany({
include: { orders: true },
});
console.log(users);
}
main();
Ressourcen
Lizenz
Dieser Skill ist unter der MIT-Lizenz verfügbar.