0Pricing
SQL Academy · درس

حدود الربط الذاتي

متى تحتاج إلى التكرار بدلًا منه

حدود الربط الذاتي درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما المقصود بالربط الذاتي؟

يحدث الربط الذاتي عندما يُربط جدول بنفسه. ويفيد ذلك في مقارنة الصفوف داخل الجدول نفسه، مثل العثور على الموظفين ومديريهم المخزنين في جدول employees واحد.

قبل استكشاف حدوده، لنتذكر كيفية عمل الربط الذاتي الأساسي عمليًا.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

مستوى واحد

يتعامل الربط الذاتي بأناقة مع خطوة واحدة في التسلسل الهرمي. فإذا أردتم إقران كل موظف بمديره المباشر، فستحتاجون إلى ربط ذاتي واحد فقط.

يعمل هذا بشكل مثالي عندما تكون بياناتكم في مستوى واحد فقط، أو عندما تهتمون بالعلاقات المباشرة بين الأصل والفرع فحسب.

SELECT child.name AS employee, parent.name AS direct_manager
FROM employees child
LEFT JOIN employees parent ON child.manager_id = parent.id;

مستويان: بداية التعقيد

ماذا لو احتجتم إلى الموظفين ومديريهم ومديري مديريهم؟ يجب أن تضيفوا ربطًا ذاتيًا ثانيًا. عندها يكبر الاستعلام وتصبح قراءته أصعب.

يتطلب كل مستوى إضافي في التسلسل الهرمي اسمًا مستعارًا إضافيًا للربط وعبارة JOIN إضافية.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

ثلاثة مستويات: انهيار النمط

تؤدي إضافة مستوى ثالث إلى فرض ربط آخر. وبحلول ذلك الوقت يصبح الاستعلام مطولًا وهشًا وصعب الصيانة. وإذا تغيّر عمق التسلسل الهرمي، فعليكم إعادة كتابة الاستعلام بأكمله.

هذا هو أول حد كبير للربط الذاتي: فهو لا يتوسع مع زيادة العمق.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager,
       ggm.name AS great_grand_manager
FROM employees e
LEFT JOIN employees m   ON e.manager_id = m.id
LEFT JOIN employees gm  ON m.manager_id = gm.id
LEFT JOIN employees ggm ON gm.manager_id = ggm.id;

عمق غير معروف: لا يستطيع الربط الذاتي المساعدة

في المخططات التنظيمية أو أشجار الفئات الواقعية، يكون العمق غالبًا غير معروف وقت تنفيذ الاستعلام. يتطلب الربط الذاتي تحديد عدد المستويات مسبقًا في الاستعلام. فإذا أصبح التسلسل الهرمي غدًا بعمق 10 مستويات، فسيفوّت استعلام الربط الذاتي ذي المستويات الثلاثة البيانات بصمت.

هذا قيد أساسي: لا يستطيع الربط الذاتي اجتياز عدد اعتباطي من المستويات.

-- This only retrieves up to 3 levels deep.
-- Employees deeper than level 3 are simply missing from results.
SELECT e.name, m.name, gm.name
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

الدورات تكسر الربط الذاتي تمامًا

هناك قيد خطير آخر: إذا احتوت البيانات على دورة (يدير A‏، ويدير B‏، ويدير C‏، ثم يدير C‏ A)، فلن يدور استعلام الربط الذاتي إلى ما لا نهاية، لكنه لن يكتشف الدورة أو يبلغ عنها بشكل صحيح أيضًا.

لا يمكنكم الحماية من المراجع الدائرية باستخدام عمليات الربط الذاتي العادية. أما الاستعلامات التكرارية فتتضمن آليات مدمجة لاكتشاف الدورات تفتقر إليها عمليات الربط الذاتي تمامًا.

-- Cyclic data: row 3 points back to row 1
-- id | name    | manager_id
--  1 | Alice   | 3   <-- cycle!
--  2 | Bob     | 1
--  3 | Charlie | 2

-- A self join just shows one hop; it cannot detect the loop
SELECT e.name, m.name AS reports_to
FROM employees e
JOIN employees m ON e.manager_id = m.id;

التعريف بتعبيرات الجداول الشائعة التكرارية

توفر SQL حلًا مخصصًا لاجتياز التسلسلات الهرمية ذات العمق غير المعروف: تعبير جدول شائع تكراري (CTE). ويستخدم صيغة WITH RECURSIVE التي تدعمها PostgreSQL وMySQL 8+ وSQLite وSQL Server.

يتكون تعبير الجدول الشائع التكراري من جزأين: الجزء الأساسي (الصفوف الابتدائية) والجزء التكراري (الخطوة التي تتبع كل علاقة).

WITH RECURSIVE org_tree AS (
  -- Anchor: start with the top-level CEO (no manager)
  SELECT id, name, manager_id, 1 AS depth
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  -- Recursive: find each employee whose manager is already in org_tree
  SELECT e.id, e.name, e.manager_id, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, depth FROM org_tree ORDER BY depth;

تتبع المسار الكامل

من الميزات القوية لتعبيرات الجداول الشائعة التكرارية إمكانية تجميع السياق أثناء التعمق. فعلى سبيل المثال، يمكنكم إنشاء المسار الكامل من الجذر إلى كل عقدة — وهو أمر مستحيل تمامًا باستخدام ربط ذاتي ثابت.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id,
         name AS path
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  SELECT e.id, e.name, e.manager_id,
         ot.path || ' > ' || e.name
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, path FROM org_tree ORDER BY path;

الربط الذاتي أم CTE التكراري: متى تختارون؟

استخدموا الربط الذاتي عندما:

  • تحتاجون إلى مستوى واحد أو مستويين فقط من التسلسل الهرمي.
  • يكون العمق ثابتًا ومعروفًا مسبقًا.
  • تريدون البساطة من دون أعباء CTE.

استخدموا تعبير جدول شائع تكراري عندما:

  • يكون العمق متغيرًا أو غير معروف.
  • تحتاجون إلى مسار الأصل الكامل أو مسار الفروع.
  • تريدون اكتشاف الدورات من خلال عبارة CYCLE أو باستخدام حواجز يدوية.

اعتبارات الأداء

تتميز عمليات الربط الذاتي على الأعمدة المفهرسة بسرعة فائقة في الاستعلامات ذات العمق الثابت. فكل عملية ربط هي عملية بحث واحدة، ويتعامل مُحسِّن قاعدة البيانات معها بكفاءة.

تتميز تعبيرات الجداول الشائعة التكرارية بمرونة أكبر، لكنها قد تكون مكلفة في الأشجار العميقة أو واسعة التفرع. أضيفوا دائمًا حارسًا لـحد العمق في الجزء التكراري لمنع الاستعلامات من الاستمرار بلا توقف بسبب بيانات تالفة أو دورات غير متوقعة.

WITH RECURSIVE org_tree 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, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
  WHERE ot.depth < 10   -- safety guard: stop at depth 10
)
SELECT name, depth FROM org_tree;

حالات استخدام واقعية تحتاج إلى التكرار

تتطلب العديد من نماذج البيانات الشائعة اجتيازًا بعمق اعتباطي لا يستطيع الربط الذاتي التعامل معه ببساطة:

  • أشجار الفئات — فئات المنتجات المتداخلة في كتالوج للتجارة الإلكترونية.
  • قائمة مكونات المنتج — منتج مكوّن من أجزاء، وكل جزء مكوّن من أجزاء فرعية.
  • سلاسل التعليقات — ردود على ردود على ردود.
  • مسارات نظام الملفات — أدلة داخل أدلة.

في جميع هذه الحالات، استخدموا تعبير جدول شائع تكراريًا بدلًا من تكديس عمليات الربط الذاتي.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, name AS full_path
  FROM categories
  WHERE parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         ct.full_path || ' / ' || c.name
  FROM categories c
  JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT id, name, full_path FROM category_tree ORDER BY full_path;

اختبار المعرفة

اختبروا مدى فهمكم لحدود الربط الذاتي ومتى تستخدمون تعبيرات الجداول الشائعة التكرارية بدلًا منه.

مراجعة الدرس

تعلّمتم في هذا الدرس حدود الربط الذاتي عند التعامل مع البيانات الهرمية:

  • يعمل الربط الذاتي جيدًا مع مستوى واحد أو مستويين ثابتين من التسلسل الهرمي.
  • يتطلب كل مستوى إضافي عبارة JOIN صريحة أخرى، مما يجعل الاستعلامات هشة وصعبة الصيانة.
  • لا يستطيع الربط الذاتي التعامل مع العمق غير المعروف — إذ تُستبعد الصفوف التي تتجاوز المستويات المحددة مسبقًا في الاستعلام بصمت.
  • لا يوفر حماية من المراجع الدورية في البيانات.
  • عندما يكون العمق متغيرًا أو غير معروف، استخدموا تعبير جدول شائع تكراري (WITH RECURSIVE) بدلًا منه.
  • أضيفوا دائمًا حارسًا للعمق في الاستعلامات التكرارية للحماية من التنفيذ المتواصل بلا توقف.

تُعد معرفة متى تنتقلون من الربط الذاتي إلى تعبير جدول شائع تكراري مهارة أساسية للاستعلام عن أي بيانات منظمة على شكل شجرة في SQL.

الأسئلة الشائعة

هل درس «حدود الربط الذاتي» مجاني؟

نعم — نص درس «حدود الربط الذاتي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «حدود الربط الذاتي»؟

متى تحتاج إلى التكرار بدلًا منه تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «حدود الربط الذاتي»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما هو الربط الذاتي
  2. الموظفون والمديرون
  3. مقارنة الصفوف في الجدول نفسه
  4. حدود الربط الذاتي
← العودة إلى SQL Academy