2012-06-24 15 views
6

मैं स्ट्रिंग के मालिकों (प्रति स्ट्रिंग के एक या अधिक मालिक) के साथ डेटाबेस में एक स्ट्रिंग संग्रहीत कर रहा हूं।MongoDB में डेटा कैसे संबंधित करें?

मैंने हमेशा MySQL के साथ काम किया है जो एक पारंपरिक संबंधपरक डेटाबेस है। उस स्थिति में, मैं एक तालिका में एक अद्वितीय आईडी के साथ स्ट्रिंग को स्टोर करता हूं, और फिर दूसरी तालिका में मालिकों के साथ स्ट्रिंग की अनूठी आईडी (एकाधिक रिकॉर्ड के रूप में)।

मैं फिर एसक्यूएल जॉइन का उपयोग कर मालिकों द्वारा स्ट्रिंग ला सकता हूं।

अब मैं मोंगोडीबी का उपयोग कर एक परियोजना पर काम कर रहा हूं, और मैं ऊपर जैसा ही कर रहा हूं।

क्या यह NoSQL डेटाबेस के साथ काम करते समय गलत तरीका माना जाएगा? क्या मुझे NoSQL के साथ काम करते समय 'रिलेशनशिप' के संदर्भ में नहीं सोचना चाहिए?

एक और तरीका है मैं MongoDB में एक ही प्राप्त करने के बारे में सोच सकते हैं इस तरह भंडारण किया जाता है:

{ 
    "string": "foobar", 
    "owners": [ 
     "owner1", 
     "owner2", 
     "owner3" 
    ] 
} 

हालांकि, इस मामले में, मैं अनिश्चित मैं "owner1 के स्वामित्व वाले सभी स्ट्रिंग्स" की तलाश कैसे करेंगे हूँ ।

+7

कृपया छतरी के रूप में "नोएसक्यूएल" का उपयोग न करें। आप MongoDB का उपयोग कर रहे हैं। बस।"नोएसक्यूएल" का अर्थ है * बहुत अधिक और बहुत छोटा * :-) –

उत्तर

2

यह सही दृष्टिकोण की तरह दिखता है; हालांकि याद रखें, यह हमेशा आपकी परियोजना की कुलता पर निर्भर करता है, लक्ष्य क्या हैं (प्रदर्शन, लचीलापन), यदि आप विज्ञापन-प्रसार प्रश्नों और अन्य कारकों को चलाने की आवश्यकता रखते हैं, तो आप सबसे अधिक जोखिम चलाने का इरादा रखते हैं। सामान्य रूप से, जैसा कि आपने लिखा है, नेस्टेड दस्तावेज़ों का उपयोग करना, जॉइन और विदेशी कुंजी का उपयोग करने का सही विकल्प है।

maximum document size (वर्तमान में 16 एमबी) भी ध्यान में रखें, जो किसी दिए गए स्ट्रिंग के मालिकों (जैसे, सैकड़ों हजारों) हैं, तो चिंता का विषय होगा।

+0

धन्यवाद। मुझे अधिकतम दस्तावेज़ आकार के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि मुझे इसके करीब कहीं भी नहीं मिल रहा है। मेरी सबसे आम क्वेरी आवेषण होगी। बहुत, बहुत कम पाता है। – xbonez

5

dbaseman के जवाब के पूरक करने के लिए:

हाँ, अपने दृष्टिकोण ठीक लगता है। आप आसानी से

db.collection.find({owners: 'author1'}) 

क्योंकि MongoDB एक विशेष तरीके से व्यवहार करता है सरणियों यह संभव है "owner1 के स्वामित्व वाले सभी स्ट्रिंग्स" के लिए खोज कर सकते हैं।

+0

क्वेरी का एक उदाहरण दिखाने के लिए धन्यवाद। – xbonez

6

क्या यह NoSQL डेटाबेस के साथ काम करते समय गलत तरीका माना जाएगा? क्या मुझे NoSQL के साथ काम करते समय 'रिलेशनशिप' के संदर्भ में नहीं सोचना चाहिए?

एम्बेडिंग के मामले में बहुत सारे प्रश्न हैं और यह बहुत कम हो जाता है।

Somethings कि यहाँ विचार करने की आवश्यकता है कि उल्लेख नहीं किया गया है, तो आप एम्बेड करना चाहते हैं:

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

परिणाम प्रदर्शित करना हमेशा एम्बेड करना है या नहीं, यह एक महत्वपूर्ण निर्णय है। यदि आपको पंक्तियों की एक बड़ी संख्या को पगने की आवश्यकता है, तो 1000 कहें, आपको $slice ऑपरेटर को सामान्य क्वेरीिंग या समेकन ढांचे में उपयोग करने की आवश्यकता होगी। 1000 में मैं मानता हूं कि यह काफी तेज हो सकता है लेकिन जल्द या बाद में कि इन-मेमोरी ऑपरेशन सामान्य पूछताछ से धीमा हो जाएगा (वास्तव में यह हमेशा होना चाहिए)।

आप जटिल छंटाई और की आवश्यकता होती है सहायक दस्तावेज़ों आप इन बाहर विभाजित करना चाहते हैं हो सकता है की प्रदर्शित करने और बजाय दस्तावेज़ संरचना है:

{ 
    "string": "foobar", 
    "owners": [ 
     ObjectId(), 
     ObjectId(), 
     ObjectId() 
    ] 
} 

मुझे लगता है कि यह वास्तव में के बाद से अपने डेटा के लिए वैसे भी एक अधिक performant संरचना हो सकता है owner संग्रह में user पंक्ति की तरह लगता है।

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

जटिल सॉर्टिंग और पेजिनेशन पर वापस आना। इस डेटा के साथ आप निश्चित रूप से एक ही दौर यात्रा के साथ सभी owner आईडी प्राप्त कर सकते हैं और फिर एक और राउंड ट्रिप में आप users तालिका के भीतर $in का उपयोग करके सामान्य क्वेरीिंग के साथ उन मालिकों की पंक्तियों के लिए क्वेरी कर सकते हैं जो आपको आवश्यक जटिल प्रदर्शन की अनुमति देते हैं।

तो कुल मिलाकर यह संरचना, मैंने पाया है, बहुत ही प्रभावशाली है।

बेशक यह संरचना आपकी पूछताछ पर निर्भर करती है, इसके बजाय उपयोगकर्ता पर स्ट्रिंग आईडी को घर बनाना बेहतर हो सकता है लेकिन इस मामले में ऐसा नहीं होता है क्योंकि उपयोगकर्ता संभवतः कई तारों का मालिक बन सकता है जैसे कि मैं कहूंगा कि यह एक है कई-> स्ट्रिंग पक्ष पर एम्बेडेड कई रिश्ते।

उम्मीद है कि इस मदद करता है और मैं हलकों में दौर आगे नहीं जा सके,

3

जब एम्बेडेड डेटा मैं मोंगो में Atomicity व्यवहार से परिचित करने के लिए हो रही सलाह देते हैं के साथ काम कर। एक अच्छा प्रारंभिक बिंदु यहाँ होगा: http://docs.mongodb.org/manual/core/data-modeling/#atomicity

अपने विशिष्ट मामले में/जब जोड़ने अपने "मालिकों" सरणी के लिए एक उपयोगकर्ता ObjectId (के रूप में Sammaye द्वारा अनुशंसित) को हटाने, आप पर a findAndModify() आपरेशन का उपयोग करना चाहते करने जा रहे हैं यह सुनिश्चित करने के लिए स्ट्रिंग दस्तावेज़ यह है कि जब दस्तावेज़ उस दस्तावेज़ को लिखता है, तो डेटा अखंडता अभी भी बनाए रखी जाती है। , $ AddToSet डुप्लिकेट

  • को रोकने के लिए

    1. जब एक मालिक जोड़ने जब एक मालिक को हटाने, $ खींच

    दोनों:

    इस आपरेशन के भीतर, मैं निम्नलिखित ऑपरेटर्स का उपयोग की सलाह देते हैं यहां दस्तावेज हैं: http://docs.mongodb.org/manual/reference/operators/#update-operators-array

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