database-designer
alirezarezvani/claude-skills
Entwerfen Sie Datenbankschemata, planen Sie Datenmigrationen, optimieren Sie Abfragen und modellieren Sie Datenbeziehungen mithilfe von Expertenanalysen und automatisierten Tools.
...Alle erweiternDatenbankentwickler – 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
- Verwenden Sie aussagekräftige Namen: Klare, einheitliche Namenskonventionen
- Wählen Sie geeignete Datentypen: Spalten mit der richtigen Größe für eine effiziente Speicherung
- Definieren Sie geeignete Einschränkungen: Fremdschlüssel, Prüfbedingungen, eindeutige Indizes
- Zukünftiges Wachstum berücksichtigen: Skalierbarkeit von Anfang an einplanen
- Beziehungen dokumentieren: Klare Fremdschlüsselbeziehungen und Geschäftsregeln
Leistungsoptimierung
- Strategisches Indizieren: Abdeckung gängiger Abfragemuster ohne übermäßige Indizierung
- Überwachen Sie die Abfrageleistung: Regelmäßige Analyse langsamer Abfragen
- Partitionieren Sie große Tabellen: Verbessern Sie die Abfrageleistung und die Wartung
- Verwenden Sie geeignete Isolationsstufen: Schaffen Sie ein Gleichgewicht zwischen Konsistenz und Leistung
- Verbindungspooling implementieren: Effiziente Ressourcennutzung
Sicherheitsaspekte
- Prinzip der geringsten Berechtigungen: Nur die unbedingt notwendigen Berechtigungen erteilen
- Verschlüsseln Sie sensible Daten: sowohl im Ruhezustand als auch während der Übertragung
- Zugriffsmuster überprüfen: Datenbankzugriffe überwachen und protokollieren
- Eingaben validieren: SQL-Injection-Angriffe verhindern
- 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:
- Erweitern – Fügen Sie die neue Spalte/Tabelle hinzu (nullfähig, mit Standardwert)
- Daten migrieren – in Batches nachträglich einfügen; doppeltes Schreiben aus der Anwendung
- Übergang – Anwendung liest aus der neuen Spalte; Schreiben in die alte Spalte wird eingestellt
- 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.sqlin der Staging-Umgebung, bevor Sieup.sqlin 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
JOINoder 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
SELECTAbfragen 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
---
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 Dateiendatabase-designer installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen 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





Heim
