2012-12-14 13 views
6

के साथ सामग्री टैगिंग मैं मोंगोडीबी का उपयोग कर सामग्री टैगिंग को कार्यान्वित करना चाहता हूं। एक रिलेशनल डेटाबेस में, सबसे अच्छा तरीका सामग्री (कहें, "उत्पाद") और टैग तालिकाओं के बीच कई से अधिक संबंध होना होगा। लेकिन NoSQL डेटाबेस के साथ सबसे अच्छा तरीका क्या है?मोंगोडीबी

यह "सामग्री" दस्तावेज़ का एक टैग सरणी में हर टैग शब्दों में कहें, या एक स्ट्रिंग में टैग के लिए संदर्भ डाल करने के लिए बेहतर होगा?

+0

संभव डुप्लिकेट [मोंगो में पोस्ट टैग कैसे कार्यान्वित करें?] (Http://stackoverflow.com/questions/8455685/how-to-implement-post-tags-in-mongo) –

उत्तर

10

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

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

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

उत्पाद की टैग सरणी में नामों के बजाय ऑब्जेक्ट आईडी संग्रहीत करके टैग का नाम बदलना आसान हो सकता है। लेकिन आईडी के पास नुकसान है कि वे उपयोगकर्ता के लिए बेकार हैं। उत्पाद पृष्ठ दिखाने के लिए आपको टैग के नाम प्राप्त करने होंगे। इसका मतलब है कि आपको टैग संग्रह से प्रत्येक को अनुरोध करना होगा, जिसके लिए एक अतिरिक्त डेटाबेस क्वेरी की आवश्यकता है।

+1

मुझे नहीं लगता कि यह है एम्बेडेड बनाम लिंकिंग पर सलाह देते समय "ज्यादातर मामलों में" कहने का एक अच्छा विचार। यह वास्तव में उपयोग के मामले पर निर्भर करता है, और टैग के लिए यह स्पष्ट है कि एम्बेडिंग सही है, अन्य n: m रिश्तों को एम्बेड करना बहुत गलत हो सकता है। –

+0

@AyayaKamsky आप क्या सुझाव देते हैं? इस मामले में – mayankcpdixit

+2

, मैं एम्बेडिंग का सुझाव देता हूं, मैं इस सुझाव पर विरोध कर रहा हूं कि "अधिकांश मामलों" में एम्बेड करना सही होगा। –