كيف يمكنك تصميم المخطط بكفاءة استعلام متداخلة العناصر في قيمة المفتاح قاعدة البيانات ؟

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

سؤال

أنا باستخدام Mnesia مع إرلانج ، ولكن هذا السؤال ينطبق على أي مفتاح القيمة db مثل couchdb ، إلخ.

أحاول التحرر من RDBMS عملية التفكير, لكن لا أستطيع التفاف رأسي حول كيفية بكفاءة تنفيذ هذا النوع من المخطط.

أقول لدي سجل المستخدم ، وله العديد من SubItemA السجلات التي العديد من البند الفرعي ب السجلات بحيث:

User
-SubItem A
--SubItem B
...

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

لقد سمعت من بعض الناس باستخدام البيانات الازدواجية في ذلك البيانات على حد سواء متداخلة منفصلة ، هذا مثير للسخرية أو أن هذا في الواقع مفيدة في بعض الحالات ؟

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

المحلول

السؤال الأساسي هو ، عندما يتم أداء جيدة بما فيه الكفاية?

الجدول-المسح قاموس المستخدم ليس زيادة مفرطة إذا كنت حقا بحاجة إلى دراسة كل البند الفرعي ب بالتفصيل حجم B يهيمن على مجمل حجم القاموس.

إذا كان هذا لا يكفي ، وتطبيع ذلك حتى تتمكن من تجنب القراءة في جميع المستخدم البند الفرعي بيانات الأمام عندما كنت الاستعلام عن البند الفرعي باء.استخدام مركب الرئيسية مثل (UserId, SubItemAId, SubItemBId) في البند الفرعي ب القاموس إذا كان الجدول هو أمر لذلك يمكنك أن تفعل مجموعة من الاستفسارات.

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

نصائح أخرى

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

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

مثال على خريطة وظيفة:

function(doc) {
    for(var i in doc.subitems_a) {
        var subitem_a = doc.subitems_a[i];

        for(var j in doc.subitems_a[item_a].subitems_b) {
            var subitem_b = subitem_a.subitems_b[j];

            emit(subitem_b, doc)
        }
    }
}

هذا هو فعال فهرسة إدراج البند الفرعي Bs ثم يمكنك قص و لصق من القائمة كما يمكنك اختيار.

في الحقيقة هذا يعتمد على قاعدة البيانات الذي تستخدمه أعتقد.في CouchDB شيء واحد سوف تعمل على نحو أفضل في حين Mnesia شيء آخر سيكون أفضل.يجب أن التقسيم شارد البيانات ؟ على ما هي المعايير التي يجب أن تفعل ذلك ؟ كم البيانات الازدواجية بما فيه الكفاية ؟

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

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