2012-11-30 10 views
10

100,000 मित्रों के साथ नीचे प्रतिस्पर्धी स्कीमा को देखते हुए मुझे अपनी ज़रूरतों के लिए सबसे अधिक कुशलता प्राप्त करने में दिलचस्पी है।MongoDB एम्बेडेड बनाम सरणी उप दस्तावेज़ प्रदर्शन

Doc1 (user_id पर सूचकांक)

{ 
"_id" : "…", 
"user_id" : "1", 
friends : { 
    "2" : { 
     "id" : "2", 
     "mutuals" : 3 
    } 
    "3" : { 
     "id" : "3", 
     "mutuals": "1" 
    } 
    "4" : { 
     "id" : "4", 
     "mutuals": "5" 
    } 
} 
} 

Doc2 (यौगिक बहु user_id & friends.id पर कुंजी सूचकांक)

{ 
"_id" : "…", 
"user_id" : "1", 
friends : [ 
    { 
     "id" : "2", 
     "mutuals" : 3 
    }, 
    { 
     "id" : "3", 
     "mutuals": "1" 
    }, 
    { 
     "id" : "4", 
     "mutuals": "5" 
    } 
]} 

मैं पर किसी भी जानकारी मिल नहीं कर पा रहे उप क्षेत्र पुनर्प्राप्ति की दक्षता। मुझे पता है कि मोंगो बीएसओएन के रूप में आंतरिक रूप से डेटा लागू करता है, इसलिए मैं सोच रहा हूं कि इसका मतलब प्रक्षेपण लुकअप एक बाइनरी ओ (लॉग एन) है?

विशेष रूप से, उपयोगकर्ता_आईडी को यह पता लगाने के लिए दिया गया है कि दोस्त_आईडी वाला कोई मित्र मौजूद है, प्रत्येक स्कीमा पर दो अलग-अलग प्रश्न कैसे तुलना करेंगे? (उपर्युक्त इंडेक्स मानते हैं) ध्यान दें कि इससे वास्तव में कोई फर्क नहीं पड़ता कि क्या लौटाया गया है, केवल अगर मित्र मौजूद है तो शून्य नहीं लौटाया जाता है।

Doc1col.find({user_id : "…"}, {"friends.friend_id"}) 
Doc2col.find({user_id : "…", "friends.id" : "friend_id"}, {"_id":1}) 

ब्याज की बात यह है कि $ सेट संशोधक कैसे काम करता है। स्कीमा 1 के लिए, Doc1col.update({user_id : "…"}, {"$set" : {"friends.friend_id.mutuals" : 5}) क्वेरी दी गई है, दोस्तों पर लुकअप कैसे करता है .friend_id काम करता है? क्या यह एक ओ (लॉग एन) ऑपरेशन है (जहां एन दोस्तों की संख्या है)?

स्कीमा 2 के लिए, क्वेरी Doc2col.update({user_id : "…", "friends.id" : "friend_id"}, {"$set": {"friends.$.mutuals" : 5}) उपर्युक्त की तुलना कैसे करेगी?

+3

सरणी शैली (Doc2) के साथ जाएं क्योंकि गतिशील कुंजी लगभग सही दृष्टिकोण नहीं हैं। साथ ही, स्मार्ट कोट्स का उपयोग न करें (यह कानूनी वाक्यविन्यास नहीं है और इसे पढ़ना मुश्किल है)। – JohnnyHK

+1

मुझे लगता है कि डॉक 2 अतिरिक्त स्टोरेज के कुछ बाइट्स की तरह उपयोग करेगा, लेकिन @ जॉनीनीएचके का कहना है कि डॉक 1 वास्तव में एक अच्छा दृष्टिकोण नहीं है, मुझे डॉक 1 का उपयोग करने वाले लोगों की संख्या पर भरोसा करें, फिर उन्हें एहसास है कि उन्हें कुछ भी करने के लिए डॉक 2 पर जाना है उनकी स्कीमा के साथ ... – Sammaye

+0

सलाह के लिए धन्यवाद। @ सैमये डॉक 2 कुछ बाइट्स अतिरिक्त स्टोरेज का उपयोग क्यों करेगा? क्या आप इंडेक्स का जिक्र कर रहे हैं? बीटीडब्ल्यू स्मार्ट उद्धरण प्रतिलिपि पेस्ट –

उत्तर

1

doc1 बेहतर है अगर किसी की प्राथमिक आवश्यकताएं एक अच्छी प्रबंधनीय पैकेज में ui को डेटा प्रस्तुत करना है। इसकी एक प्रक्षेपण {}, {friends.2 : 1}

doc2 अपने सबसे मजबूत मुकाबला नहीं है का उपयोग करते हुए केवल वांछित डेटा को फ़िल्टर करने के बाद आपके उपयोग के मामले के बारे में परिणाम नोट कि यह वास्तव में बात नहीं क्या लौटाई गई और अनुक्रमण तेज़ हो जाएगी लाने नहीं है परवाह नहीं करता सरल ।

कि doc2 के शीर्ष पर

अधिक स्वच्छ वाक्य रचना

db.doc2.findOne({user_id: 1, friends.id : 2}) 

बनाम

db.doc1.findOne({ $and : [{ user_id: 1 }, { "friends.2" : {$exists: true} }] }) 
एक अंतिम नोट पर

परमिट, हालांकि, एक doc1 पर एक sparse index बना सकते हैं (और $ मौजूद है का उपयोग), लेकिन 100,000 दोस्तों की आपकी संभावना - प्रत्येक मित्र को एक स्पैस इंडेक्स की आवश्यकता होती है - वह बेतुका बनाता है। प्रविष्टियों की एक उचित संख्या के विरोध में जनसांख्यिकी लिंग [पुरुष, मादा], आयु समूह [0-10,11-16,25-30, ..] या अधिक चीजें [जीन, व्हिस्की, वोदका, ...]

संबंधित मुद्दे