यह एक अच्छा प्रश्न है, जो अत्यधिक मद्यपान की समस्याओं और इससे निपटने के तरीके के बारे में बताता है।
उदाहरण:पोस्ट पसंद
आइए पोस्ट पसंद करने वाले उपयोगकर्ताओं के उदाहरण के साथ रहें, जो एक सरल उदाहरण है। अन्य संबंधों को उसी के अनुसार संभालना होगा।
आपने बिल्कुल सही कहा है कि पोस्ट के अंदर लाइक्स को स्टोर करने से जल्द या बाद में समस्या पैदा हो जाएगी कि बहुत लोकप्रिय पोस्ट आकार सीमा तक पहुंच जाएंगे।
तो आप सही ढंग से एक post_likes
. बनाने के लिए वापस आ गए संग्रह। मैं इसे सही क्यों कहता हूं? चूंकि यह आपके उपयोग के मामलों और कार्यात्मक और गैर-कार्यात्मक आवश्यकताओं के अनुरूप है!
- यह अनिश्चित काल तक मापता है (ठीक है, एक सैद्धांतिक सीमा है, लेकिन यह विनम्र है)
- इसे बनाए रखना आसान है (
post_id
पर एक अद्वितीय अनुक्रमणिका बनाएं औरliked_user_id
) और उपयोग करें (उपयोगकर्ता और पोस्ट दोनों ज्ञात हैं, इसलिए एक लाइक जोड़ना एक साधारण इंसर्ट है या अधिक संभावना एक अप्सर्ट है) - आप आसानी से पता लगा सकते हैं कि कौन से पोस्ट को कौन से उपयोगकर्ता पसंद करते हैं और कौन से पोस्ट को कौन से उपयोगकर्ता पसंद करते हैं
हालाँकि, मैं कुछ उपयोग मामलों के लिए अनावश्यक प्रश्नों को रोकने के लिए संग्रह का थोड़ा विस्तार करूँगा जो अक्सर होते हैं।
आइए अभी के लिए मान लें कि पोस्ट के शीर्षक और उपयोगकर्ता नाम बदले नहीं जा सकते। उस स्थिति में, निम्न डेटा मॉडल अधिक अर्थपूर्ण हो सकता है
{
_id: new ObjectId(),
"post_id": someValue,
"post_title": "Cool thing",
"liked_user_id": someUserId,
"user_name": "JoeCool"
}
अब मान लेते हैं कि आप किसी पोस्ट को पसंद करने वाले सभी उपयोगकर्ताओं का उपयोगकर्ता नाम प्रदर्शित करना चाहते हैं। उपरोक्त मॉडल के साथ, यह एक एकल, बल्कि तेज़ क्वेरी होगी:
db.post_likes.find(
{"postId":someValue},
{_id:0,user_name:1}
)
केवल आईडी संग्रहीत होने के साथ, इस सामान्य कार्य के लिए कम से कम दो प्रश्नों की आवश्यकता होगी और - इस बाधा को देखते हुए कि किसी पोस्ट के लिए असीमित संख्या में लाइकर्स हो सकते हैं - संभावित रूप से विशाल मेमोरी खपत (आपको उपयोगकर्ता आईडी को रैम में स्टोर करना होगा)।
माना, इससे कुछ अतिरेक होता है, लेकिन जब लाखों लोग किसी पोस्ट को पसंद करते हैं, तब भी हम बहुत अधिक प्रदर्शन प्राप्त करते हुए अपेक्षाकृत सस्ते (और स्केल करने में आसान) डिस्क स्थान के केवल कुछ मेगाबाइट की बात कर रहे हैं। उपयोगकर्ता अनुभव के संदर्भ में।
अब यहाँ बात आती है:भले ही उपयोगकर्ता नाम और पोस्ट शीर्षक परिवर्तन के अधीन हों, आपको केवल एक बहु अद्यतन करना था:
db.post_likes.update(
{"post_id":someId},
{ $set:{ "post_title":newTitle} },
{ multi: true}
)
आप व्यापार कर रहे हैं कि कुछ दुर्लभ चीजें करने में कुछ समय लगता है जैसे उपयोगकर्ता नाम बदलना या उपयोग के मामलों के लिए अत्यधिक गति के लिए एक पोस्ट जो अक्सर होता है।
नीचे की पंक्ति
ध्यान रखें कि MongoDB एक दस्तावेज़ उन्मुख डेटाबेस है। इसलिए उन घटनाओं का दस्तावेजीकरण करें जिनमें आप रुचि रखते हैं, भविष्य के प्रश्नों के लिए आवश्यक मूल्यों के साथ और अपने डेटा को तदनुसार मॉडल करें।