كيفية الحفاظ على العودية ثابتة في الخلية قاعدة البيانات ؟

StackOverflow https://stackoverflow.com/questions/20426

سؤال

لدي شجرة المشفرة في قاعدة بيانات MySQL كما الحواف:

CREATE TABLE items (
    num INT,
    tot INT,
    PRIMARY KEY (num)
    );
CREATE TABLE tree (
    orig INT,
    term INT
    FOREIGN KEY (orig,term) REFERENCES items (num,num)
    )

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

UPDATE items SET tot = (
    SELECT SUM(b.tot) FROM
        tree JOIN items AS b
        ON tree.term = b.num 
        WHERE tree.orig=items.num)
    WHERE EXISTS 
        (SELECT * FROM tree WHERE orig=items.num)

(ملاحظة هذا في الواقع لا يعمل ولكن هذا ليس موضوعنا)

افترض أن قاعدة البيانات موجودة و ثابتة راضيا بالفعل.

السؤال هو:

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

بعض الأفكار لدي:

  • كامل إبطال بعد أي تحديث حساب كل شيء (أم...لا)
  • مجموعة الزناد على بنود جدول تحديث الوالدين من أي صف هو تحديث
    • هذا من شأنه أن يكون العودية (تشغيل تحديثات تحديثات الزناد التحديثات،...)
    • لم ينجح الخلية لا يمكن تحديث الجدول الذي انطلقت الزناد
  • مجموعة الزناد إلى جدولة تحديث الوالد من أي صف هو تحديث
    • هذا من شأنه أن تكون تكرارية (الحصول على البند من جدول تجهيز جداول المزيد من العناصر)
    • ما جزاء هذا ؟ الثقة رمز العميل للحصول على ذلك الحق ؟
    • ميزة هو أنه إذا كان التحديثات أمر بشكل صحيح أقل مبالغ تحتاج إلى أن يكون جهاز الكمبيوتر.ولكن هذا الطلب هو اختلاط في نفسه.

الحل المثالي أن التعميم إلى أخرى "يبلغ الثوابت"

FWIW أعلم أن هذا هو "قليلا من فوق", لكن أنا أفعل ذلك من أجل المتعة (متعة:الفعل إيجاد المستحيل من يفعل ذلك.:-)

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

المحلول

المشكلة كنت تواجه واضح ، العودية في SQL.تحتاج إلى الحصول على الوالد من الأم...ورقة والتحديثات إجمالي (إما بطرح القديم و الجديد إضافة أو recomputing).تحتاج بعض شكل من المعرف أن ترى هيكل الشجرة ، والاستيلاء على جميع من العقد الأطفال وقائمة الوالدين/مسار ورقة إلى تحديث.

يضيف هذا الأسلوب المستمر الفضاء (2 أعمدة إلى الجدول الخاص بك --ولكن تحتاج فقط جدول واحد أو آخر يمكنك الانضمام في وقت لاحق).لقد لعبت حوالي مع هيكل لحظة قبل أن تستخدم في شكل هرمي باستخدام "يسار" و "يمين" الأعمدة (من الواضح أن لا تلك الأسماء) ، وتحسب من قبل النظام اجتياز مرحلة ما بعد النظام اجتياز على التوالي-لا تقلق هذه لا تحتاج إلى أن يكون حساب في كل مرة.

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

نصائح أخرى

أنا لست متأكدا من أنني أفهم سؤالك بشكل صحيح, ولكن هذا يمكن أن يعمل بلدي يأخذ على الأشجار في SQL.

ربط وظيفة وصف طريقة تخزين شجرة في قاعدة البيانات -- كيو في هذه الحالة-ولكن الطريقة غير واضحة بما فيه الكفاية بحيث يمكن اعتمادها بسهولة في أي قاعدة بيانات.

مع هذا الأسلوب يمكنك بسهولة تحديث كافة العقد تعتمد على تعديل عقده K مع حوالي N بسيطة يختار الاستفسارات حيث N هو المسافة من K من عقدة الجذر.

أتمنى أن الشجرة ليست عميقة حقا :).

حظا سعيدا!

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