कोर उत्तर
संरचना अपने पदों/डालता दस्तावेज है जो क्षेत्र आप इस प्रकार अद्वितीय रखना चाहते है के लिए:
एक view बनाएँ। मानचित्र फ़ंक्शन उस क्षेत्र का उपयोग करें जिसे आप कुंजी के रूप में अद्वितीय रूप से लागू करना चाहते हैं। मूल्य कुछ भी नहीं हो सकता है। अपनी प्रत्येक कुंजी के लिए गणना प्राप्त करने के लिए फ़ंक्शन को कम करें। सबसे अच्छा तरीका (प्रदर्शन के लिए) _count फ़ंक्शन को कम करने के लिए उपयोग करना है।
तुरंत बाद PUT/पोस्ट एक नए डेटाबेस में दस्तावेज़, लौटे id
और rev
और प्राप्त/yourdb/_design/yourapp/_view/VIEWNAME? समूह हड़पने = सच & key = "मूल्य -अप-अनूठा-फ़ील्ड-से-चरण -1 "।
पिछले का परिणाम प्राप्त आप से अन्य गिनती मूल्य देता है, तो आप सिर्फ एक नकली डाला। तत्काल DELETE/yourdb/आईडी-से-चरण -2? Rev = rev-from-step-2।
आराम।
असहज उदाहरण
कहते हैं कि तुम उपयोगकर्ता खातों भंडारण कर रहे हैं और क्या आप वाकई ईमेल पते अद्वितीय है बनाना चाहते चलें, लेकिन आप (यह दस्तावेज़ आईडी बनाने के लिए नहीं करना चाहते हैं जो कोई भी कारण के लिए)। ऊपर वर्णित ईमेल पते पर विशिष्टता की तुरंत जांच करने के लिए एक दृश्य बनाएं। आइए इसे ईमेल पर कॉल करें। इसमें नक्शा फ़ंक्शन संभवतः इस तरह के समान होगा ...
function(doc) {
if(doc.type === 'account') {
emit(doc.email, 1);
}
}
और बस _count
के रूप में कार्य कम। यदि आप से ऊपर _sum
जैसे काम करते हैं तो भी काम करेंगे। जैसा कि ऊपर दिखाया गया है, अपने दस्तावेज़ पर type
फ़ील्ड रखने और जांचना सिर्फ एक सम्मेलन है लेकिन मुझे कभी-कभी यह उपयोगी लगता है। यदि आप जो भी भंडारण कर रहे हैं वह उपयोगकर्ता खाते हैं, तो शायद आपको इसकी आवश्यकता नहीं है।
अब कहते हैं कि हम तो जैसे एक दस्तावेज़ डालने कर रहे हैं की सुविधा देता है ...
POST /mydb/
{
"name": "Joe",
"email": "[email protected]"
}
और CouchDB कुछ तरह के साथ जवाब देंगे ...
{
ok: true,
id: 7c5c249481f311e3ad9ae13f952f2d55,
rev: 1-442a0ec9af691a6b1690379996ccaba6
}
चेक अगर हम अब से अधिक है को देखने के लिए डेटाबेस में एक [email protected] ...
GET /mydb/_design/myapp/_view/emails/?group=true&key="[email protected]"
और कॉच डीबी कुछ ऐसा जवाब देगा ...
{
rows: [
{
key: "[email protected]",
value: 1
}
]
}
तो value
कि उत्तर में 1
के अलावा और कुछ है, तो आप शायद सिर्फ एक नकली ईमेल डाला। तो दस्तावेज़ को हटाएं और की पंक्तियों के साथ एक त्रुटि लौटाएं ईमेल पता विशिष्ट होना चाहिए, जो एक सामान्य SQL डेटाबेस प्रतिक्रिया या जो भी आप चाहते हैं।
हटाने कुछ इस तरह जाना होगा ...
DELETE /mydb/7c5c249481f311e3ad9ae13f952f2d55?rev=1-442a0ec9af691a6b1690379996ccaba6
लघु चर्चा (यदि आप परवाह)
आप एक अच्छे पुराने * एसक्यूएल पृष्ठभूमि से आ रहे हैं, इस गलत और अजीब लग रहा है। इससे पहले कि आप इन बिंदुओं पर विचार करें। किसी क्षेत्र पर बाधा होने के कारण, जैसे विशिष्टता या कुछ और, स्कीमा का तात्पर्य है। कॉच डीबी स्कीमालेस है। * एसक्यूएल से आने का मतलब है कि आपको जिस तरह से लगता है उसे बदलना होगा। एसीआईडी और ताले एकमात्र रास्ता नहीं हैं। कॉच डीबी बहुत लचीलापन और शक्ति के साथ आता है। आप जो भी चाहते हैं उसे प्राप्त करने के लिए आप इसका उपयोग अपने उपयोग के विवरण के विवरण पर निर्भर करते हैं और पारंपरिक संबंधपरक डेटाबेस सोच की सीमाओं से कितनी अच्छी तरह से बच सकते हैं।
कारण है कि मैं कभी कभी विशिष्टता इस तरह से है लागू क्योंकि यह मेरे लिए बहुत Couchy महसूस करता है। यदि आप सोफेडबी अपडेट टकरावों को संभालने के तरीके के बारे में सोचते हैं, तो यह दृष्टिकोण एक ही प्रवाह का पालन करता है। हम जो दस्तावेज़ दिया गया है उसे स्टोर करते हैं, फिर हम यह देखने के लिए जांच करते हैं कि हमारा क्षेत्र अद्वितीय है या नहीं। यदि नहीं, तो उस दस्तावेज़ को पकड़ो जिसे हमने अभी भी सुविधाजनक हैंडल द्वारा डाला है, और विशिष्टता की आवश्यकता को हल करने के लिए कुछ करें, उदाहरण के लिए इसे हटाना।
आप उपरोक्त आप POST
डॉक से पहले ई-मेल पता की विशिष्टता की जाँच करने के उदाहरण में परीक्षा जा सकता है। सावधान रहे!!यदि कई चीजें चल रही हैं, तो संभव है कि उसी ईमेल पते वाले दूसरे दस्तावेज़ को में के बाद डेटाबेस में डाला जा सके, आप जांचते हैं कि ईमेल मौजूद है या नहीं, से पहले आप POST
करते हैं! यह आपको डुप्लिकेट ईमेल के साथ छोड़ देगा।
POST
से पहले ईमेल पते के लिए चेक चलाने में कुछ भी गलत नहीं है। उदाहरण के लिए, यह एक अच्छा विचार है यदि आपका उपयोगकर्ता कोई फॉर्म भर रहा है और आप डेटाबेस में ईमेल फ़ील्ड मान को अजाक्स कर सकते हैं। आप उपयोगकर्ता को पूर्व-चेतावनी दे सकते हैं कि ईमेल पता मौजूद है या सबमिशन को रोकता है, आदि। हालांकि, सभी मामलों में, आपको भी के बाद POST
दस्तावेज़ के बाद विशिष्टता की जांच करनी चाहिए। फिर आवश्यकतानुसार प्रतिक्रिया दें। यूआई पक्ष के परिप्रेक्ष्य से, ऊपर दिए गए कदम एक विशिष्ट * एसक्यूएल डेटाबेस पक्की से प्राप्त विशिष्टता बाधा पर प्राप्त परिणाम से अलग नहीं होंगे।
क्या कुछ भी गलत हो सकता है? हाँ। इस पर विचार करो। मान लें [email protected] डेटाबेस में पहले से मौजूद नहीं है। डेटाबेस में सहेजे जाने के लिए लगभग एक ही समय में दो दस्तावेज़ आते हैं। डॉक्टर एक, POSTed
है तो डॉक्टर बीPOSTed
है, लेकिन इससे पहले कि हम डॉक्टर एकPOST
के लिए विशिष्टता की जांच करने में सक्षम हैं। तो अब जब हम डॉक एPOST
के लिए विशिष्टता की जांच करते हैं, तो हम देखते हैं कि [email protected] डेटाबेस में दो बार है। तो, हम इसे हटा देंगे और समस्या के साथ रिपोर्ट करेंगे। लेकिन इससे पहले कि हम डॉक ए हटा सकते हैं, डॉक बी के लिए विशिष्टता जांच भी होती है, [email protected] के लिए समान गणना मान प्राप्त करने से पहले भी होता है। अब POSTs
दोनों को खारिज कर दिया जाएगा, भले ही [email protected] मूल रूप से डेटाबेस में नहीं था! दूसरे शब्दों में, यदि मिलान करने वाले मूल्य वाले दो दस्तावेज़ लगभग एक ही समय में आपके ऐप में आते हैं, तो संभव कि वे एक-दूसरे को POSTs
देख सकते हैं और गलती से निष्कर्ष निकाल सकते हैं कि वे जो मान लेते हैं वह पहले ही डेटाबेस में है! हम वास्तव में इसे रोक नहीं सकते क्योंकि CouchDB में कोई पारंपरिक आरडीबी शैली लॉक नहीं है। लेकिन उस छोटी कीमत के बदले में, हमें मास्टर-मास्टर प्रतिकृति और अन्य शांत सामानों का एक टन मिलता है। मैं इसे ले जाऊँगा! और यदि यह आपके कार्यान्वयन के लिए एक बड़ी समस्या है, तो आप किसी प्रकार के पुन: प्रयास तंत्र को लागू करके इसे संबोधित करने का प्रयास कर सकते हैं।
अंत में, कॉच डीबी वास्तव में डेटाबेस का एक मणि है, लेकिन इसे न लें और यह एक बुलेटप्रूफ दृष्टिकोण होने की उम्मीद है। वास्तव में आपके विशिष्ट एप्लिकेशन के विवरण पर निर्भर रहने जा रहा है।
हाँ, यह एक समाधान है, लेकिन व्यक्तिगत रूप से मैं रेडिस के साथ लॉक करना पसंद करता हूं। इस तरह के समाधान अजीब लग रहे हैं जब डेवलपर्स आरडीबीएमएस दुनिया से आ रहे हैं। आरडीबीएमएस के बाद कॉच डीबी अलग है, लेकिन क्या हमें सभी मौजूदा प्रथाओं को खारिज कर देना चाहिए? कोई एसीआईडी और ताले नहीं हैं, लेकिन इन सभी चीजों के बिना आराम करना और केवल एप्लिकेशन लिखना असंभव है। कॉच डीबी की प्रमुख विशेषताएं गायब हैं और यह दुखद है। – Sam
दस्तावेज़ आईडी में जोड़ने से पहले अद्वितीय मान को छेड़छाड़ करना उन विशेषताओं को जोड़ने के लिए अधिक सुविधाजनक बनाता है जिनमें विशेष वर्ण हो सकते हैं। –
ध्यान दें कि यदि आप चीजों को बहु-मास्टर अनुकूल रखने की योजना बनाते हैं, तो बिंदु 2।** ** ** विफल नहीं होगा जब तक कि * वर्तमान * नोड पर कुंजी पहले से मौजूद न हो। कुंजी नोड पर केवल अनूठी हैं जिन पर वे मौजूद हैं। इस समस्या के लिए एक सरल क्लस्टर अनुकूल समाधान के लिए रैफी एम के जवाब देखें। – user1973386