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

MongoDB - संबंध बनाएं

MongoDB में संबंध बनाने के लिए, या तो एक BSON दस्तावेज़ को दूसरे में एम्बेड करें, या किसी अन्य से संदर्भ लें।

MongoDB डेटाबेस रिलेशनल डेटाबेस के लिए अलग तरह से काम करते हैं। रिश्तों के बारे में भी यही सच है।

MongoDB में, आप निम्न दो विधियों में से किसी एक का उपयोग करके संबंध बना सकते हैं:

  • एम्बेडेड दस्तावेज़।
  • संदर्भित दस्तावेज़।

आपके द्वारा उपयोग की जाने वाली विधि डेटा पर निर्भर करेगी, और आप उस डेटा को कैसे क्वेरी करना चाहते हैं।

एम्बेडेड संबंध

MongoDB के साथ, आप दस्तावेज़ों के भीतर दस्तावेज़ एम्बेड कर सकते हैं। इसलिए, एक एकल दस्तावेज़ में अपने स्वयं के संबंध हो सकते हैं।

वास्तव में, जब हमने पहली बार कोई दस्तावेज़ बनाया था, तब हमने इस पद्धति का उपयोग करके पहले ही एक संबंध बना लिया था।

एक-से-एक संबंध

एक एक-से-एक संबंध वह जगह है जहां मूल दस्तावेज़ में एक बच्चा है, और बच्चे के पास एक माता-पिता है।

उदाहरण के लिए, एक व्यावसायिक नियम कह सकता है कि एक कलाकार का केवल एक ही पता हो सकता है और वह पता केवल एक कलाकार का हो सकता है।

निम्नलिखित कोड एक-से-एक संबंध बनाता है, जो दस्तावेज़ में अंतर्निहित है।

db.artists.insert(
    {
        _id : 2,
        artistname : "Prince",
        address :   {
                        street : "Audubon Road",
                        city : "Chanhassen",
                        state : "Minnesota",
                        country : "United States"
                    }
    }
)

परिणाम:

WriteResult({ "nInserted" : 1 })

एक-से-अनेक संबंध

एक एक-से-अनेक संबंध वह जगह है जहां मूल दस्तावेज़ में कई बच्चे दस्तावेज़ हो सकते हैं, लेकिन बच्चे के दस्तावेज़ों में केवल एक मूल दस्तावेज़ हो सकता है।

इसलिए, एक अन्य व्यावसायिक नियम यह कह सकता है कि एक कलाकार के पास कई एल्बम हो सकते हैं, लेकिन एक एल्बम केवल एक कलाकार से संबंधित हो सकता है।

निम्नलिखित कोड को चलाने से एक-से-अनेक संबंध बन जाएगा:

db.artists.insert(
    {
        _id : 3,
        artistname : "Moby",
        albums : [
                    {
                        album : "Play",
                        year : 1999,
                        genre : "Electronica"
                    }, 
                    {
                        album : "Long Ambients 1: Calm. Sleep.",
                        year : 2016,
                        genre : "Ambient"
                    }
                ]
    }
)

परिणाम:

WriteResult({ "nInserted" : 1 })

दस्तावेज़ संदर्भित संबंध

आप संबंध बनाने के लिए दस्तावेज़ संदर्भ का उपयोग कर सकते हैं। चाइल्ड दस्तावेज़ को पैरेंट दस्तावेज़ में एम्बेड करने के बजाय (जैसे हमने ऊपर किया था), आप चाइल्ड दस्तावेज़ को उसके स्वयं के स्टैंड अलोन दस्तावेज़ में अलग कर देते हैं।

तो हम यह कर सकते हैं:

मूल दस्तावेज़

db.artists.insert(
    {
        _id : 4,
        artistname : "Rush"
    }
)

बाल दस्तावेज़

हम 3 चाइल्ड दस्तावेज़ सम्मिलित करेंगे — प्रत्येक बैंड सदस्य के लिए एक:

db.musicians.insert(
    {
        _id : 9,
        name : "Geddy Lee",
        instrument : [ "Bass", "Vocals", "Keyboards" ],
        artist_id : 4
    }
)
db.musicians.insert(
    {
        _id : 10,
        name : "Alex Lifeson",
        instrument : [ "Guitar", "Backing Vocals" ],
        artist_id : 4
    }
)
db.musicians.insert(
    {
        _id : 11,
        name : "Neil Peart",
        instrument : "Drums",
        artist_id : 4
    }
)

रिश्ते के बारे में पूछताछ करना

उपरोक्त दो दस्तावेज़ों को सम्मिलित करने के बाद, आप $lookup . का उपयोग कर सकते हैं दो संग्रहों पर बाएं बाहरी जुड़ाव करने के लिए।

यह, aggregate() . के संयोजन में विधि, और $match आप जिस विशिष्ट कलाकार में रुचि रखते हैं उसे निर्दिष्ट करने के लिए, माता-पिता और बच्चे के दस्तावेज़ एक में लौटा देंगे।

db.artists.aggregate([
    {
      $lookup:
        {
          from: "musicians",
          localField: "_id",
          foreignField: "artist_id",
          as: "band_members"
        }
   },
   { $match : { artistname : "Rush" } }
]).pretty()

परिणाम:

{
	"_id" : 4,
	"artistname" : "Rush",
	"band_members" : [
		{
			"_id" : 9,
			"name" : "Geddy Lee",
			"instrument" : [
				"Bass",
				"Vocals",
				"Keyboards"
			],
			"artist_id" : 4
		},
		{
			"_id" : 10,
			"name" : "Alex Lifeson",
			"instrument" : [
				"Guitar",
				"Backing Vocals"
			],
			"artist_id" : 4
		},
		{
			"_id" : 11,
			"name" : "Neil Peart",
			"instrument" : "Drums",
			"artist_id" : 4
		}
	]
}

आप देख सकते हैं कि पहले दो क्षेत्र कलाकारों के संग्रह से हैं, और शेष क्षेत्र संगीतकारों के संग्रह से हैं।

इसलिए यदि आप केवल कलाकारों के संग्रह को ही क्वेरी करते हैं:

db.artists.find( { artistname : "Rush" } )

आपको केवल यही मिलेगा:

{ "_id" : 4, "artistname" : "Rush" }

कोई संबंधित डेटा वापस नहीं किया गया है।

एम्बेडेड दस्तावेज़ों बनाम संदर्भित दस्तावेज़ों का उपयोग कब करें

संबंध बनाने के दोनों तरीकों के अपने फायदे और नुकसान हैं। कई बार आप एम्बेडेड दस्तावेज़ों का उपयोग कर सकते हैं, और दूसरी बार आप संदर्भित दस्तावेज़ों का उपयोग करेंगे।

एम्बेडेड रिलेशनशिप का उपयोग कब करें

एम्बेडेड संबंध पद्धति का उपयोग करने के मुख्य लाभों में से एक प्रदर्शन है। जब संबंध दस्तावेज़ में एम्बेड किया जाता है, तो क्वेरीज़ एक से अधिक दस्तावेज़ों में फैले होने की तुलना में तेज़ी से चलेंगी। संबंधों को पुनः प्राप्त करने के लिए कई दस्तावेज़ों में शामिल होने के बजाय MongoDB को केवल एक दस्तावेज़ वापस करने की आवश्यकता है। यह एक प्रमुख प्रदर्शन को बढ़ावा दे सकता है - विशेष रूप से बहुत सारे डेटा के साथ काम करते समय।

एम्बेडेड संबंध भी प्रश्नों को लिखना आसान बनाते हैं। कई दस्तावेज़ों को उनके विशिष्ट पहचानकर्ता के माध्यम से जोड़ने वाली जटिल क्वेरी लिखने के बजाय, आप सभी संबंधित डेटा को एक ही क्वेरी में वापस कर सकते हैं।

ध्यान में रखने के लिए एक और विचार यह है कि, मोंगोडीबी केवल दस्तावेज़ स्तर पर परमाणुता सुनिश्चित कर सकता है। एक दस्तावेज़ में दस्तावेज़ अद्यतन हमेशा परमाणु होते हैं, लेकिन एकाधिक दस्तावेज़ों के लिए नहीं।

जब एक से अधिक उपयोगकर्ता डेटा एक्सेस कर रहे हों, तो हमेशा एक मौका होता है कि दो या दो से अधिक उपयोगकर्ता एक ही दस्तावेज़ को अलग-अलग डेटा के साथ अपडेट करने का प्रयास करेंगे। इस मामले में, MongoDB यह सुनिश्चित करेगा कि कोई विरोध न हो और एक समय में डेटा का केवल एक सेट अपडेट किया जाए। MongoDB कई दस्तावेज़ों में यह सुनिश्चित नहीं कर सकता है।

इसलिए सामान्य तौर पर, ज्यादातर मामलों में एम्बेडेड संबंधों का उपयोग किया जा सकता है, जब तक कि दस्तावेज़ आकार सीमा (लेखन के समय 16 मेगाबाइट) और/या इसकी नेस्टिंग सीमा (लेखन के समय 100 स्तर गहरा) के भीतर रहता है।

हालांकि, एम्बेडेड संबंध सभी के लिए उपयुक्त नहीं हैं अवसर। ऐसी स्थितियां हो सकती हैं जहां दस्तावेज़ संदर्भित संबंध बनाने के लिए यह अधिक समझ में आता है।

संदर्भित संबंधों का उपयोग कब करें

ऐसे डेटा के लिए जिन्हें कई दस्तावेज़ों में दोहराने की आवश्यकता होती है, उन्हें अपने अलग दस्तावेज़ में रखना मददगार हो सकता है। यह त्रुटियों को कम कर सकता है और डेटा को सुसंगत रखने में मदद करता है (यह ध्यान में रखते हुए कि एकाधिक-दस्तावेज़ अपडेट परमाणु नहीं हैं)।

उपरोक्त उदाहरण का उपयोग करते हुए, एक संगीतकार कई बैंडों का सदस्य (या पूर्व सदस्य) हो सकता है। कुछ अन्य कलाकारों के लिए एल्बम भी बना सकते हैं, छात्रों को पढ़ा सकते हैं, क्लीनिक चला सकते हैं, आदि। साथ ही, प्रत्येक संगीतकार के खिलाफ बहुत सारा डेटा संग्रहीत किया जा सकता है। इसलिए इस मामले में प्रत्येक संगीतकार के लिए एक अलग दस्तावेज़ रखना समझ में आता है।

साथ ही, यदि आपको लगता है कि आपके एम्बेडेड दस्तावेज़ MongoDB द्वारा लगाई गई फ़ाइल आकार सीमा से अधिक हो सकते हैं, तो आपको कुछ डेटा को अलग दस्तावेज़ों में संग्रहीत करने की आवश्यकता होगी।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoRegex (MongoDB C# ड्राइवर) का उपयोग कैसे करें

  2. MongoDB $ दौर बनाम $ ट्रंक:क्या अंतर है?

  3. मोंगोडीबी निकालें ()

  4. मोंगोडब में संग्रहीत फ़ंक्शन को कॉल करें

  5. स्प्रिंग डेटा मोंगो पेजिनेशन