الاستعلامات بين الأقسام: المشكلة الصعبة
افهم سبب كون عمليات الربط والمعاملات بين الأقسام أصعب مشكلة في قواعد البيانات الموزعة، وتعرّف على الأنماط التي تقللها إلى أدنى حد
الاستعلامات بين الأقسام: المشكلة الصعبة درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
ضريبة التجزئة
توسّع التجزئة نطاق الكتابة والسعة، لكنها تجعل الاستعلامات التي تمتد عبر الأجزاء مؤلمة: فكل استعلام عبر الأجزاء هو عملية توزيع على جميع الأجزاء.
الاستعلامات ضمن جزء واحد سهلة
إذا ظهر مفتاح الجزء في جملة WHERE، يرسل الموجّه استعلامًا واحدًا إلى جزء واحد:
-- shard_id = hash(user_id) % N
SELECT * FROM orders WHERE user_id = 42;
-- Router computes shard, sends one query, gets one result.استعلامات التوزيع على الأجزاء
من دون مفتاح الجزء، يستعلم الموجّه من كل جزء ثم يدمج النتائج:
-- WHERE status = 'paid' — no user_id
SELECT * FROM orders WHERE status = 'paid' ORDER BY created_at DESC LIMIT 100;
-- Must query all N shards, merge results, sort, take top 100.التجميع الموزّع على الأجزاء
بالنسبة إلى COUNT وSUM وAVG: احصل على النتائج الجزئية من كل جزء، ثم ادمجها في الموجّه أو التطبيق:
-- On each shard:
SELECT COUNT(*), SUM(total) FROM orders;
-- Aggregator:
final_count = SUM(counts), final_sum = SUM(sums)
-- AVG is trickier — need SUM and COUNT, can't average averages.عمليات JOIN عبر الأجزاء
إذا جرى تقسيم طرفي العملية حسب المفتاح نفسه (أي كانا متوضعين معًا)، تكون عملية JOIN محلية ضمن الجزء. وإلا فهي شبه مستحيلة على نطاق واسع.
الجداول المرجعية (مُنسخة إلى كل مكان)
تُنسخ جداول البحث الصغيرة إلى كل جزء، لذلك تبقى عمليات JOIN معها محلية. ويسميها Citus «الجداول المرجعية».
تجنب الأنماط التي تعبر الأجزاء
حيل في تصميم المخطط:
- إزالة التطبيع — كرّر بيانات الأصل داخل الجزء الذي يحتوي على العنصر التابع
- استخدم مفتاح الجزء في كل مكان — حتى عندما يبدو «غير ضروري»
- احسب التقارير مسبقًا في قاعدة بيانات تحليلات منفصلة
ترقيم الصفحات عبر الأجزاء
يُعد استخدام OFFSET 1000 LIMIT 10 عبر أجزاء متعددة سيئًا للغاية — إذ يجب على كل جزء إنتاج 1010 صفوف. استخدم ترقيم الصفحات القائم على المفتاح بدلًا من ذلك.
المعاملات الموزّعة
ينسّق الالتزام ذو المرحلتين (2PC) عمليات الالتزام الذرية عبر الأجزاء. وهو بطيء وهش عند حدوث انقسام في الشبكة. عمليًا، صمّم النظام لاستخدام أنماط «saga»:
// Saga pattern (conceptual):
// 1. Local TX on shard A: mark as pending, log
// 2. RPC to shard B: do its part
// 3. Local TX on shard A: mark as committed
// 4. On failure: compensating transactionsالأجزاء الساخنة
يمكن لمستخدم مشهور أو منتج واسع الانتشار أن يركّز حركة المرور على جزء واحد، مما يقضي على فائدة التوسع. اكتشف هذه الحالة وقسّم الجزء إلى أجزاء فرعية أو انقله.
المفاتيح الخارجية عبر الأجزاء
لا تمتد المفاتيح الخارجية في RDBMS عبر الأجزاء. لذلك تفرض التكامل المرجعي في التطبيق، أو تقبل الاتساق النهائي للعلاقات بين الأجزاء.
مراجعة
تنقل التجزئة الصعوبة من «توسيع نطاق الكتابة» إلى «صياغة الاستعلامات بحيث تبقى محلية ضمن الجزء».
- الاستعلامات ضمن جزء واحد سريعة
- التوزيع على الأجزاء بطيء
- أزل التطبيع لإبقاء العمل محليًا
- استخدم الجداول المرجعية للأبعاد المشتركة
- استخدم أنماط saga بدلًا من 2PC
تحقق سريع
لماذا يكون SELECT الذي لا يتضمن مفتاح الجزء في WHERE مكلفًا في قاعدة بيانات مجزأة؟
الأسئلة الشائعة
هل درس «الاستعلامات بين الأقسام: المشكلة الصعبة» مجاني؟
نعم — نص درس «الاستعلامات بين الأقسام: المشكلة الصعبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «الاستعلامات بين الأقسام: المشكلة الصعبة»؟
افهم سبب كون عمليات الربط والمعاملات بين الأقسام أصعب مشكلة في قواعد البيانات الموزعة، وتعرّف على الأنماط التي تقللها إلى أدنى حد تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الاستعلامات بين الأقسام: المشكلة الصعبة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استراتيجيات التقسيم: النطاق والتجزئة والدليل
- الاستعلامات بين الأقسام: المشكلة الصعبة
- Citus وPostgres الموزع
- متى لا تستخدم التقسيم