| name | database_design |
| description | Schema tasarımı, migration stratejileri, indexing, query optimization ve database best practices. |
🗄️ Database Design
Schema tasarımı, migration ve query optimization rehberi.
📋 İçindekiler
- Schema Tasarım Prensipleri
- Normalization
- Indexing Stratejileri
- Query Optimization
- Migration Best Practices
- NoSQL Patterns
1. Schema Tasarım Prensipleri
Naming Conventions
CREATE TABLE users (...);
CREATE TABLE order_items (...);
user_id, created_at, is_active
id SERIAL PRIMARY KEY
user_id UUID PRIMARY KEY
user_id INTEGER REFERENCES users(id)
Temel Kolon Tipleri
| Veri | PostgreSQL | MySQL |
|---|
| ID | UUID / SERIAL | CHAR(36) / INT AUTO_INCREMENT |
| Text (kısa) | VARCHAR(255) | VARCHAR(255) |
| Text (uzun) | TEXT | TEXT |
| Tarih | TIMESTAMP WITH TIME ZONE | DATETIME |
| Boolean | BOOLEAN | TINYINT(1) |
| JSON | JSONB | JSON |
| Para | DECIMAL(19,4) | DECIMAL(19,4) |
2. Normalization
Normal Formlar
| Form | Kural | Örnek |
|---|
| 1NF | Atomik değerler | address → street, city, zip |
| 2NF | Tam bağımlılık | Composite key parçalama |
| 3NF | Transitif bağımlılık yok | user.department_name → ayrı tablo |
Denormalization Durumları
- Read-heavy workload
- Reporting/analytics tabloları
- Cache tabloları
- Aggregation sonuçları
3. Indexing Stratejileri
Index Tipleri
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;
CREATE UNIQUE INDEX idx_users_email_unique ON users(email);
CREATE INDEX idx_users_metadata ON users USING GIN(metadata);
Index Seçim Kuralları
✅ Index Ekle:
- WHERE clause'da sık kullanılan kolonlar
- JOIN kolonları (foreign keys)
- ORDER BY kolonları
- Unique constraint gereken kolonlar
❌ Index Ekleme:
- Düşük cardinality (boolean, enum)
- Sık güncellenen kolonlar
- Küçük tablolar (<1000 row)
4. Query Optimization
EXPLAIN Analizi
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 123
AND created_at > '2025-01-01';
Optimization Teknikleri
SELECT * FROM users;
SELECT id, name, email FROM users;
FOR user IN users:
SELECT * FROM orders WHERE user_id = user.id
SELECT * FROM orders WHERE user_id IN (1, 2, 3);
SELECT * FROM users WHERE YEAR(created_at) = 2025;
SELECT * FROM users
WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01';
Pagination
SELECT * FROM users ORDER BY id LIMIT 20 OFFSET 40;
SELECT * FROM users
WHERE id > :last_id
ORDER BY id
LIMIT 20;
5. Migration Best Practices
Dosya Yapısı
migrations/
├── 001_create_users_table.sql
├── 002_add_email_to_users.sql
├── 003_create_orders_table.sql
└── 004_add_index_orders_user_id.sql
Güvenli Migration Kuralları
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active';
ALTER TABLE users DROP COLUMN old_field;
DROP TABLE deprecated_table;
Zero-Downtime Migration
- Yeni kolon ekle (nullable)
- Dual-write başlat
- Data migration yap
- Yeni kolonu NOT NULL yap
- Eski kolonu kaldır
6. NoSQL Patterns
MongoDB Schema Design
{
_id: ObjectId("..."),
name: "John",
addresses: [
{ street: "123 Main", city: "NYC" },
{ street: "456 Oak", city: "LA" }
]
}
{ _id: ObjectId("..."), name: "John" }
{ _id: ObjectId("..."), user_id: ObjectId("..."), total: 100 }
Redis Data Structures
STRING → Cache, session
HASH → Object storage
LIST → Queue, timeline
SET → Tags, unique items
ZSET → Leaderboard, ranking
Database Design v1.1 - Enhanced
🔄 Workflow
Kaynak: System Design Primer - Database
Aşama 1: Requirements & Modeling
Aşama 2: Logical Design
Aşama 3: Physical Implementation
Kontrol Noktaları
| Aşama | Doğrulama |
|---|
| 1 | ER diyagramı tüm use-case'leri kapsıyor mu? |
| 2 | Her tablo için Primary Key var mı? |
| 3 | EXPLAIN ile sorgu maliyetleri kontrol edildi mi? |