0Pricing
SQL Interview Prep · درس

تجنب التكرار اللانهائي

اكتشاف الدورات وحدود العمق وحارس التكرار الذي يتحقق منه كل مسؤول مقابلة

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

السؤال الكامن وراء السؤال

بعد كتابة CTE عودية، قد يطرح المحاور المتمرس سؤالًا حاسمًا: "ماذا يحدث إذا احتوت البيانات على دورة؟" يختبر هذا ما إذا كنت تفهم أن العودية قد تستمر إلى الأبد — وما إذا كنت تعرف كيفية الحماية منها.

تحدث الدورة عندما تعود البنية الهرمية إلى نفسها: يرفع A تقاريره إلى B، ويرفع B تقاريره إلى A. وسيستمر العضو العودي الساذج في التناوب بينهما إلى ما لا نهاية.

كيف تتكوّن دورة

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

عندما يصادف العضو العودي عقدة سبق أن زارها، فإنه ينتج تلك العقدة مرة أخرى، فتُفعّل أبناءها من جديد، ولا تفرغ الحلقة أبدًا. ولا تتوقف العودية إلا عندما تُرجع إحدى الخطوات أي صفوف؛ وتضمن الدورة أن تُرجع الخطوة صفوفًا دائمًا.

آلية الحماية 1: حد للعمق

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

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

WITH RECURSIVE org 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, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
    WHERE o.depth < 50
)
SELECT * FROM org;

آلية الحماية 2: مسار العقد التي تمت زيارتها

تتتبّع آلية الحماية الدقيقة مسار العقد التي تمت زيارتها، وترفض الدخول مجددًا إلى عقدة موجودة فيه. اجمع المعرّفات في سلسلة نصية أو مصفوفة، وتحقّق من العضوية قبل متابعة العودية.

توقف هذه الآلية الدورات بدقة، مع السماح بعمق غير محدود في الأشجار السليمة.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id,
           CAST(',' || id || ',' AS VARCHAR(2000)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id,
           o.path || e.id || ','
    FROM employees e JOIN org o ON e.manager_id = o.id
    WHERE o.path NOT LIKE '%,' || e.id || ',%'
)
SELECT id, name, path FROM org;

لماذا ينجح التحقق من المسار

يعني الشرط path NOT LIKE '%,' || e.id || ',%' "اتبع هذه الحافة فقط إذا لم يكن معرّف الابن موجودًا مسبقًا في المسار". وتعمل الفواصل كمحددات حتى لا يطابق المعرّف 1 خطأً جزءًا من المعرّف 15.

إذا كانت الدورة ستعيد زيارة عقدة، فسيستبعد WHERE ذلك الصف، وسيُرجع العضو العودي لا شيء في النهاية، وتنتهي العودية بشكل سليم.

آلية الحماية 3: عبارة CYCLE الأصلية

يوفر Postgres الحديث (14+) ومعيار SQL عبارة CYCLE مضمّنة تعمل تلقائيًا على فحص المسار والإبلاغ عن الدورات. وهذه أنظف إجابة عندما يدعمها المحرك.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e JOIN org o ON e.manager_id = o.id
)
CYCLE id SET is_cycle USING cycle_path
SELECT id, name, is_cycle FROM org;

MAXRECURSION في SQL Server

يفرض SQL Server حدًا افتراضيًا قدره 100 مستوى من العودية. إذا تجاوزت دورة أو شجرة عميقة هذا الحد، يفشل الاستعلام بدلًا من الاستمرار إلى الأبد — وهذا يمثل صمام أمان ضمنيًا.

يمكنك رفع الحد أو إزالته باستخدام OPTION (MAXRECURSION n)، حيث تعني القيمة 0 عدم وجود حد. لكن إزالة الحد دون استخدام حارس للمسار تعيد خطر الحلقة اللانهائية عند وجود بيانات دورية.

-- Cap recursion at 200 levels in SQL Server
SELECT * FROM org
OPTION (MAXRECURSION 200);

اكتشاف الدورات ومنعها

قد يميّز المحاورون بين هدفين:

  • المنع — تخطّي الحافة الدورية بصمت حتى يكتمل الاستعلام، وذلك باستخدام شرط WHERE لفحص المسار.
  • الاكتشاف والإبلاغ — إظهار الصفوف التي تشكل جزءًا من دورة حتى يتمكن فريق البيانات من إصلاح البيانات الخاطئة، وذلك باستخدام علامة is_cycle في عبارة CYCLE.

إن معرفة الطريقتين ومتى تكون كل منهما مناسبة تمييز على مستوى المطورين ذوي الخبرة.

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

قد تكون العودية مكلفة حتى في غياب الدورات. ومن النصائح التي يحب المحاورون سماعها:

  • أنشئ فهرسًا على عمود الربط، مثل manager_id، حتى يكون الربط سريعًا في كل تكرار.
  • طبّق التصفية مبكرًا في نقطة الارتكاز لتهيئة الفرع المطلوب فقط، بدلًا من الجدول بأكمله.
  • تجنّب SELECT * — واحتفظ فقط بالأعمدة التي تتطلبها العودية، إضافةً إلى depth/path.

قالب آمن

اجمع آليات الحماية في قالب يمكنك إعادة إنتاجه تحت الضغط: اجعل عمود العمق شبكة أمان، وفحص المسار الحارس الدقيق. وحتى إذا كانت إحدى الآليتين زائدة عن الحاجة في البيانات النظيفة، فإن إظهار كلتيهما يدل على الدقة.

WITH RECURSIVE walk AS (
    SELECT id, parent_id, 1 AS depth,
           CAST(',' || id || ',' AS VARCHAR(4000)) AS path
    FROM nodes WHERE parent_id IS NULL
    UNION ALL
    SELECT n.id, n.parent_id, w.depth + 1,
           w.path || n.id || ','
    FROM nodes n JOIN walk w ON n.parent_id = w.id
    WHERE w.depth < 100
      AND w.path NOT LIKE '%,' || n.id || ',%'
)
SELECT id, depth FROM walk;

أخطاء شائعة في المقابلات

أخطاء أخيرة يجب تجنبها:

  • إزالة MAXRECURSION في SQL Server دون أي حارس آخر — فهذا يعيد فتح خطر الحلقة اللانهائية.
  • تعريف عمود سلسلة المسار بطول قصير جدًا، مما يسبب اقتطاعه ويؤدي إلى تعطل الحارس دون ظهور خطأ.
  • مطابقة المعرّفات دون فواصل، بحيث يطابق المعرّف 1 خطأً جزءًا من المعرّف 21.
  • افتراض أن البيانات خالية من الدورات لمجرد أنه "يُفترض" أن تكون كذلك — اطرح السؤال دائمًا.

تحقق سريع

اختر آلية الحماية التي توقف الدورات بدقة دون وضع حد أقصى للعمق السليم.

الخلاصة

ينبغي أن تتناول كل إجابة تستخدم CTE عودية جانب الأمان:

  • تجعل الدورات العضو العودي لا يُرجع نتيجة فارغة أبدًا، ولذلك لا تتوقف العودية.
  • حد العمق = شبكة أمان سريعة؛ فحص المسار الذي تمت زيارته = منع دقيق للدورات؛ عبارة CYCLE = اكتشاف أصلي في المحركات الحديثة.
  • يُعد MAXRECURSION 100 في SQL Server صمامًا ضمنيًا — فلا تزلْه دون استخدام حارس آخر.
  • أنشئ فهرسًا على عمود الربط، وابدأ بنطاق ضيق لتحسين الأداء.

يمكنك الآن كتابة CTEs عودية واجتيازها وإنشاء البيانات وحمايتها من البداية إلى النهاية.

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

هل درس «تجنب التكرار اللانهائي» مجاني؟

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

ماذا ستتعلم في «تجنب التكرار اللانهائي»؟

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

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

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

كم من الوقت يستغرق درس «تجنب التكرار اللانهائي»؟

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

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

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

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

  1. الأعضاء الأساسيون والتكراريون
  2. التنقل في المخطط التنظيمي
  3. إنشاء سلاسل الأرقام والتواريخ
  4. تجنب التكرار اللانهائي
← العودة إلى SQL Interview Prep