Kullanıcı veritabanı şemaları tasarlamak, veri göçlerini planlamak, sorguları optimize etmek, SQL ve NoSQL arasında seçim yapmak veya veri ilişkilerini modellemek istediğinde kullanın.
cd ~/.claude/skills
git clone https://github.com/alirezarezvani/claude-skills.git claude-skills mkdir -p ~/.claude/skills/database-designer
curl -fsSL https://raw.githubusercontent.com/alirezarezvani/claude-skills/HEAD/.gemini/skills/database-designer/SKILL.md \
-o ~/.claude/skills/database-designer/SKILL.md Modern veritabanı sistemleri için uzman düzeyinde analiz, optimizasyon ve migration yetenekleri sağlayan kapsamlı bir veritabanı tasarım becerisi. Bu beceri, mimarlar ve geliştirici mimarların ölçeklenebilir, yüksek performanslı ve bakımlanabilir veritabanı şemaları oluşturmasına yardımcı olması için teorik ilkeleri pratik araçlarla birleştirir.
Bu beceri klasörüne göre tüm yollar; örnek girdiler assets/ içinde.
python3 schema_analyzer.py --input schema.sql --generate-erd --output-format json -o analysis.json
SQL DDL veya JSON şemayı kabul eder (assets/sample_schema.sql / sample_schema.json). Çıktı normalizasyon bulguları, eksik constraints, adlandırma sorunları ve bir Mermaid ERD içerir — ERD'yi kullanıcıya gösterin ve optimize etmeden önce flaglanan sorunları düzeltin.
python3 index_optimizer.py --schema assets/sample_schema.json --queries assets/sample_query_patterns.json --analyze-existing --format json -o indexes.json
Kullanıcının hot sorgularını önce bir query-patterns JSON'una yazın (assets/sample_query_patterns.json'ı kopyalayın). Çıktı, öncelik sırasına göre CREATE INDEX önerileri artı redundant-index kaldırma işlemleridir.
python3 migration_generator.py --current current_schema.json --target target_schema.json --zero-downtime --format sql -o migration.sql
--zero-downtime bir expand-contract planı çıkarır; --validate-only SQL oluşturmadan uygulanabilirliği kontrol eder.
target şemada step 1'i yeniden çalıştırın ve ilk turda bulunan sorunların gitmişliğini doğrulayın; migration'ı teslim etmeden önce migration_generator.py --validate-only çalıştırın.
→ Detaylar için references/database-design-reference.md'ye bakın
-- INNER JOIN: sadece eşleşen satırlar
SELECT o.id, c.name, o.total
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id;
-- LEFT JOIN: tüm sol satırlar, eşleşmeyenler için NULL
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: hiyerarşik veriler (çalışanlar/yöneticiler)
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
-- Org chart için recursive CTE
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;
-- ROW_NUMBER sayfalandırma / dedup için
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) AS rn
FROM orders;
-- RANK boşluklarla, DENSE_RANK boşluksuz
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM leaderboard;
-- LAG/LEAD bitişik satırları karşılaştırmak için
SELECT date, revenue,
revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM daily_sales;
-- FILTER clause (PostgreSQL) koşullu agregasyon için
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'active') AS active,
AVG(amount) FILTER (WHERE amount > 0) AS avg_positive
FROM accounts;
-- GROUPING SETS çok seviyeli rolluplar için
SELECT region, product, SUM(revenue)
FROM sales
GROUP BY GROUPING SETS ((region, product), (region), ());
Her migration'ın tersine çevrilebilir bir muadili olmalıdır. Sıralama için dosyaları timestamp öneki ile adlandırın:
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
Kilitleme veya çalışan kodu kırmaktan kaçınmak için expand-contract patternini kullanın:
-- Uzun süren kilit olmaktan kaçınmak için batch update
UPDATE users SET email_normalized = LOWER(email)
WHERE id IN (SELECT id FROM users WHERE email_normalized IS NULL LIMIT 5000);
-- 0 satır etkilenene kadar döngüde tekrarlayın
up.sql'i deployment yapmadan önce staging'de down.sql'i her zaman test edin| İndeks Tipi | Kullanım Durumu | Örnek |
|---|---|---|
| B-tree (default) | Eşitlik, aralık, 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 | Satır alt kümesi (boyut azalt) | 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 (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ...;
İzlenecek önemli sinyaller:
Semptomlar: uygulama satır başına bir sorgu çıkarır (örneğin, ilgili kayıtları döngüde getirme).
Düzeltmeler:
JOIN veya subquery kullanınselect_related / includes / with)| Araç | Protocol | En İyisi |
|---|---|---|
| PgBouncer | PostgreSQL | Transaction/statement pooling, düşük overhead |
| ProxySQL | MySQL | Sorgu yönlendirmesi, read/write splitting |
| Built-in pool (HikariCP, SQLAlchemy pool) | Herhangi biri | Application-level pooling |
Genel kural: Pool boyutunu (2 * CPU cores) + disk spindles olarak ayarlayın. Cloud SSD'ler için 2 * vCPUs'den başlayın ve ayarlayın.
SELECT sorgularını replica'lara yönlendirin; yazmaları primary'epg_last_wal_replay_lsn() kullanın| Kriterler | PostgreSQL | MySQL | SQLite | SQL Server |
|---|---|---|---|---|
| En iyisi | Kompleks sorgular, JSONB, extensions | Web uygulamaları, okuma yoğun iş yükleri | Embedded, dev/test, edge | Enterprise .NET yığınları |
| JSON desteği | Mükemmel (JSONB + GIN) | İyi (JSON type) | Minimal | İyi (OPENJSON) |
| Replication | Streaming, logical | Group replication, InnoDB cluster | N/A | Always On AG |
| Lisanslama | Açık kaynak (PostgreSQL License) | Açık kaynak (GPL) / ticari | Public domain | Ticari |
| Max pratik boyut | Multi-TB | Multi-TB | ~1 TB (single-writer) | Multi-TB |
Ne zaman seçilir:
| Veritabanı | Model | Ne Zaman Kullanılır |
|---|---|---|
| MongoDB | Document | Şema esnekliği, hızlı prototip yapma, içerik yönetimi |
| Redis | Key-value / cache | Session store, rate limiting, leaderboards, pub/sub |
| DynamoDB | Wide-column | Serverless AWS uygulamaları, herhangi bir ölçekte tek haneli-ms latency |
SQL'i varsayılan olarak kullanın. NoSQL'e yalnızca erişim deseni açıkça bundan faydalandığında başvurun.
| Strateji | Nasıl Çalışır | Avantajlar | Dezavantajlar |
|---|---|---|---|
| Hash | shard = hash(key) % N |
Eşit dağılım | Resharding pahalı |
| Range | Tarihe veya ID aralığına göre Shard | Basit, zaman serileri için iyi | En yeni shard'da sıcak noktalar |
| Geographic | Kullanıcı bölgesine göre Shard | Veri yerelliği, uyumluluk | Bölgeler arası sorgular zor |
| Desen | Tutarlılık | Latency | Kullanım Durumu |
|---|---|---|---|
| Synchronous | Güçlü | Daha yüksek yazma latency | Mali işlemler |
| Asynchronous | Eventual | Düşük yazma latency | Okuma yoğun web uygulamaları |
| Semi-synchronous | En az bir replica onaylandı | Ilımlı | Güvenlik ve hız dengesi |
Herhangi bir yaratıcı çalışmaya başlamadan önce bunu mutlaka kullanın - feature oluştururken, component inşa ederken, functionality eklerken veya davranış değiştirirken. Kullanıcı niyetini, gereksinimleri ve tasarımı implementation öncesinde araştırır.
Uygulama tamamlandığında, tüm testler geçtiğinde ve çalışmanızı nasıl entegre edeceğinize karar vermeniz gerektiğinde kullanın - merge, PR veya cleanup seçeneklerini sunarak geliştirme sürecinin tamamlanmasını rehberlik eder.
Kod incelemesi geri bildirimi alırken, önerileri uygulamadan önce kullanın; özellikle geri bildirim belirsiz veya teknik olarak şüpheli görünüyorsa - performatif anlaşmadan veya körü körüne uygulamadan ziyade teknik titizlik ve doğrulama gerekir.
Görevleri tamamlarken, büyük özellikleri hayata geçirirken veya merge etmeden önce çalışmanın gereksinimleri karşıladığını doğrulamak için kullanın.
Yeni bir feature üzerinde çalışmaya başlarken veya implementasyon planını yürütmeden önce kullanın - native araçlar veya git worktree fallback aracılığıyla izole edilmiş bir workspace sağlar.
Herhangi bir konuşma başlatırken kullanın - skill'lerin nasıl bulunacağını ve kullanılacağını belirler, clarification soruları da dahil olmak üzere HERHANGİ bir yanıt vermeden önce skill invocation gerektirir.