MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

nosql (मोंगोडब और नेवला) के साथ कई से कई संबंध

इसके विपरीत, समाधान 1 और 2 आपकी सबसे अच्छी शर्त है। समाधान 3 पर विचार किया जा सकता है जब अद्यतन/निर्माण आवृत्ति परियोजनाओं और उपयोगकर्ताओं की पढ़ने की आवृत्ति की तुलना में बहुत कम होती है, भले ही अद्यतन/बनाने के लिए, इसके लिए दो प्रश्नों की आवश्यकता होती है, इसके लिए पढ़ने में आसानी होगी।

समाधान 1 और 2 में से चुनने के लिए, आपको पठन आवृत्तियों पर विचार करने की आवश्यकता है। क्या आपको किसी उपयोगकर्ता की परियोजनाओं या किसी परियोजना के उपयोग की अधिक बार आवश्यकता होगी और उसके अनुसार चुनें। यदि आपको लगता है कि दोनों अपेक्षाकृत समान आवृत्ति के हैं, तो उपयोगकर्ता ऑब्जेक्ट को जितना संभव हो उतना कम क्लस्टर रखना बेहतर है। आप जो भी विकल्प चुनते हैं, एक index रखने पर विचार करें _id . को संग्रहीत करने वाली सरणी पर s (परियोजनाओं या उपयोगकर्ताओं की)।

उदाहरण के लिए।

userSchema = new Schema(
            {//otherstuff
               project_ids: [{type: Schema.Types.ObjectId, ref: 'Project'}})
              ...
            }) 
userSchema.index({'project_ids':1})

या

projectSchema = new Schema(
            {//otherstuff
               user_ids: [{type: Schema.Types.ObjectId, ref: 'User'}})
              ...
            }) 
projectSchema.index({'user_ids':1})

_id . की सरणी पर अनुक्रमणिका रखना आपके प्रश्नों की गति में उस तरफ बहुत सुधार करेगा जहां आपको डर है कि बहुत अधिक ओवरहेड होगा।

लेकिन index रखें केवल अगर यह संबंध एक महत्वपूर्ण संबंध है जिसमें बहुत सारे प्रश्न चल रहे हैं। यदि यह आपके प्रोजेक्ट की केवल एक अतिरिक्त विशेषता है, तो आप without कर सकते हैं एक सूचकांक भी।

यदि उपयोगकर्ता बहुत सी चीजें कर सकता है और उसके बहुत सारे संबंध हैं, तो आपको उस उपयोगकर्ता ऑब्जेक्ट की लगातार अपने ऐप में आवश्यकता होगी, इसलिए यदि आपका ऐप प्रोजेक्ट विशिष्ट नहीं है, तो बेहतर होगा कि प्रोजेक्ट आईडी को उपयोगकर्ता स्कीमा में न डालें . लेकिन जैसा कि हम सिर्फ आईडी डाल रहे हैं, वैसे भी यह बहुत अधिक नहीं है। इसके बारे में चिंता करने की कोई जरूरत नहीं है।

दोनों सरणियों पर रेग इंडेक्स:हाँ, आप संभोग कर सकते हैं। लेकिन जब आप समाधान 3 के लिए जाते हैं, तो आपको किसी इंडेक्स की बिल्कुल भी आवश्यकता नहीं होती है क्योंकि आप किसी उपयोगकर्ता की परियोजनाओं की सूची या किसी प्रोजेक्ट में उपयोगकर्ताओं की सूची प्राप्त करने के लिए कोई प्रश्न नहीं करेंगे। समाधान 3 पढ़ना बहुत आसान बनाता है लेकिन लिखना थोड़ा बोझिल है। लेकिन जैसा कि आपने उल्लेख किया है कि आपके उपयोग के मामले में reading>>writing शामिल है , समाधान 3 के साथ जाएं लेकिन डेटा असंगति का खतरा हमेशा बना रहता है जिसका आपको ध्यान रखने की आवश्यकता है।

अनुक्रमण सिर्फ चीजों को तेज करता है। डॉक्स के माध्यम से जाओ और थोड़ा गुगली करो। कुछ भी काल्पनिक नहीं। अनुक्रमित सरणियों पर क्वेरी करना सामान्य सरणियों की तुलना में कुशल है। पूर्व के लिए। मान लें कि आप समाधान 2 का उपयोग करते हैं। प्रोजेक्ट आईडी को project_ids फ़ील्ड में संग्रहीत करें।

आप उपयोगकर्ता की परियोजनाओं को आसानी से प्राप्त कर सकते हैं। यह सीधे आगे है।

लेकिन प्रोजेक्ट 1 के उपयोगकर्ता प्राप्त करने के लिए। आपको इस तरह की एक क्वेरी की आवश्यकता है।

User.find({project_ids:project._id},function(err,docs){
     //here docs will be the list of the users of project1
})
//The above query might be slow if the user base is large. 
//But it can be improved vastly by indexing the project_ids field in the User schema.

समाधान 1 के लिए सिमिलरी। प्रत्येक प्रोजेक्ट में user_ids फ़ील्ड है। मान लें कि हमारे पास एक user1 है। उपयोगकर्ता की परियोजनाओं को प्राप्त करने के लिए हम निम्नलिखित क्वेरी करते हैं

Project.find({user_ids:user1._id},function(err,docs){
      //here docs will be the projects of user1
      //But it can be improved vastly by indexing the user_ids field in the Project schema.

यदि आप समाधान 1 बनाम समाधान 2 पर विचार कर रहे हैं, तो मुझे लगता है कि समाधान 1 बेहतर है। ऐसे मामले हो सकते हैं जहां आपको उसकी परियोजनाओं के बिना उपयोगकर्ता की आवश्यकता हो लेकिन उपयोगकर्ताओं के बिना परियोजना की आवश्यकता की संभावना बहुत कम है। लेकिन यह आपके सटीक उपयोग के मामले पर निर्भर करता है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB 4.2 विक्रेता लॉकिन के बिना प्रबंधन और निगरानी

  2. किसी नेस्टेड सरणी से $pull और $[identifier] (mongoDB 3.6) के साथ किसी ऑब्जेक्ट को निकालें

  3. MongoDB में CSV को संग्रह कैसे निर्यात करें?

  4. मोंगोडीबी $ लुकअप ऑब्जेक्टिड खाली सरणी प्राप्त करें?

  5. मोंगो डीबी एक प्रमुख क्षेत्र के आधार पर उच्चतम मूल्य वाले सभी रिकॉर्ड ढूंढता है