मैं अभी इस सवाल पर अड़ा हुआ हूं, हालांकि यह एक पुराना है, मैंने सोचा कि दिए गए उत्तरों में उल्लेखित संभावनाओं के एक जोड़े को जोड़ना उपयोगी होगा। इसके अलावा, पिछले कुछ वर्षों में चीजें थोड़ी बढ़ गई हैं, इसलिए यह जोर देने योग्य है कि SQL और NoSQL एक-दूसरे के करीब जा रहे हैं।
टिप्पणीकारों में से एक ने सावधानीपूर्वक रवैया अपनाया कि "यदि डेटा संबंधपरक है, तो रिलेशनल का उपयोग करें"। हालांकि, यह टिप्पणी केवल संबंधपरक दुनिया में समझ में आती है, जहां स्कीमा हमेशा आवेदन से पहले आते हैं।
विश्वसनीय विश्व: संरचना डेटा> इसे प्राप्त करने के लिए एप्लिकेशन लिखें
NOSQL वर्ल्ड: डिज़ाइन एप्लिकेशन> संरचना डेटा तदनुसार
भले ही डेटा रिलेशनल हो, NoSQL अभी भी एक विकल्प है। उदाहरण के लिए, एक-से-कई रिश्तों को कोई समस्या नहीं है और वे MongoDB डॉक्स में व्यापक रूप से शामिल हैं
एक 2010 समाधान के लिए एक 2015 समाधान
चूँकि यह प्रश्न पोस्ट किया गया था, इसलिए एसक्यूएल को एसक्यूएल के करीब लाने के गंभीर प्रयास हुए हैं। कैलिफोर्निया विश्वविद्यालय (सैन डिएगो) में यानिस पापकोनस्टेंटिनौ के नेतृत्व में टीम फॉरवर्ड पर काम कर रही है , जो SQL ++ का कार्यान्वयन है जो जल्द ही यहां पोस्ट की गई लगातार समस्याओं का समाधान हो सकता है।
अधिक व्यावहारिक स्तर पर, काउचबेस 4.0 की रिलीज़ का मतलब है कि, आप पहली बार NoSQL में मूल JOIN कर सकते हैं। वे अपने स्वयं के N1QL का उपयोग करते हैं। यह JOIN
उनके ट्यूटोरियल से एक उदाहरण है :
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL अधिकांश के लिए अनुमति देता है अगर नहीं सभी एसग्रेग्रेगेशन, फ़िल्टरिंग आदि सहित एसक्यूएल संचालन।
एसओ-न्यू हाईब्रिड समाधान नहीं
यदि MongoDB अभी भी एकमात्र विकल्प है, तो मैं अपने बिंदु पर वापस जाना चाहूंगा कि एप्लिकेशन को डेटा की संरचना पर पूर्वता लेना चाहिए। कोई भी जवाब हाइब्रिड एम्बेडिंग का उल्लेख नहीं करता है, जिसके तहत अधिकांश क्वेरिड डेटा को दस्तावेज़ / ऑब्जेक्ट में एम्बेड किया जाता है, और मामलों की अल्पसंख्यक के लिए संदर्भ रखे जाते हैं।
उदाहरण: जानकारी (भूमिका नाम के अलावा) प्रतीक्षा कर सकते हैं? उपयोगकर्ता को अभी तक किसी भी चीज की आवश्यकता नहीं है, जो कुछ भी अनुरोध नहीं करने से एप्लिकेशन बूटस्ट्रैपिंग तेज हो सकता है?
यह मामला हो सकता है अगर उपयोगकर्ता लॉग इन करता है और उसे सभी भूमिकाओं के लिए सभी विकल्पों को देखने की जरूरत होती है। हालांकि, उपयोगकर्ता एक "इंजीनियर" है और इस भूमिका के लिए विकल्प शायद ही कभी उपयोग किए जाते हैं। इसका मतलब यह है कि आवेदन केवल एस / वह उन पर क्लिक करना चाहता है के लिए एक इंजीनियर के लिए विकल्प दिखाने की जरूरत है।
यह एक दस्तावेज के साथ प्राप्त किया जा सकता है जो शुरू में आवेदन को बताता है (1) जो उपयोगकर्ता को भूमिका देता है (2) जहां एक विशेष भूमिका से जुड़े किसी घटना के बारे में जानकारी प्राप्त करना है।
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
या, और भी बेहतर, भूमिकाओं के संग्रह में role.name फ़ील्ड को अनुक्रमणित करें, और आपको ऑब्जेक्ट () को एम्बेड करने की आवश्यकता नहीं हो सकती है।
एक और उदाहरण: सभी भूमिकाओं के बारे में जानकारी हर समय अनुरोध की जाती है?
यह भी हो सकता है कि उपयोगकर्ता डैशबोर्ड में प्रवेश करता है और 90% समय "इंजीनियर" की भूमिका से जुड़े कार्यों को करता है। हाइब्रिड एम्बेडिंग उस विशेष भूमिका के लिए पूरी तरह से किया जा सकता है और केवल बाकी के लिए संदर्भ रख सकता है।
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
स्कीमलेस होना सिर्फ NoSQL की विशेषता नहीं है, यह इस मामले में एक फायदा हो सकता है। यह उपयोगकर्ता ऑब्जेक्ट की "भूमिका" संपत्ति में विभिन्न प्रकार की वस्तुओं को घोंसले के लिए पूरी तरह से मान्य है।