سؤال

كيف يمكنني حساب عمق العقدة في نموذج الوالدين والطفل تحت MySQL؟

سأحتاج إلى عمق، من بين أمور أخرى، إنشاء المسافة البادئة في قائمتي (مشفرة مع PHP).

هل كانت مفيدة؟

المحلول 2

قد يكون هذا سؤالا قديما، لكنني أريد فقط السماح للآخرين بأنهم عرفوا أنه وجد حل منذ بضعة أشهر. لقد اكتبت مؤخرا عن ذلك هنا: http://en.someotherdeveloper.com/articles/adjacency-list-model-with-depth-calculation/

نصائح أخرى

هذا يعتمد على التنفيذ الفعلي للتسلسل الهرمي الخاص بك في قاعدة البيانات. إذا كنت تستخدم نموذج مجموعات متداخلة (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) يمكنك استرداد مسار الوالدين الكامل إلى الطفل عبر اختيار واحد.

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

SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
  FROM nodes AS n1
  JOIN nodes AS n2 ON n2.parent_id = n1.id
  JOIN nodes AS n3 ON n3.parent_id = n2.id
  ...
  JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;

نظرا لأنك تعلم أن عقدةك موجودة على المستوى n ليست هناك حاجة إلى joints اليسار، وبالنظر إلى الفهارس المناسبة على المعرف / Parent_id يجب أن يكون هذا سريعا بشكل معقول.
الجانب السلبي لهذا النهج هو أنه يجب عليك الاحتفاظ بمستوى العقدة المحدث أثناء تحركات العقدة، ولكن يجب أن تكون واضحة بشكل معقول وبسرعة كما تفعل ذلك فقط من أجل العقدة نفسها وأطفالها - وليس لأغلبية الجدول كنت تفعل مع مجموعات متداخلة.

إذا كنت تريد فقط نسخ المعجون هنا هو مثالي. لدي مشاريع الجدول مع معرف و Falt_id.

DELIMITER $$
DROP FUNCTION IF EXISTS `getDepth` $$
CREATE FUNCTION `getDepth` (project_id INT) RETURNS int
BEGIN
    DECLARE depth INT;
    SET depth=1;

    WHILE project_id > 0 DO
        SELECT IFNULL(parent_id,-1) 
        INTO project_id 
        FROM ( SELECT parent_id FROM Projects WHERE id = project_id) t;

        IF project_id > 0 THEN
            SET depth = depth + 1;
        END IF;

    END WHILE;

    RETURN depth;

END $$
DELIMITER ;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top