Option
HeimHeim Skill Datenbankverwaltung database-designer

Entwerfen Sie Datenbankschemata, planen Sie Datenmigrationen, optimieren Sie Abfragen und modellieren Sie Datenbeziehungen mithilfe von Expertenanalysen und automatisierten Tools.

...Alle erweitern
21
Zeit aktualisiert 29. August 2026

Datenbankentwickler – Ausgeprägte Kenntnisse im Tier-Bereich

Übersicht

Eine umfassende Kompetenz im Bereich Datenbankdesign, die Analyse-, Optimierungs- und Migrationsfähigkeiten auf Expertenniveau für moderne Datenbanksysteme vermittelt. Diese Kompetenz verbindet theoretische Grundlagen mit praktischen Werkzeugen, um Architekten und Entwicklern dabei zu helfen, skalierbare, leistungsstarke und wartungsfreundliche Datenbankschemata zu erstellen.

Kernkompetenzen

Schema-Design und -Analyse

  • Normalisierungsanalyse: Automatische Erkennung von Normalisierungsstufen (1NF bis BCNF)
  • Denormalisierungsstrategie: Intelligente Empfehlungen zur Leistungsoptimierung
  • Optimierung von Datentypen: Identifizierung ungeeigneter Typen und Größenprobleme
  • Einschränkungsanalyse: Fehlende Fremdschlüssel, Eindeutigkeitsbeschränkungen und Null-Prüfungen
  • Validierung der Namenskonventionen: Konsistente Namensmuster für Tabellen und Spalten
  • ERD-Generierung: Automatische Erstellung von Mermaid-Diagrammen aus DDL

Indexoptimierung

  • Index-Lückenanalyse: Identifizierung fehlender Indizes für Fremdschlüssel und Abfragemuster
  • Strategie für zusammengesetzte Indizes: Optimale Spaltenreihenfolge für mehrspaltige Indizes
  • Erkennung von Indexredundanzen: Beseitigung sich überschneidender und ungenutzter Indizes
  • Modellierung der Auswirkungen auf die Leistung: Selektivitätsschätzung und Analyse der Abfragekosten
  • Auswahl des Indextyps: B-Baum-, Hash-, Teil-, abdeckende und spezialisierte Indizes

Migrationsmanagement

  • Migrationen ohne Ausfallzeiten: Implementierung des „Expand-Contract“-Musters
  • Schemaentwicklung: Sicheres Hinzufügen, Löschen und Ändern von Spaltentypen
  • Datenmigrationsskripte: Automatisierte Datentransformation und -validierung
  • Rollback-Strategie: Umfassende Rückabwicklungsfunktionen mit Validierung
  • Ausführungsplanung: Geordnete Migrationsschritte mit Auflösung von Abhängigkeiten

Tool-Workflow (führen Sie diese Schritte aus – analysieren Sie Schemata nicht manuell)

Alle Pfade relativ zu diesem Skill-Ordner; Beispiel-Eingaben in assets/.

1. Schema analysieren

python3 schema_analyzer.py --input schema.sql --generate-erd --output-format json -o analysis.json

Akzeptiert SQL-DDL oder JSON-Schema (assets/sample_schema.sql / sample_schema.json). Die Ausgabe umfasst Normalisierungsergebnisse, fehlende Einschränkungen, Namensprobleme und ein Mermaid-ERD – zeigen Sie dem Benutzer das ERD an und beheben Sie markierte Probleme, bevor Sie die Optimierung vornehmen.

2. Indizes anhand realer Abfragemuster optimieren

python3 index_optimizer.py --schema assets/sample_schema.json --queries assets/sample_query_patterns.json --analyze-existing --format json -o indexes.json

Schreiben Sie die häufig verwendeten Abfragen des Benutzers zunächst in eine JSON-Datei mit Abfragemustern (kopieren assets/sample_query_patterns.json). Die Ausgabe ist eine nach Priorität geordnete Liste von CREATE-INDEX-Empfehlungen sowie Vorschlägen zum Entfernen redundanter Indizes.

3. Erstellen Sie die Migration

python3 migration_generator.py --current current_schema.json --target target_schema.json --zero-downtime --format sql -o migration.sql

--zero-downtime gibt einen „Expand-Contract“-Plan aus; --validate-only prüft die Machbarkeit, ohne SQL zu generieren.

4. Verifizierungsschleife

Führt Schritt 1 erneut auf dem Zielschema aus und stellt sicher, dass die im ersten Durchlauf gefundenen Probleme behoben sind; führt migration_generator.py --validate-only vor der Übergabe der Migration.

Grundsätze des Datenbankdesigns

→ Siehe „references/database-design-reference.md“ für Details

Bewährte Vorgehensweisen

Schema-Design

  1. Verwenden Sie aussagekräftige Namen: Klare, einheitliche Namenskonventionen
  2. Wählen Sie geeignete Datentypen: Spalten mit der richtigen Größe für eine effiziente Speicherung
  3. Definieren Sie geeignete Einschränkungen: Fremdschlüssel, Prüfbedingungen, eindeutige Indizes
  4. Zukünftiges Wachstum berücksichtigen: Skalierbarkeit von Anfang an einplanen
  5. Beziehungen dokumentieren: Klare Fremdschlüsselbeziehungen und Geschäftsregeln

Leistungsoptimierung

  1. Strategisches Indizieren: Abdeckung gängiger Abfragemuster ohne übermäßige Indizierung
  2. Überwachen Sie die Abfrageleistung: Regelmäßige Analyse langsamer Abfragen
  3. Partitionieren Sie große Tabellen: Verbessern Sie die Abfrageleistung und die Wartung
  4. Verwenden Sie geeignete Isolationsstufen: Schaffen Sie ein Gleichgewicht zwischen Konsistenz und Leistung
  5. Verbindungspooling implementieren: Effiziente Ressourcennutzung

Sicherheitsaspekte

  1. Prinzip der geringsten Berechtigungen: Nur die unbedingt notwendigen Berechtigungen erteilen
  2. Verschlüsseln Sie sensible Daten: sowohl im Ruhezustand als auch während der Übertragung
  3. Zugriffsmuster überprüfen: Datenbankzugriffe überwachen und protokollieren
  4. Eingaben validieren: SQL-Injection-Angriffe verhindern
  5. Regelmäßige Sicherheitsupdates: Datenbanksoftware auf dem neuesten Stand halten

Muster zur Abfrageerstellung

SELECT mit JOINs

-- INNER JOIN: only matching rows
SELECT o.id, c.name, o.total
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id;

-- LEFT JOIN: all left rows, NULLs for non-matches
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

-- Self-join: hierarchical data (employees/managers)
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;

Common Table Expressions (CTEs)

-- Recursive CTE for org chart
WITH RECURSIVE org AS (
  SELECT id, name, manager_id, 1 AS depth
  FROM employees WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, e.manager_id, o.depth + 1
  FROM employees e INNER JOIN org o ON o.id = e.manager_id
)
SELECT * FROM org ORDER BY depth, name;

Fensterfunktionen

-- ROW_NUMBER for pagination / dedup
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) AS rn
FROM orders;

-- RANK with gaps, DENSE_RANK without gaps
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM leaderboard;

-- LAG/LEAD for comparing adjacent rows
SELECT date, revenue,
  revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM daily_sales;

Aggregationsmuster

-- FILTER clause (PostgreSQL) for conditional aggregation
SELECT
  COUNT(*) AS total,
  COUNT(*) FILTER (WHERE status = 'active') AS active,
  AVG(amount) FILTER (WHERE amount > 0) AS avg_positive
FROM accounts;

-- GROUPING SETS for multi-level rollups
SELECT region, product, SUM(revenue)
FROM sales
GROUP BY GROUPING SETS ((region, product), (region), ());

Migrationsmuster

Skripte für Up-/Down-Migrationen

Jede Migration muss ein reversibles Gegenstück haben. Benennen Sie Dateien zur Sortierung mit einem Zeitstempel-Präfix:

migrations/
├── 20260101_000001_create_users.up.sql
├── 20260101_000001_create_users.down.sql
├── 20260115_000002_add_users_email_index.up.sql
└── 20260115_000002_add_users_email_index.down.sql

Migrationen ohne Ausfallzeiten (Erweitern/Reduzieren)

Verwenden Sie das Expand-Contract-Muster, um eine Sperrung oder Unterbrechung des laufenden Codes zu vermeiden:

  1. Erweitern – Fügen Sie die neue Spalte/Tabelle hinzu (nullfähig, mit Standardwert)
  2. Daten migrieren – in Batches nachträglich einfügen; doppeltes Schreiben aus der Anwendung
  3. Übergang – Anwendung liest aus der neuen Spalte; Schreiben in die alte Spalte wird eingestellt
  4. Reduzieren – alte Spalte in einer nachfolgenden Migration entfernen

Strategien zum Nachfüllen von Daten

-- Batch update to avoid long-running locks
UPDATE users SET email_normalized = LOWER(email)
WHERE id IN (SELECT id FROM users WHERE email_normalized IS NULL LIMIT 5000);
-- Repeat in a loop until 0 rows affected

Rollback-Verfahren

  • Testen Sie stets die down.sql in der Staging-Umgebung, bevor Sie up.sql in die Produktion
  • Halten Sie das Rollback-Fenster kurz – wenn der Vertragsschritt bereits ausgeführt wurde, erfordert ein Rollback eine neue Vorwärtsmigration
  • Bei irreversiblen Änderungen (Löschen von Spalten mit Daten) sollten Sie zunächst eine logische Sicherung erstellen

Leistungsoptimierung

Indizierungsstrategien

Indextyp Anwendungsfall Beispiel
B-Baum (Standard) Gleichheit, Bereich, ORDER BY CREATE INDEX idx_users_email ON users(email);
GIN Volltextsuche, JSONB, Arrays CREATE INDEX idx_docs_body ON docs USING gin(to_tsvector('english', body));
GiST Geometrie, Bereichstypen, nächster Nachbar CREATE INDEX idx_locations ON places USING gist(coords);
Teilweise Teilmenge von Zeilen (Größe reduzieren) CREATE INDEX idx_active ON users(email) WHERE active = true;
Abdeckung Nur-Index-Scans CREATE INDEX idx_cov ON orders(customer_id) INCLUDE (total, created_at);

Auswertung des EXPLAIN-Plans

EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ...;

Zu beachtende Schlüsselindikatoren:

  • Seq-Scan bei großen Tabellen – fehlender Index
  • Nested Loop mit hohen Zeilenschätzungen – Hash-/Merge-Join in Betracht ziehen oder Index hinzufügen
  • Gemeinsam genutzte Puffer beim Lesen deutlich höher als Treffer – Arbeitsspeicher überschreitet die Speichergröße

Erkennung von N+1-Abfragen

Symptome: Die Anwendung gibt pro Zeile eine Abfrage aus (z. B. beim Abrufen verwandter Datensätze in einer Schleife).

Abhilfemaßnahmen:

  • Verwenden Sie JOIN oder eine Unterabfrage, um die Daten in einem einzigen Roundtrip abzurufen
  • ORM-Eager-Loading (select_related / includes / with)
  • DataLoader-Muster für GraphQL-Resolver

Verbindungspooling

Tool Protokoll Am besten geeignet für
PgBouncer PostgreSQL Transaktions-/Anweisungs-Pooling, geringer Overhead
ProxySQL MySQL Abfrageweiterleitung, Trennung von Lese- und Schreibvorgängen
Integrierter Pool (HikariCP, SQLAlchemy-Pool) Beliebig Pooling auf Anwendungsebene

Faustregel: Legen Sie die Poolgröße auf (2 * CPU cores) + disk spindles. Bei Cloud-SSDs sollten Sie zunächst mit 2 * vCPUs und passen Sie den Wert anschließend an.

Lese-Replikate und Abfrage-Routing

  • Leiten Sie alle SELECT Abfragen an Replikate weiter; Schreibvorgänge an den Primärserver
  • Berücksichtigen Sie die Replikationsverzögerung (typischerweise <1 s bei asynchroner Replikation, 0 bei synchroner Replikation)
  • Verwenden Sie pg_last_wal_replay_lsn() , um Verzögerungen zu erkennen, bevor kritische Daten gelesen werden

Entscheidungsmatrix für mehrere Datenbanken

Kriterien PostgreSQL MySQL SQLite SQL Server
Am besten geeignet für Komplexe Abfragen, JSONB, Erweiterungen Webanwendungen, leseintensive Workloads Embedded, Entwicklung/Test, Edge Enterprise-.NET-Stacks
JSON-Unterstützung Hervorragend (JSONB + GIN) Gut (JSON-Typ) Minimal Gut (OPENJSON)
Replikation Streaming, logisch Gruppenreplikation, InnoDB-Cluster k. A. Always On AG
Lizenzierung Open Source (PostgreSQL-Lizenz) Open Source (GPL) / kommerziell Public Domain Kommerziell
Maximale praktische Größe Mehrere TB Mehrere TB ~1 TB (Einzelschreiber) Mehrere TB

Wann sollte man sich dafür entscheiden:

  • PostgreSQL – Standardwahl für neue Projekte; beste Erweiterbarkeit und Einhaltung von Standards
  • MySQL – bestehendes MySQL-Ökosystem; einfache, leseintensive Webanwendungen
  • SQLite – mobile Apps, CLI-Tools, Unit-Test-Datenbanken, IoT/Edge
  • SQL Server – durch Unternehmensrichtlinien vorgeschrieben; tiefe .NET-/Azure-Integration

Überlegungen zu NoSQL

Datenbank Modell Einsatz bei
MongoDB Dokument Flexibilität des Schemas, schnelle Prototypenerstellung, Content-Management
Redis Schlüssel-Wert / Cache Sitzungsspeicher, Ratenbegrenzung, Ranglisten, Pub/Sub
DynamoDB Breitspaltig Serverlose AWS-Anwendungen, Latenz im einstelligen Millisekundenbereich bei jeder Skalierung

Verwenden Sie standardmäßig SQL. Greifen Sie nur dann auf NoSQL zurück, wenn das Zugriffsmuster eindeutig davon profitiert.

Sharding und Replikation

Horizontale vs. vertikale Partitionierung

  • Vertikale Partitionierung: Spalten über Tabellen hinweg aufteilen (z. B. separate BLOB-Spalten). Reduziert den I/O-Aufwand bei schmalen Abfragen.
  • Horizontale Partitionierung (Sharding): Aufteilung der Zeilen auf verschiedene Datenbanken/Server. Erforderlich, wenn ein einzelner Knoten den Datensatz nicht speichern oder den Durchsatz nicht bewältigen kann.

Sharding-Strategien

Strategie Funktionsweise Vorteile Nachteile
Hash shard = hash(key) % N Gleichmäßige Verteilung Resharding ist aufwendig
Bereich Sharding nach Datum oder ID-Bereich Einfach, gut für Zeitreihen geeignet Hotspots auf dem neuesten Shard
Geografisch Aufteilung nach Benutzerregion Datenlokalität, Compliance Regionsübergreifende Abfragen sind schwierig

Replikationsmuster

Muster Konsistenz Latenz Anwendungsfall
Synchron Stark Höhere Schreiblatenz Finanztransaktionen
Asynchron Eventuell Geringe Schreiblatenz Leseintensive Webanwendungen
Halbsynchron Mindestens eine Replik bestätigt Mäßig Ausgewogenes Verhältnis zwischen Sicherheit und Geschwindigkeit

Querverweise

  • sql-database-assistant – Abfrageerstellung, Optimierung und Fehlerbehebung für die tägliche Arbeit mit SQL
  • database-schema-designer — ERD-Modellierung, Normalisierungsanalyse und Schemagenerierung
  • migration-architect – Planung groß angelegter Migrationen zwischen verschiedenen Datenbank-Engines oder umfangreicher Schemaüberarbeitungen
  • senior-backend — Muster auf Anwendungsebene (Verbindungspooling, ORM-Best-Practices)
  • senior-devops – Bereitstellung der Infrastruktur für Datenbankcluster und Replikate
Auf GitHub ansehen
---
name: database-designer
description: Design database schemas, plan data migrations, optimize queries, and model data relationships using expert analysis and automated tools.
---

# Database Designer - POWERFUL Tier Skill

## Overview

A comprehensive database design skill that provides expert-level analysis, optimization, and migration capabilities for modern database systems. This skill combines theoretical principles with practical tools to help architects and developers create scalable, performant, and maintainable database schemas.

## Core Competencies

### Schema Design & Analysis
- **Normalization Analysis**: Automated detection of normalization levels (1NF through BCNF)
- **Denormalization Strategy**: Smart recommendations for performance optimization
- **Data Type Optimization**: Identification of inappropriate types and size issues
- **Constraint Analysis**: Missing foreign keys, unique constraints, and null checks
- **Naming Convention Validation**: Consistent table and column naming patterns
- **ERD Generation**: Automatic Mermaid diagram creation from DDL

### Index Optimization
- **Index Gap Analysis**: Identification of missing indexes on foreign keys and query patterns
- **Composite Index Strategy**: Optimal column ordering for multi-column indexes
- **Index Redundancy Detection**: Elimination of overlapping and unused indexes
- **Performance Impact Modeling**: Selectivity estimation and query cost analysis
- **Index Type Selection**: B-tree, hash, partial, covering, and specialized indexes

### Migration Management
- **Zero-Downtime Migrations**: Expand-contract pattern implementation
- **Schema Evolution**: Safe column additions, deletions, and type changes
- **Data Migration Scripts**: Automated data transformation and validation
- **Rollback Strategy**: Complete reversal capabilities with validation
- **Execution Planning**: Ordered migration steps with dependency resolution

## Tool Workflow (run these — do not analyze schemas by hand)

All paths relative to this skill folder; sample inputs in `assets/`.

### 1. Analyze the schema

```bash
python3 schema_analyzer.py --input schema.sql --generate-erd --output-format json -o analysis.json
```

Accepts SQL DDL or JSON schema (`assets/sample_schema.sql` / `sample_schema.json`). Output includes normalization findings, missing constraints, naming issues, and a Mermaid ERD — show the ERD to the user and fix flagged issues before optimizing.

### 2. Optimize indexes against real query patterns

```bash
python3 index_optimizer.py --schema assets/sample_schema.json --queries assets/sample_query_patterns.json --analyze-existing --format json -o indexes.json
```

Write the user's hot queries into a query-patterns JSON first (copy `assets/sample_query_patterns.json`). Output is a priority-ordered list of CREATE INDEX recommendations plus redundant-index removals.

### 3. Generate the migration

```bash
python3 migration_generator.py --current current_schema.json --target target_schema.json --zero-downtime --format sql -o migration.sql
```

`--zero-downtime` emits an expand-contract plan; `--validate-only` checks feasibility without generating SQL.

### 4. Verification loop

Re-run step 1 on the *target* schema and assert the issues found in the first pass are gone; run `migration_generator.py --validate-only` before handing over the migration.

## Database Design Principles
→ See references/database-design-reference.md for details

## Best Practices

### Schema Design
1. **Use meaningful names**: Clear, consistent naming conventions
2. **Choose appropriate data types**: Right-sized columns for storage efficiency
3. **Define proper constraints**: Foreign keys, check constraints, unique indexes
4. **Consider future growth**: Plan for scale from the beginning
5. **Document relationships**: Clear foreign key relationships and business rules

### Performance Optimization
1. **Index strategically**: Cover common query patterns without over-indexing
2. **Monitor query performance**: Regular analysis of slow queries
3. **Partition large tables**: Improve query performance and maintenance
4. **Use appropriate isolation levels**: Balance consistency with performance
5. **Implement connection pooling**: Efficient resource utilization

### Security Considerations
1. **Principle of least privilege**: Grant minimal necessary permissions
2. **Encrypt sensitive data**: At rest and in transit
3. **Audit access patterns**: Monitor and log database access
4. **Validate inputs**: Prevent SQL injection attacks
5. **Regular security updates**: Keep database software current

## Query Generation Patterns

### SELECT with JOINs

```sql
-- INNER JOIN: only matching rows
SELECT o.id, c.name, o.total
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id;

-- LEFT JOIN: all left rows, NULLs for non-matches
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

-- Self-join: hierarchical data (employees/managers)
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
```

### Common Table Expressions (CTEs)

```sql
-- Recursive CTE for org chart
WITH RECURSIVE org AS (
  SELECT id, name, manager_id, 1 AS depth
  FROM employees WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, e.manager_id, o.depth + 1
  FROM employees e INNER JOIN org o ON o.id = e.manager_id
)
SELECT * FROM org ORDER BY depth, name;
```

### Window Functions

```sql
-- ROW_NUMBER for pagination / dedup
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) AS rn
FROM orders;

-- RANK with gaps, DENSE_RANK without gaps
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM leaderboard;

-- LAG/LEAD for comparing adjacent rows
SELECT date, revenue,
  revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM daily_sales;
```

### Aggregation Patterns

```sql
-- FILTER clause (PostgreSQL) for conditional aggregation
SELECT
  COUNT(*) AS total,
  COUNT(*) FILTER (WHERE status = 'active') AS active,
  AVG(amount) FILTER (WHERE amount > 0) AS avg_positive
FROM accounts;

-- GROUPING SETS for multi-level rollups
SELECT region, product, SUM(revenue)
FROM sales
GROUP BY GROUPING SETS ((region, product), (region), ());
```

---

## Migration Patterns

### Up/Down Migration Scripts

Every migration must have a reversible counterpart. Name files with a timestamp prefix for ordering:

```
migrations/
├── 20260101_000001_create_users.up.sql
├── 20260101_000001_create_users.down.sql
├── 20260115_000002_add_users_email_index.up.sql
└── 20260115_000002_add_users_email_index.down.sql
```

### Zero-Downtime Migrations (Expand/Contract)

Use the expand-contract pattern to avoid locking or breaking running code:

1. **Expand** — add the new column/table (nullable, with default)
2. **Migrate data** — backfill in batches; dual-write from application
3. **Transition** — application reads from new column; stop writing to old
4. **Contract** — drop old column in a follow-up migration

### Data Backfill Strategies

```sql
-- Batch update to avoid long-running locks
UPDATE users SET email_normalized = LOWER(email)
WHERE id IN (SELECT id FROM users WHERE email_normalized IS NULL LIMIT 5000);
-- Repeat in a loop until 0 rows affected
```

### Rollback Procedures

- Always test the `down.sql` in staging before deploying `up.sql` to production
- Keep rollback window short — if the contract step has run, rollback requires a new forward migration
- For irreversible changes (dropping columns with data), take a logical backup first

---

## Performance Optimization

### Indexing Strategies

| Index Type | Use Case | Example |
|------------|----------|---------|
| **B-tree** (default) | Equality, range, ORDER BY | `CREATE INDEX idx_users_email ON users(email);` |
| **GIN** | Full-text search, JSONB, arrays | `CREATE INDEX idx_docs_body ON docs USING gin(to_tsvector('english', body));` |
| **GiST** | Geometry, range types, nearest-neighbor | `CREATE INDEX idx_locations ON places USING gist(coords);` |
| **Partial** | Subset of rows (reduce size) | `CREATE INDEX idx_active ON users(email) WHERE active = true;` |
| **Covering** | Index-only scans | `CREATE INDEX idx_cov ON orders(customer_id) INCLUDE (total, created_at);` |

### EXPLAIN Plan Reading

```sql
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ...;
```

Key signals to watch:
- **Seq Scan** on large tables — missing index
- **Nested Loop** with high row estimates — consider hash/merge join or add index
- **Buffers shared read** much higher than **hit** — working set exceeds memory

### N+1 Query Detection

Symptoms: application issues one query per row (e.g., fetching related records in a loop).

Fixes:
- Use `JOIN` or subquery to fetch in one round-trip
- ORM eager loading (`select_related` / `includes` / `with`)
- DataLoader pattern for GraphQL resolvers

### Connection Pooling

| Tool | Protocol | Best For |
|------|----------|----------|
| **PgBouncer** | PostgreSQL | Transaction/statement pooling, low overhead |
| **ProxySQL** | MySQL | Query routing, read/write splitting |
| **Built-in pool** (HikariCP, SQLAlchemy pool) | Any | Application-level pooling |

**Rule of thumb:** Set pool size to `(2 * CPU cores) + disk spindles`. For cloud SSDs, start with `2 * vCPUs` and tune.

### Read Replicas and Query Routing

- Route all `SELECT` queries to replicas; writes to primary
- Account for replication lag (typically <1s for async, 0 for sync)
- Use `pg_last_wal_replay_lsn()` to detect lag before reading critical data

---

## Multi-Database Decision Matrix

| Criteria | PostgreSQL | MySQL | SQLite | SQL Server |
|----------|-----------|-------|--------|------------|
| **Best for** | Complex queries, JSONB, extensions | Web apps, read-heavy workloads | Embedded, dev/test, edge | Enterprise .NET stacks |
| **JSON support** | Excellent (JSONB + GIN) | Good (JSON type) | Minimal | Good (OPENJSON) |
| **Replication** | Streaming, logical | Group replication, InnoDB cluster | N/A | Always On AG |
| **Licensing** | Open source (PostgreSQL License) | Open source (GPL) / commercial | Public domain | Commercial |
| **Max practical size** | Multi-TB | Multi-TB | ~1 TB (single-writer) | Multi-TB |

**When to choose:**
- **PostgreSQL** — default choice for new projects; best extensibility and standards compliance
- **MySQL** — existing MySQL ecosystem; simple read-heavy web applications
- **SQLite** — mobile apps, CLI tools, unit test databases, IoT/edge
- **SQL Server** — mandated by enterprise policy; deep .NET/Azure integration

### NoSQL Considerations

| Database | Model | Use When |
|----------|-------|----------|
| **MongoDB** | Document | Schema flexibility, rapid prototyping, content management |
| **Redis** | Key-value / cache | Session store, rate limiting, leaderboards, pub/sub |
| **DynamoDB** | Wide-column | Serverless AWS apps, single-digit-ms latency at any scale |

> Use SQL as default. Reach for NoSQL only when the access pattern clearly benefits from it.

---

## Sharding & Replication

### Horizontal vs Vertical Partitioning

- **Vertical partitioning**: Split columns across tables (e.g., separate BLOB columns). Reduces I/O for narrow queries.
- **Horizontal partitioning (sharding)**: Split rows across databases/servers. Required when a single node cannot hold the dataset or handle the throughput.

### Sharding Strategies

| Strategy | How It Works | Pros | Cons |
|----------|-------------|------|------|
| **Hash** | `shard = hash(key) % N` | Even distribution | Resharding is expensive |
| **Range** | Shard by date or ID range | Simple, good for time-series | Hot spots on latest shard |
| **Geographic** | Shard by user region | Data locality, compliance | Cross-region queries are hard |

### Replication Patterns

| Pattern | Consistency | Latency | Use Case |
|---------|------------|---------|----------|
| **Synchronous** | Strong | Higher write latency | Financial transactions |
| **Asynchronous** | Eventual | Low write latency | Read-heavy web apps |
| **Semi-synchronous** | At-least-one replica confirmed | Moderate | Balance of safety and speed |

---

## Cross-References

- **sql-database-assistant** — query writing, optimization, and debugging for day-to-day SQL work
- **database-schema-designer** — ERD modeling, normalization analysis, and schema generation
- **migration-architect** — large-scale migration planning across database engines or major schema overhauls
- **senior-backend** — application-layer patterns (connection pooling, ORM best practices)
- **senior-devops** — infrastructure provisioning for database clusters and replicas

Alle Dateien

0 Dateien

database-designer installieren

Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.

ZIP herunterladen

Klonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.

git clone https://github.com/alirezarezvani/claude-skills/tree/main/engineering/skills/database-designer # Copy SKILL.md to your .claude/skills/ directory

Kopieren Kopieren
Schnelle Einrichtung: Kopiere den Skill-Ordner nach .claude/skills/ Claude erkennt den Skill automatisch und nutzt ihn.

Ähnliche Skills

microservices-patterns
Zeit aktualisiert 29. Juni 2026
jpa-patterns
Zeit aktualisiert 30. Juni 2026
fabric-lakehouse
Zeit aktualisiert 30. Juni 2026
PostgreSQL Syntax Reference
Zeit aktualisiert 29. Juni 2026
OR