تكرار السؤال: …
الإجابة المختصرة
التقسيم هو توزيع بيانات الجدول أفقياً عبر قواعد بيانات أو خوادم فيزيائية مستقلة لزيادة سعة التخزين والإنتاجية؛ والتحدي الأكبر هو اختيار Shard Key يضمن التوزيع العادل وتجنب الاستعلامات عبر الخوادم (Cross-shard joins).
الشرح
إذا اخترت Shard Key سيئاً مثل Country وكان 90% من عملائك في مصر، فسيحدث اختناق شديد في خادم واحد (Hot Shard) بينما تظل بقية الخوادم خاملة. كما أن الاستعلامات التي لا تحتوي على الـ Shard Key في جملة WHERE تضطر لإرسال الاستعلام لجميع السيرفرات بالتوازي (Scatter-Gather Query) مما يدمر الأداء. علاوة على ذلك، تفقد قواعد البيانات المنفصلة المعاملات الذرية الشاملة (ACID Transactions) وتتطلب حلولاً معقدة مثل Two-Phase Commit أو أنماط Saga.
مثال بالكود
import hashlib
SHARDS = ["db-0", "db-1", "db-2", "db-3"]
def shard_for(user_id: int) -> str:
digest = int(hashlib.sha1(str(user_id).encode()).hexdigest(), 16)
return SHARDS[digest % len(SHARDS)]
# Good shard key: high cardinality and evenly distributed (user_id).
# Bad shard key: country or created_at → hot shards.
# A query that is not filtered by the shard key must fan out to every shard and merge in the application.
def total_orders():
return sum(connect(s).execute("SELECT count(*) FROM orders").scalar() for s in SHARDS)أخطاء شائعة
- اللجوء للتقسيم (Sharding) مبكراً قبل استنفاد خيارات الفهرسة السليمة، تقسيم الجداول رأسياً، التخزين المؤقت، واستخدام النسخ الاحتياطية للقراءة (Read Replicas).