आप या तो एक स्कीमा डिज़ाइन कर सकते हैं जहाँ आप दस्तावेज़ों को संदर्भित या एम्बेड कर सकते हैं। आइए एम्बेडेड दस्तावेज़ों के पहले विकल्प को देखें। उपरोक्त आवेदन के साथ, आप जानकारी को एक दस्तावेज़ में इस प्रकार संग्रहीत कर सकते हैं:
// db.table1 schema
{
"_id": 3, // table1_id
"is_active": true,
"created": ISODate("2015-04-07T16:00:30.798Z"),
"lang": [
{
"name": "foo",
"surname": "bar",
"address": "xxx"
},
{
"name": "abc",
"surname": "def",
"address": "xyz"
}
]
}
ऊपर दिए गए उदाहरण स्कीमा में, आपने अनिवार्य रूप से table1_lang
. को एम्बेड किया होगा मुख्य table1
. के भीतर जानकारी दस्तावेज़। इस डिज़ाइन की अपनी खूबियाँ हैं, उनमें से एक डेटा लोकैलिटी है। चूंकि MongoDB डिस्क पर डेटा को लगातार स्टोर करता है, इसलिए आपको एक दस्तावेज़ में सभी डेटा डालने से यह सुनिश्चित होता है कि स्पिनिंग डिस्क को डिस्क पर किसी विशेष स्थान की तलाश करने में कम समय लगेगा। यदि आपका एप्लिकेशन अक्सर table1
. को एक्सेस करता है table1_lang
. के साथ जानकारी डेटा तो आप लगभग निश्चित रूप से एम्बेडेड मार्ग पर जाना चाहेंगे। एम्बेडेड दस्तावेज़ों के साथ अन्य लाभ डेटा लिखने में परमाणुता और अलगाव है। इसे स्पष्ट करने के लिए, मान लें कि आप एक ऐसे दस्तावेज़ को हटाना चाहते हैं जिसमें "foo" मान के साथ एक लैंग कुंजी "नाम" है, यह एक एकल (परमाणु) ऑपरेशन के साथ किया जा सकता है:
db.table.remove({"lang.name": "foo"});
MongoDB में डेटा मॉडलिंग के बारे में अधिक जानकारी के लिए, कृपया दस्तावेज़ पढ़ें डेटा मॉडलिंग परिचय , विशेष रूप से मॉडल एम्बेडेड दस्तावेज़ों के साथ एक-से-अनेक संबंध
अन्य डिज़ाइन विकल्प उन दस्तावेज़ों को संदर्भित कर रहा है जहाँ आप एक सामान्यीकृत स्कीमा का पालन करते हैं। उदाहरण के लिए:
// db.table1 schema
{
"_id": 3
"is_active": true
"created": ISODate("2015-04-07T16:00:30.798Z")
}
// db.table1_lang schema
/*
1
*/
{
"_id": 1,
"table1_id": 3,
"name": "foo",
"surname": "bar",
"address": "xxx"
}
/*
2
*/
{
"_id": 2,
"table1_id": 3,
"name": "abc",
"surname": "def",
"address": "xyz"
}
उपरोक्त दृष्टिकोण प्रश्नों को निष्पादित करने में अधिक लचीलापन देता है। उदाहरण के लिए, सभी बच्चे को पुनः प्राप्त करने के लिए table1_lang
मुख्य मूल इकाई के लिए दस्तावेज़ table1
आईडी 3 के साथ सीधा होगा, बस संग्रह के खिलाफ एक क्वेरी बनाएं table1_lang
:
db.table1_lang.find({"table1_id": 3});
दस्तावेज़ संदर्भ दृष्टिकोण का उपयोग करते हुए उपरोक्त सामान्यीकृत स्कीमा का भी एक फायदा होता है जब आपके पास बहुत अप्रत्याशितता के साथ एक-से-कई संबंध होते हैं। अगर आपके पास सैकड़ों या हज़ारों table_lang
हैं प्रति दस्तावेज़ table
इकाई, जहां तक स्थानिक बाधाओं का संबंध है, एम्बेडिंग में इतने सारे झटके हैं क्योंकि दस्तावेज़ जितना बड़ा होता है, उतनी ही अधिक RAM का उपयोग करता है और MongoDB दस्तावेज़ों की कठिन आकार सीमा 16MB है।
अंगूठे का सामान्य नियम यह है कि यदि आपके एप्लिकेशन का क्वेरी पैटर्न प्रसिद्ध है और डेटा केवल एक ही तरीके से एक्सेस किया जाता है, तो एक एम्बेडेड दृष्टिकोण अच्छी तरह से काम करता है। यदि आपका एप्लिकेशन डेटा को कई तरीकों से क्वेरी करता है या आप डेटा क्वेरी पैटर्न का अनुमान लगाने में असमर्थ हैं, तो ऐसे मामले के लिए एक अधिक सामान्यीकृत दस्तावेज़ संदर्भ मॉडल उपयुक्त होगा।
संदर्भ: