2012-07-16 13 views
8

मैं विभिन्न स्थितियों के लिए अधिकतम क्वेरी दक्षता के लिए आदर्श दस्तावेज़ संरचना के बारे में सोच रहा हूं और मैं इसके बारे में पूछना चाहता हूं। यह वास्तव में मेरे बारे में नहीं जानता है कि इस विशिष्ट प्रकार के मामले में मोंगोडीबी स्मृति में कैसे व्यवहार करता है। मुझे आपको एक काल्पनिक परिदृश्य दें।उपयोगकर्ता अनुयायियों/अनुयायियों की सबसे कुशल पूछताछ के लिए एक अच्छा मोंगोडीबी दस्तावेज़ संरचना क्या है?

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

  1. प्रत्येक उपयोगकर्ता दस्तावेज़ में, एक "अनुयायियों" सरणी अन्य उपयोगकर्ताओं वे पालन के सभी दस्तावेजों के संदर्भों वाले। अन्य उपयोगकर्ताओं के "user.followers" सरणी में हमारे वर्तमान उपयोगकर्ता को ढूंढकर अनुयायी पाए जाते हैं। मुख्य नकारात्मक पक्ष अनुवर्ती खोज के संभावित प्रश्न ओवरहेड प्रतीत होता है। इसके अलावा, विशेष रूप से "user.followers" की सामग्री के लिए एक क्वेरी के लिए, क्या मोंगोडीबी केवल उपयोगकर्ताओं के दस्तावेज़ों में आवश्यक फ़ील्ड तक पहुंचता है, या पूरे उपयोगकर्ता दस्तावेज़ को मिला है और फिर आवश्यक फ़ील्ड मान वहां से देखे गए हैं और यह कैश/इस तरह से संग्रहित किया गया है कि एक बड़े उपयोगकर्ता आधार पर एक क्वेरी को और अधिक स्मृति की आवश्यकता होगी?

  2. प्रत्येक उपयोगकर्ता दस्तावेज़ में, प्रत्येक के लिए त्वरित पहुंच के लिए "अनुयायियों" और "अनुयायियों" दोनों को संग्रहीत करना। यह स्पष्ट रूप से डुप्लिकेट डेटा का नकारात्मक अर्थ है कि उपयोगकर्ता ए के लिए एक प्रविष्टि निम्नलिखित उपयोगकर्ता में संबंधित उपयोगकर्ता बी में दोनों उपयोगकर्ता दस्तावेज़ों में मौजूद है, और हटाने से दूसरे में एक मिलान हटाना आवश्यक है। तकनीकी रूप से, यह एक साधारण हटाने के लिए संभावित विफलता के बिंदुओं की संख्या दोगुना करने पर विचार कर सकता है। और क्या मोंगोडीबी अभी भी जो कुछ मैंने सुना है, उससे हटा हुआ है जब इसे हटाए जाने पर स्मृति के संग्रहीत डेटा के "स्विस चीजिंग" के रूप में वर्णित किया गया है, और इसलिए 2 मेमोरी के बजाय 2 फ़ील्ड से निकालने के लिए उस मेमोरी होल की समस्या का असर होता है?

  3. उपयोगकर्ताओं के अनुयायियों को संग्रहीत करने के लिए एक अलग संग्रह, उपयोगकर्ता दस्तावेजों के लिए समान रूप से पूछे जाने वाले एक-दूसरे के साथ पूछे गए- सिवाय इसके कि स्पष्ट रूप से केवल एक ही डेटा का उपयोग किया जा रहा है अनुयायी है ताकि उपयोगकर्ता दस्तावेज़ों में बहुत से अन्य डेटा प्रासंगिक हो प्रत्येक उपयोगकर्ता, हम उस डेटा तक पहुंचने से बचते हैं। ऐसा लगता है कि एक रिलेशनल डेटाबेस में कुछ ऐसा लगता है, हालांकि मुझे पता है कि यह हमेशा सिद्धांत पर एक भयानक दृष्टिकोण नहीं है, जाहिर है कि यदि किसी अन्य दृष्टिकोण में से एक (या जिसे मैंने नहीं माना है) में से एक मोंगो के वास्तुकला के तहत बेहतर है। सीखना पसंद है!

किसी को भी इस पर कोई विचार है, या मुझे बताने की मैं एक बहुत ही प्रासंगिक और और स्पष्ट डॉक्स पेज नहीं छूटा है कहीं न कहीं, या यहाँ तक कि मुझे बताने की कि मैं सिर्फ बेवकूफ जा रहा हूँ चाहता है चाहता है (साथ सोचा क्यों, कृपया एक स्पष्टीकरण;)) मुझे आपसे सुनना अच्छा लगेगा!

+0

आप किस प्रोग्रामिंग भाषा का उपयोग करेंगे? इसके आधार पर कुछ विशेषताएं हैं जो अंतर्निहित ड्राइवर समर्थन कर सकते हैं या नहीं। मैं विशेष रूप से डीबीआरएफ के बारे में बात कर रहा हूं। http://docs.mongodb.org/manual/applications/database-references/ –

+0

यह एक अच्छा मुद्दा है, धन्यवाद। हम कुछ भी इस्तेमाल कर सकते हैं लेकिन वर्तमान में PHP और Node.js. का मिश्रण – tdous

उत्तर

7

यह एक क्लासिक अनुयायी-followee समस्या है और वहाँ इस लिंक बाहर it..Check करने के लिए कोई एक ही जवाब है: एक संबंधपरक स्कीमा के

mongo db design of following and feeds, where should I embed?

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

http://forum.kohanaframework.org/discussion/10130/followers-and-following-database-design-like-twitter/p1

बात है, आप या तो एक उपयोगकर्ता दस्तावेज़ में अनुयायियों या followees रख सकता है, लेकिन दोनों नहीं, डबल विलोपन मुद्दों से बचने के लिए। तो अगर आप MongoDB से चिपके चाहिए, एक ही रास्ता बाहर हो .. (यह मानते हुए लोगों का पालन नहीं करते/अनुसरण ना किसी को भी कि अक्सर) कर सकता है,

दस्तावेज़ में सिर्फ followees रखें, क्योंकि जब मैं अपने प्रोफ़ाइल देखने के, मैं .. .. लोगों को मैं पालन में रुचि होगी (इसी कारण मैं उन्हें पहली जगह में पीछा किया, ठीक है?) और फिर जैसे एक प्रश्न करना: यह जो सब अनुसरण कर रहे हैं बता देंगे

db.Users.find({ user_id : { $in : followees })

मैं (कहता हूं कि मेरी आईडी 'user_id' है)।

एक और कारण है कि मैं दूसरे तरीके से सुझाव नहीं देता हूं .. कोई भी 30-40 लोगों का पालन कर सकता है, इसलिए 30-40 अनुयायियों को संग्रहीत करने वाला उपयोगकर्ता दस्तावेज़ ठीक है, जो उपयोगकर्ता दस्तावेज़ के हजारों को संग्रहीत करता है अनुयायियों! फॉलो-इन-डॉक्यूमेंट दृष्टिकोण के साथ, आप लगभग पूरी तरह से आकार के उपयोगकर्ता दस्तावेज प्राप्त करते हैं ... अनुयायी-इन-दस्तावेज़ दृष्टिकोण में, आपके पास कुछ बहुत छोटे लेकिन कुछ बहुत ही भारी दस्तावेज होंगे। और आपके द्वारा रखे गए अनुयायी-डेटा की मात्रा के आधार पर (अगर कोई है, follower_id के अलावा), तो आप दस्तावेज़ आकार सीमा के बारे में सावधान रहना चाहते हैं।

+1

अच्छा! आपने उन सभी बिंदुओं को कवर किया जो मुझे कहना था! विकल्प 2 निश्चित रूप से कोई संख्या नहीं है। आपके द्वारा अनुसरण किए जा रहे उपयोगकर्ताओं के आईडी को संग्रहीत करने का तरीका है। आपके अनुसरण करने वाले उपयोगकर्ताओं की एक सूची प्राप्त करना केवल एक प्रश्न है और इसे अनुक्रमित किया जा सकता है। संदर्भ लें: http://www.mongodb.org/display/DOCS/Schema+Design –

+0

इस तरह से मैं भी विचार करता हूं, हालांकि, मैं मोंगो में 'असंबद्ध क्षेत्र' प्रदर्शन समस्या से थोड़ा चिंतित हूं, जो शायद इसे एक खराब विकल्प बनाओ। देखें: http://stackoverflow.com/questions/9306815/mongodb-performance-with-growing- डेटा- संरचना इस पर आपके विचार क्या हैं? – UpTheCreek

+0

@UpTheCreek यहां पर असंबद्ध क्षेत्र पीपीएल I की सूची है। यह मानते हुए कि 30-40 उपयोगकर्ताओं से अधिक नहीं बढ़ता है, यह हजारों अनुयायियों वाले असंबद्ध क्षेत्र की तुलना में एक मुद्दा कम होगा। दोबारा, यह तर्क इस उपयोग के मामले के लिए बहुत विशिष्ट है (ट्विटर शैली में अनुयायी-अनुवर्ती)। –

2

यह देखते हुए कि इसके कई रिश्तों के लिए कई विकल्प हैं, विकल्प (2) मेरे लिए अच्छा लग रहा है। मिलान हटाने के लिए, आमतौर पर यह कोई मुद्दा नहीं है, जब तक कि आपके पास दो दस्तावेज़ों के बीच सुलह तंत्र का कोई प्रकार हो।

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

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