आप NoSQL में रिकॉर्ड संबंधों को कैसे ट्रैक करते हैं?


117

मैं NoSQL KVP या दस्तावेज़ डेटाबेस में विदेशी कुंजियों और अनुक्रमित के बराबर का पता लगाने की कोशिश कर रहा हूं। चूंकि कोई पिवट टेबल नहीं हैं (दो वस्तुओं के बीच एक संबंध को चिह्नित करने वाली कुंजी जोड़ने के लिए) मैं वास्तव में इस बात पर अडिग हूं कि आप डेटा को इस तरह से कैसे पुनः प्राप्त कर पाएंगे जो सामान्य वेब पेजों के लिए उपयोगी होगा।

मान लें कि मेरे पास एक उपयोगकर्ता है, और यह उपयोगकर्ता पूरी साइट पर कई टिप्पणियां छोड़ता है। जिस तरह से मैं उस उपयोगकर्ता की टिप्पणियों का ट्रैक रखने के बारे में सोच सकता हूं

  1. उन्हें उपयोगकर्ता ऑब्जेक्ट में एम्बेड करें (जो काफी बेकार लगता है)
  2. एक user_id:commentsमूल्य बनाएं और बनाए रखें जिसमें प्रत्येक टिप्पणी की कुंजी की एक सूची हो [टिप्पणी: 34, टिप्पणी: 197, आदि ...] ताकि मैं उन्हें आवश्यकतानुसार ला सकूं।

हालाँकि, दूसरा उदाहरण लेते हुए आप जल्द ही एक ईंट की दीवार से टकराएंगे, जब आप इसे "active_comments" नामक एक कुंजी की तरह अन्य चीजों पर नज़र रखने के लिए उपयोग करते हैं, जिसमें 30 मिलियन आईडी हो सकते हैं, जिससे इसे प्रत्येक पृष्ठ को क्वेरी करने के लिए सिर्फ एक TON खर्च करना पड़ता है। सक्रिय टिप्पणियां। यह भी दौड़-परिस्थितियों के लिए बहुत ही खतरा होगा क्योंकि कई पेज एक ही समय में इसे अपडेट करने का प्रयास कर सकते हैं।

मैं NoSQL डेटाबेस में निम्नलिखित जैसे संबंधों को कैसे ट्रैक कर सकता हूं?

  • उपयोगकर्ता की सभी टिप्पणियाँ
  • सभी सक्रिय टिप्पणियां
  • सभी पोस्ट [कीवर्ड] के साथ टैग किए गए
  • एक क्लब में सभी छात्र - या सभी क्लब एक छात्र है

या मैं इस बारे में गलत सोच रहा हूं?


NoSQL डेटाबेस में इसे करने का कोई एक तरीका नहीं है, यह सवाल पूछने के लिए एक परिजन है कि मैं C कार्यक्रमों में संबंधों को कैसे ट्रैक करूंगा।
स्टोनमेटल

3
वाह, तो मुझे लगता है कि RDBMS की जगह NoSQL के बारे में प्रचार असंभव है।
Xeoncross 2

11
हां, NoSQL निश्चित रूप से ज़्यादा गरम है। मैं यह नहीं कह रहा हूँ कि नई प्रौद्योगिकियाँ सही परिस्थितियों में उपयोगी नहीं हैं, लेकिन यह सोचना हास्यास्पद है कि वे RDBMS की जगह लेंगे। देखें en.wikipedia.org/wiki/Hype_cycle
विधेयक Karwin

1
क्या आपके पास सिर्फ 'उपयोगकर्ताओं' का संग्रह और टिप्पणियों का संग्रह नहीं होगा। और फिर, प्रत्येक टिप्पणी सिर्फ एक 'लेखक' संपत्ति के रूप में होती है जिसका मूल्य एक उपयोगकर्ता आईडी पर वापस आता है?
कोडफिनिटी

जवाबों:


186

"NoSQL तरीके" में कई-से-कई संघों को कैसे संग्रहीत किया जाए, इसके लिए सभी उत्तर एक ही बात को कम करते हैं: डेटा को फिर से संग्रहीत करना।

NoSQL में, आप डेटा संस्थाओं के बीच संबंधों के आधार पर अपने डेटाबेस को डिज़ाइन नहीं करते हैं। आप अपने डेटाबेस को आपके द्वारा चलाए जा रहे प्रश्नों के आधार पर डिज़ाइन करेंगे। संबंधपरक डेटाबेस को असामान्य बनाने के लिए आप उन्हीं मानदंडों का उपयोग करेंगे: यदि डेटा के लिए सामंजस्य होना अधिक महत्वपूर्ण है (सामान्यीकृत तालिका के बजाय अल्पविराम से अलग की गई सूची में मानों के बारे में सोचें), तो इसे इस तरह से करें।

लेकिन यह अनिवार्य रूप से एक अन्य प्रकार की क्वेरी (किसी दिए गए उपयोगकर्ता द्वारा किसी भी लेख के लिए टिप्पणियां) की कीमत पर एक प्रकार की क्वेरी (किसी दिए गए लेख के लिए किसी भी उपयोगकर्ता द्वारा टिप्पणियां) के लिए अनुकूलन करता है। यदि आपके एप्लिकेशन को दोनों प्रकार के प्रश्नों की समान रूप से अनुकूलित करने की आवश्यकता है, तो आपको अपभ्रंश नहीं करना चाहिए। और इसी तरह, यदि आपको डेटा को रिलेशनल तरीके से उपयोग करने की आवश्यकता है, तो आपको NoSQL समाधान का उपयोग नहीं करना चाहिए।

विकृति और अतिरेक के साथ एक जोखिम है कि डेटा के अनावश्यक सेट एक दूसरे के साथ सिंक से बाहर निकल जाएंगे। इसे विसंगति कहते हैं । जब आप सामान्यीकृत रिलेशनल डेटाबेस का उपयोग करते हैं, तो RDBMS विसंगतियों को रोक सकता है। एक डेटाबेस में या NoSQL में, विसंगतियों को रोकने के लिए एप्लिकेशन कोड लिखना आपकी ज़िम्मेदारी बन जाता है।

कोई सोच सकता है कि आपके लिए विसंगतियों को रोकने के लिए एक कठिन काम करने के लिए NoSQL डेटाबेस के लिए बहुत अच्छा होगा। एक प्रतिमान है जो यह कर सकता है - संबंधपरक प्रतिमान।


20
"यदि आपको डेटा को रिलेशनल तरीके से उपयोग करने की आवश्यकता है, तो आपको NoSQL समाधान का उपयोग नहीं करना चाहिए" - तो कैसे NoSQL चलाने वाले अन्य लोग इसके साथ दूर हो जाते हैं? जब आप पहली बार अपना एप्लिकेशन डिज़ाइन करते हैं, तो आप संभवतः उन सभी तरीकों को कैसे जान सकते हैं जिनसे आप डेटा क्वेरी करेंगे? फॉक्स उदाहरण, मैं हाल की टिप्पणियाँ, उपयोगकर्ता द्वारा टिप्पणियां, टैग द्वारा टिप्पणियां, किसी दिए गए पोस्ट के लिए टिप्पणियां, स्पैम के रूप में चिह्नित टिप्पणियां, सक्रिय टिप्पणियां, उच्चतम श्रेणी की टिप्पणियां, आदि
चाहता हूं

14
वास्तव में - NoSQL जैसी कोई चीज नहीं है क्योंकि यह "काम करता है" जैसा कि NoSQL के वकील दावा करना पसंद करते हैं। या तो आप अपने रिलेशनल डेटा मॉडलिंग के लिए विश्लेषण का एक गुच्छा सामने रखते हैं, या आप अपनी शीर्ष-प्राथमिकता वाले प्रश्नों के लिए विश्लेषण का एक गुच्छा सामने करते हैं, या आप अपने डिजाइन के किन हिस्सों को खोजते हुए पूरे प्रोजेक्ट में महंगा रिफ्लेक्टर करते हैं। सामने पर्याप्त विश्लेषण नहीं मिला।
बिल करविन

1
अगर हम डेटा को बेमानी तरीके से स्टोर करते हैं, तो हमें चीजों को कैसे अपडेट करना चाहिए? उदाहरण के लिए, उसका नाम बदलता है, और उसने कुछ टिप्पणियां लिखी हैं। उपयोगकर्ता संग्रह में उसका नाम पहले से ही बदल गया है, लेकिन टिप्पणियों के संग्रह में सभी अनावश्यक रूप से संग्रहीत नामों को कैसे बदलना है?
मोहम्मद करमानी

3
@ M98, आह, आपने इस रणनीति में कमजोरी पाई है। आपको उन सभी स्थानों के बारे में जानना होगा जिन्हें आपको अपडेट करने की आवश्यकता है, और जब आप किसी को भी अपडेट करते हैं, तो उन सभी को अपडेट करने के लिए अपने आवेदन में कोड लिखें। सौभाग्य!
बिल कारविन

2
एक के लिए एक ही समस्या मौजूद है denormalized रिलेशनल डेटाबेस।
बिल कारविन

5

काउचबडी दृष्टिकोण मानचित्र चरण में सामानों के उचित वर्गों का उत्सर्जन करने और इसे कम करने में संक्षेप में प्रस्तुत करने का सुझाव देता है। इसलिए आप सभी टिप्पणियों को मैप कर सकते हैं और 1दिए गए उपयोगकर्ता के लिए उत्सर्जन कर सकते हैं और बाद में केवल लोगों को प्रिंट कर सकते हैं। यह couchDB में सभी ट्रैक करने योग्य डेटा के लगातार विचारों का निर्माण करने के लिए हालांकि बहुत सारे डिस्क भंडारण की आवश्यकता होगी। btw उनके पास रिश्तों के बारे में यह विकी पेज भी है: http://wiki.apache.org/couchdb/EntityRelationship

दूसरी ओर रिआक के पास संबंध बनाने का उपकरण है। यह कड़ी है। आप किसी लिंक (यहां टिप्पणी) दस्तावेज़ के पते को 'रूट' दस्तावेज़ (यहां उपयोगकर्ता दस्तावेज़) का इनपुट कर सकते हैं। इसकी एक चाल है। यदि इसे वितरित किया जाता है तो इसे कई स्थानों पर एक समय में संशोधित किया जा सकता है। यह संघर्ष का कारण बनेगा और परिणामस्वरूप विशाल वेक्टर घड़ी का पेड़: / .. इतना बुरा नहीं होगा, इतना अच्छा नहीं।

रीक के पास अब भी एक और 'तंत्र' है। इसमें 2-लेयर की नेम स्पेस है, इसलिए इसे बकेट और की कहा जाता है। इसलिए, छात्र उदाहरण के लिए, यदि हमारे पास क्लब ए, बी और सी और छात्र स्टूडेंट हैं, तो छात्र आप निम्नलिखित सम्मेलन को बनाए रख सकते हैं:

{ Key = {ClubA, StudentX}, Value = true }, 
{ Key = {ClubB, StudentX}, Value = true }, 
{ Key = {ClubA, StudentY}, Value = true }

और दिए गए बकेट में सिर्फ लिस्ट कीज़ पढ़ना है। इसमें गलत क्या है? यह बहुत धीमा है। बाल्टियों को सूचीबद्ध करना कभी भी रियाक के लिए प्राथमिकता नहीं थी। यह बेहतर और बेहतर हो रहा है। btw। आप स्मृति को बर्बाद नहीं करते हैं क्योंकि यह उदाहरण {true}स्टूडेंटएक्स या वाई के पूर्ण प्रोफ़ाइल से जुड़ा जा सकता है (यहां संघर्ष संभव नहीं हैं)।

जैसा कि आप इसे NoSQL! = NoSQL को देखते हैं। आपको विशिष्ट कार्यान्वयन को देखने और अपने लिए परीक्षण करने की आवश्यकता है।

कॉलम स्टोर से पहले उल्लेख किया जाना संबंधों के लिए अच्छा फिट लगता है .. लेकिन यह सब आपके ए और सी और पी की जरूरतों पर निर्भर करता है;) यदि आपको ए की जरूरत नहीं है और आपके पास पेटा बाइट्स से कम है तो इसे छोड़ दें, MySql या पोस्टकार्ड के साथ आगे बढ़ें।

सौभाग्य


1
रीक ने हाल ही में v1.0 जारी किया है, जो कि लेवलडीबी बैकएंड का उपयोग करते समय द्वितीयक सूचकांक के लिए समर्थन जोड़ता है। बहुत मूल्यवान विशेषता।
जॉन एल।

4
  1. उपयोगकर्ता: userid: टिप्पणियाँ एक उचित दृष्टिकोण है - इसे SQL में एक स्तंभ सूचकांक के बराबर के रूप में सोचें, अतिरिक्त आवश्यकता के साथ जिसे आप अनइंस्टॉल किए गए स्तंभों पर क्वेरी नहीं कर सकते।

  2. यह वह जगह है जहाँ आपको अपनी आवश्यकताओं के बारे में सोचने की आवश्यकता है। 30 मिलियन आइटम के साथ एक सूची अनुचित नहीं है क्योंकि यह धीमा है, लेकिन क्योंकि यह इसके साथ कुछ भी करने के लिए अव्यावहारिक है। यदि आपकी वास्तविक आवश्यकता कुछ हालिया टिप्पणियों को प्रदर्शित करने की है, तो आप बहुत ही छोटी सूची रखने से बेहतर हैं जो कि जब भी कोई टिप्पणी जोड़ी जाती है, अपडेट हो जाती है - याद रखें कि NoSQL की कोई सामान्यीकरण आवश्यकता नहीं है। रेस की स्थिति एक मूल कुंजी मूल्य स्टोर में सूचियों के साथ एक मुद्दा है लेकिन आम तौर पर या तो आपका मंच सूचियों को ठीक से समर्थन करता है, आप ताले के साथ कुछ कर सकते हैं, या आप वास्तव में विफल अपडेट की परवाह नहीं करते हैं।

  3. उपयोगकर्ता टिप्पणियों के लिए समान - एक इंडेक्स कीवर्ड बनाएं: पोस्ट

  4. उसी में से अधिक - शायद क्लब की एक सूची छात्र की संपत्ति के रूप में और एक क्लब के सभी सदस्यों को प्राप्त करने के लिए उस क्षेत्र पर एक सूचकांक


तो, मूल रूप से सब कुछ बस सूचियों की जरूरत है? लगता है कि आईडी के स्ट्रिंग्स को मैन्युअल रूप से ट्रैक करने की तुलना में अधिक परिष्कृत दृष्टिकोण होना चाहिए। एक के लिए, आप केवल इतनी दूर जा सकते हैं इससे पहले कि वे उपयोगी होने के लिए बड़े हो जाएं। फिर, NoSQL प्रौद्योगिकी के मुख्य पोस्टर-चाइल्ड प्रोजेक्ट्स (MongoDB, CouchDB, Membase, आदि) सभी नई परियोजनाएं हैं, इसलिए शायद मुझे संबंधों को ट्रैक करने के लिए बेहतर तरीके से आने के लिए उन्हें और अधिक समय देने की आवश्यकता है।
एक्सोनक्रॉस

यदि आप NoSQL (AKA गैर-संबंधपरक डेटा स्टोर) का उपयोग कर रहे हैं, तो आपको रिलेशनल शब्दों में सोचना बंद करने की आवश्यकता है। उपयोग किए गए दृष्टिकोण प्लेटफार्मों के बीच भिन्न होंगे, लेकिन मूल विचार जिसे आपको अनुक्रमित करना है, वह काफी सार्वभौमिक है। आपके द्वारा दिए गए संबंध उदाहरण NoSQL में दो अलग-अलग तरीकों से तैयार किए गए हैं: 1) स्टोरेज - SQL के विपरीत, कॉलम में कई / जटिल मान हो सकते हैं, इसलिए चाइल्ड ऑब्जेक्ट पैरेंट ऑब्जेक्ट का सिर्फ एक हिस्सा है। 2) खोज - आपकी लंबी सूचियाँ वास्तव में खोजे जाने की आवश्यकता है, जिसका अर्थ है अनुक्रमण - आप एक सरल कस्टम सूची या अधिक पूर्ण खोज इंजन का उपयोग कर सकते हैं।
टॉम क्लार्कसन

2

आपके पास

"user": {
    "userid": "unique value",
    "category": "student",
    "metainfo": "yada yada yada",
    "clubs": ["archery", "kendo"]
}

"comments": {
    "commentid": "unique value",
    "pageid": "unique value",
    "post-time": "ISO Date",
    "userid": "OP id -> THIS IS IMPORTANT"
}

"page": {
    "pageid": "unique value",
    "post-time": "ISO Date",
    "op-id": "user id",
    "tag": ["abc", "zxcv", "qwer"]
}

एक संबंधपरक डेटाबेस में सामान्य रूप से एक-से-कई संबंध में सामान्य बात होगी डेटा को सामान्य करना। यह वही है जो आप NoSQL डेटाबेस में भी करेंगे। बस उन क्षेत्रों को अनुक्रमित करें जिनके साथ आप जानकारी प्राप्त करेंगे।

उदाहरण के लिए, आपके लिए महत्वपूर्ण सूचकांक हैं

  • Comment.UserID
  • Comment.PageID
  • Comment.PostTime
  • Page.Tag []

यदि आप NosDB (SQL समर्थन के साथ A .NET आधारित NoSQL डेटाबेस) का उपयोग कर रहे हैं, तो आपके प्रश्न इस तरह होंगे

 SELECT * FROM Comments WHERE userid = That user’;

 SELECT * FROM Comments WHERE pageid = That user’;

 SELECT * FROM Comments WHERE post-time > DateTime('2016, 1, 1');

 SELECT * FROM Page WHERE tag = 'kendo'

उनके SQL धोखा पत्र या प्रलेखन से सभी समर्थित क्वेरी प्रकारों की जाँच करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.