الگوی طراحی داده
الگوهای مدلسازی داده: Denormalization، Wide Table و JSON columns — بهینهسازی برای خواندن
مدلسازی: برای خواندن طراحی کن
در سیستمهای بزرگ، داده را برای الگوی خواندن شکل میدهیم نه «کیفیت نظری» — این تفاوت اصلی SQL دانشگاهی و System Design واقعی است.
Normalization در برابر Denormalization
نرمال (3NF): هر داده یکجا؛ بدون تکرار — خواندن = Join زیاد!
Denormalized: تکرار عمدی برای خواندن سریع:
نرمال:
orders(id, user_id) + users(id, name)
Denormalized:
orders(id, user_id, user_name) ← name کپی شده!
قاعده: در مقیاس بزرگ، خواندن ۱۰۰ برابر نوشتن است — تکرار کن، Join را بکش!
Wide Table (جدول عریض)
همهچیز در یک جدول — حتی ستونهای خالی زیاد:
- مزیت: خواندن یکردیفه، بدون Join، کشپسند
- کاربرد: Cassandra (ستونهای sparse بومی!)، گزارشگیری
- عیب: بهروزرسانی چندمنبعی، فضا
JSON Columns — انعطاف هوشمند
PostgreSQL/MongoDB: ستون JSON برای بخش متغیر داده:
products(id, name, price, attributes JSON)
-- لپتاپ: {"ram": 16, "cpu": "i7"}
-- کتاب: {"author": "...", "pages": 300}
مزیت: اسکیمای متغیر بدون جدولهای EAV پیچیده؛ عیب: ایندکس و اعتبارسنجی سختتر.
الگوهای پرکاربرد
| الگو | کاربرد |
|---|---|
| مادهسازی (Materialized View) | نتیجه کوئری سنگین، از پیش محاسبه و ذخیره |
| شمارنده از پیش محاسبه | followers_count بهجای COUNT(*) زنده! |
| جدول خلاصه (Summary) | آمار روزانه بهجای تجمیع لحظهای |
| Soft Delete | deleted_at بهجای DELETE واقعی |
| Audit Log | تاریخچه تغییرات در جدول جدا |
مثال: شمارنده فالوور
❌ هر پروفایل: COUNT از جدول follows (میلیونها ردیف!)
✓ ستون followers_count + بهروزرسانی با هر فالو/آنفالو — خواندن O(1)!
جمعبندی
- برای الگوی خواندن طراحی کن، نه زیبایی نظری
- Denormalization: تکرار عمدی، Join کمتر
- Wide Table و JSON: انعطاف + خواندن یکردیفه
- شمارنده و خلاصه از پیش محاسبه = طلای خواندن
این مبحث بخشی از دوره آموزش کامل طراحی سیستم (System Design) است.