MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB/DynamoDB में सर्कुलर दस्तावेज़ों को कैसे संभालें?

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

आपके स्कीमा कुछ इस तरह बनेंगे:

Actor {
    ActorId, <-- This is the application/database id, not the actor's actual ID
    Name,
    Age,
    Bio
}

Film {
    FilmId, <-- This is the application/database id for the film
    Title,
    Description,
    ReleaseDate
}

ActedIn {
    ActorId,
    FilmId
}

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

एक अभिनेता के लिए सभी फिल्में प्राप्त करने के लिए, आपको रिश्तों में सभी अभिनय प्राप्त करने के लिए एक बार पूछताछ करने की आवश्यकता होगी, और फिर सभी फिल्मों को प्राप्त करने के लिए एक बैच पढ़ना होगा। नेटवर्क की गति और नेटवर्क पर भेजे जा रहे डेटा की मात्रा के आधार पर, क्वेरी के लिए विशिष्ट विलंबता (मेरे अनुभव में) 10ms से कम है। चूंकि ActedIn संबंध इतनी छोटी वस्तु है, मुझे लगता है कि आप एक क्वेरी के लिए 5ms के औसत मामले की उम्मीद कर सकते हैं, यदि आपकी क्वेरी किसी ऐसी चीज़ से उत्पन्न हो रही है जो AWS डेटासेंटर (EC2, लैम्ब्डा, आदि) में भी चल रही है।

एक आइटम प्राप्त करना 5 एमएस से कम होने वाला है, और आप इसे समानांतर में कर सकते हैं। एक BatchGetItems API भी है, लेकिन मेरे पास उस पर आपके लिए कोई आंकड़े नहीं हैं।

तो, क्या ~10ms तेज़ आपके लिए पर्याप्त है?

अगर नहीं, तो आप DAX का इस्तेमाल कर सकते हैं , जो DynamoDB में एक कैशिंग परत जोड़ता है और <1ms के अनुरोध विलंबता का वादा करता है।

एक कॉल में ऐसा करने का अचूक, लागत-प्रभावी तरीका क्या है?

प्रत्येक ActedIn संबंध के लिए, अपना डेटा इस तरह संग्रहीत करें:

ActedIn {
    ActorId,
    ActorName,
    ActorAge,
    ActorBio,
    FilmId,
    FilmTitle,
    FilmDescription,
    FilmReleaseDate
}

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

मैं आश्वस्त नहीं हूं; ऐसा लगता है कि NoSQL इसके लिए भयानक है।

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. डंप फ़ोल्डर को मोंगोडब डेटाबेस में कैसे आयात करें?

  2. MongoDb पिछले से पहली घटना पर एक सरणी में अद्यतन वस्तु

  3. नेवला, खोज के साथ एक विशिष्ट क्षेत्र का चयन करें

  4. नेस्टेड सरणी mongodb से तत्व निकालें

  5. MongoDb एकत्रीकरण $लुकअप विदेशी _ids के साथ सरणियों में