2011-11-24 18 views
7

मैं एक CouchApp (कोई मिडलवेयर) के लिए सबसे अच्छा तरीका तय करने का प्रयास कर रहा हूं। चूंकि मेरे विचार की समानताएं हैं, मान लीजिए कि हमारे पास एक कॉच डीबी में संग्रहीत स्टैक ओवरफ्लो पृष्ठ है। संक्षेप में इसमें शीर्ष, उत्तर और धूमकेतु पर वास्तविक प्रश्न शामिल है। वे मूल रूप से तीन परतें हैं।कॉच डीबी: एकल दस्तावेज़ बनाम "जुड़ने" दस्तावेज़ एक साथ

इसे संग्रहीत करने के दो तरीके हैं। या तो डेटा के उपयुक्त JSON प्रतिनिधित्व वाले एक दस्तावेज़ के भीतर, या एक अलग दस्तावेज़ के भीतर प्रविष्टि के प्रत्येक भाग को बाद में एक दृश्य के माध्यम से संयोजित करें (इस प्रकार: http://www.cmlenz.net/archives/2007/10/couchdb-joins)

अब, दोनों दृष्टिकोण ठीक हो सकते हैं, फिर भी मेरे वर्तमान दृष्टिकोण से दोनों बड़े पैमाने पर डाउनसाइड्स हैं। एक व्यस्त दस्तावेज़ संग्रहीत करना (एकाधिक उपयोगकर्ताओं के माध्यम से कई परिवर्तन अपेक्षित हैं) क्योंकि सिग्नल इकाई विवादों का कारण बनती है। यदि उपयोगकर्ता ए दस्तावेज़ में अपने परिवर्तनों को संग्रहीत करता है, तो उपयोगकर्ता बी को उसके अपडेट को टाइप करने के बाद एक संघर्ष त्रुटि प्राप्त होगी। मैं कल्पना कर सकता हूं कि पुनः प्रयास करने से पहले दस्तावेज़ को फिर से डाउनलोड करने के माध्यम से उपयोगकर्ताओं के ज्ञान के बिना इसे ठीक करना संभव है।

Multi User Update problem

लेकिन क्या होगा अगर दस्तावेज़ नहीं बल्कि बड़ा है? मैं उन्हें समय के साथ उड़ा दिया जाएगा, जो एक बचत प्रक्रिया पर काफी ध्यान देने योग्य देरी करेगा, विशेष रूप से यदि एक ही समय में एक दस्तावेज़ को अद्यतन करने वाले कई उपयोगकर्ताओं के कारण पुनः प्रयास प्रक्रिया कई बार होनी चाहिए।

एक और समस्या जो मैं देख रहा हूं वह संपादन कर रहा है। प्रत्येक उपयोगकर्ता को उसके योगदान को संपादित करने की अनुमति दी जानी चाहिए। अब, अगर वे एक दस्तावेज़ में संग्रहीत हैं तो ठोस ऑथ हैंडलर लिखना मुश्किल हो सकता है।

ठीक है, अब कई दस्तावेज़ दृष्टिकोण देखें। प्रश्न, उत्तर और टिप्पणियां अपने दस्तावेजों के भीतर संग्रहित की जाएंगी। लाभ: दस्तावेज़ के वास्तविक मालिक केवल विवाद पैदा कर सकते हैं, ऐसा कुछ जो अक्सर नहीं होता है। पूरे के बजाय छोटे तत्व होने के कारण, पुनः लोड करने में अधिक समय नहीं लगेगा। इसके अलावा ऑथ रूटीन को महसूस करना काफी आसान होना चाहिए।

अब यहां नकारात्मक है। एकल दस्तावेज़ क्वेरी और डिस्प्ले के लिए वास्तविक आसान है। आस-पास बिछाने वाले बहुत सारे अनगिनत स्निपेट्स एक गन्दा चीज की तरह लगते हैं क्योंकि मुझे वास्तव में 100% तैयार करने के लिए वास्तविक दृश्य नहीं मिला है जो कि जेएसओएन ऑब्जेक्ट का उपयोग करने के लिए तैयार है जिसमें पूरे आइटम को ऑर्डर और संरचित प्रारूप में शामिल किया गया है।

enter image description here

मुझे आशा है कि मैं वास्तविक समस्या संवाद करने में सक्षम किया गया है। मैं यह तय करने का प्रयास करता हूं कि कौन सा समाधान मेरे लिए अधिक उपयुक्त होगा, जो समस्याओं को दूर करना आसान है। मैं भंडारण और पूछताछ के मामले में सुंदर होने का पहला समाधान कल्पना करता हूं, फिर भी दूसरा दृश्य दृश्य के भीतर बेहतर कुंजी प्रबंधन के माध्यम से अधिक व्यावहारिक है (मैं पूरी तरह से कुंजी के सिद्धांत में नहीं हूं)।

आप पहले से आपकी मदद की :)

उत्तर

8

अपने दूसरे विकल्प के साथ जाओ के लिए बहुत बहुत धन्यवाद। संघर्षों से निपटने के मुकाबले यह बहुत आसान है। यहाँ कुछ उदाहरण डॉक्स मैं डेटा कैसे तैयार कर सकते हैं:

{ 
    _id: 12345, 
    type: 'question', 
    slug: 'couchdb-single-document-vs-joining-documents-together', 
    markdown: 'Im tryting to decide the best approach for a CouchApp (no middleware). Since there are similarities to...' , 
    user: 'roman-geber', 
    date: 1322150148041, 
    'jquery.couch.attachPrevRev' : true 
} 
{ 
    _id: 23456, 
    type: 'answer' 
    question: 12345, 
    markdown: 'Go with your second option...', 
    user : 'ryan-ramage', 
    votes: 100, 
    date: 1322151148041, 
    'jquery.couch.attachPrevRev' : true 
} 
{ 
    _id: 45678, 
    type: 'comment' 
    question: 12345, 
    answer: 23456, 
    markdown : 'I really like what you have said, but...' , 
    user: 'somedude', 
    date: 1322151158041, 
    'jquery.couch.attachPrevRev' : true 
} 

हर एक के संशोधन की दुकान करने के लिए, के रूप में दस्तावेज़ पर संलग्नक संपादित किया जा रहा मैं पुराने संस्करणों संग्रहीत करेंगे। यदि आप couchdb के लिए jquery क्लाइंट का उपयोग करते हैं, तो आप jquery.couch.attachPrevRev = true जोड़कर इसे मुफ्त में प्राप्त कर सकते हैं।देखें Versioning docs in CouchDB by jchris

इस

fullQuestion : { 
    map : function(doc) { 
     if (doc.type == 'question') emit([doc._id, null, null], null); 
     if (doc.type == 'answer') emit([doc.question, doc._id, null], null); 
     if (doc.type == 'comment') emit([doc.question, doc.answer, doc._id], null) ; 
    } 
} 

की तरह एक दृश्य बनाएँ और यह

http://localhost:5984/so/_design/app/_view/fullQuestion?startkey=['12345']&endkey=['12345',{},{}]&include_docs=true 

(नोट: मैं इस क्वेरी इनकोडिंग यूआरएल नहीं किया है, लेकिन इसे और अधिक पठनीय है) की तरह दृश्य क्वेरी

यह आपको इस प्रश्न के लिए सभी संबंधित दस्तावेज प्राप्त करेगा कि आपको पृष्ठ बनाने की आवश्यकता होगी। एकमात्र चीज यह है कि उन्हें तारीख तक हल नहीं किया जाएगा। आप उन्हें क्लाइंट साइड (जावास्क्रिप्ट में) पर सॉर्ट कर सकते हैं।

संपादित: यहाँ देख सकते हैं और क्वेरी

आपके डोमेन के आधार पर, आप कुछ तथ्य पता है के लिए एक वैकल्पिक विकल्प है। आप जानते हैं कि एक प्रश्न मौजूद होने से पहले एक उत्तर मौजूद नहीं है, और उत्तर के अस्तित्व से पहले उत्तर पर एक टिप्पणी मौजूद नहीं हो सकती है। तो एक राय यह है कि यह तेजी से प्रदर्शन पृष्ठ बनाने के लिए कर सकता है की सुविधा देता है, चीजों के आदेश का सम्मान:

fullQuestion : { 
    map : function(doc) { 
     if (doc.type == 'question') emit([doc._id, doc.date], null); 
     if (doc.type == 'answer') emit([doc.question, doc.date], null); 
     if (doc.type == 'comment') emit([doc.question, doc.date], null); 
    } 
} 

यह सभी संबंधित दस्तावेज़ों को एक साथ रखना होगा, और उन्हें तिथि के अनुसार क्रमबद्ध रहते हैं। यहां एक नमूना क्वेरी

http://localhost:5984/so/_design/app/_view/fullQuestion?startkey=['12345']&endkey=['12345',{}]&include_docs=true 

यह उन सभी दस्तावेज़ों को वापस ले जाएगा जिन्हें आपको सबसे पुराना से नवीनतम आदेश दिया गया है। अब आप परिणामों के माध्यम से ज़िप कर सकते हैं, जानते हुए भी कि माता पिता वस्तुओं बच्चे लोगों से पहले हो जाएगा, इस तरह:

function addAnswer(doc) { 
    $('.answers').append(answerTemplate(doc)); 
} 

function addCommentToAnswer(doc) { 
    $('#' + doc.answer).append(commentTemplate(doc)); 
} 

$.each(results.rows, function(i, row) { 
    if (row.doc.type == 'question') displyQuestionInfo(row.doc); 
    if (row.doc.type == 'answer') addAnswer(row.doc); 
    if (row.doc.type == 'comment') addCommentToAnswer(row.doc) 
}) 

तो फिर तुम न किसी भी ग्राहक के पक्ष छंटाई प्रदर्शन करने के लिए किया है।

उम्मीद है कि इससे मदद मिलती है।

+0

हाय रयान! आपके विस्तृत और समझने योग्य उत्तर के लिए बहुत बहुत धन्यवाद। आपने मुझे कुछ चीजें बताईं जिन्हें मैं अभी तक नहीं जानता था। मैंने दूसरे विकल्प के पहले संस्करण को जल्दी से कार्यान्वित करने में कामयाब रहा है, फिर भी यह आपके इनपुट के आधार पर इसे ट्विक कर देगा। आपका बहुत बहुत धन्यवाद! :) –

संबंधित मुद्दे