2010-04-19 10 views
5

मुझे आश्चर्य है कि वास्तव में एक कॉच डीबी डेटाबेस बी-पेड़ में क्या संग्रहीत किया जाता है? CouchDB: The Definitive Guide बताता है कि एक डेटाबेस बी-पेड़ का उपयोग केवल परिचालन के लिए किया जाता है और यह कि डेटाबेस एक बी-पेड़ (प्रति-दृश्य बी-पेड़ के अलावा) में संग्रहीत होता है।वास्तव में CouchDB में बी-पेड़ डेटाबेस में कौन सा डेटा संग्रहीत किया जाता है?

तो मुझे लगता है कि डेटा आइटम डेटाबेस फ़ाइल के साथ जोड़े जाते संशोधन दस्तावेजों के, न कि पूरी दस्तावेज हैं:

  +---------|### ... 
      |   | 
    +------|###|------+  ... ---+ 
    |  |  |   | 
+------+ +------+ +------+  +------+ 
| doc1 | | doc2 | | doc1 | ... | doc1 | 
| rev1 | | rev1 | | rev2 |  | rev7 | 
+------+ +------+ +------+  +------+ 

यह सच है?

यदि यह सत्य है, तो इस तरह के बी-पेड़ के आधार पर दस्तावेज़ का वर्तमान संशोधन कैसे निर्धारित किया जाता है?

इसका मतलब यह नहीं है कि CouchDB को O12 (लॉग n) पहुंच को संरक्षित करने के लिए दस्तावेज़ों के वर्तमान संशोधन अनुक्रमणित करने के लिए एक अलग "दृश्य" डेटाबेस की आवश्यकता है? ऐसी इंडेक्स बनाने के दौरान यह दौड़ की स्थिति का नेतृत्व नहीं करेगा? (जहां तक ​​मुझे पता है, कॉच डीबी कोई लिखने वाले ताले का उपयोग नहीं करता है)।

+1

इसे 'erlang' के रूप में क्यों टैग किया गया है? – Zed

+0

@ जेड हाँ, यह यहां अप्रासंगिक है। –

+1

कॉच डीबी निश्चित रूप से * करता है * serialize लिखता है। फ़ाइल में डेटा लिखने के लिए एक एरलांग प्रक्रिया है। सभी लिखना उस प्रक्रिया के मेलबॉक्स के माध्यम से जाना चाहिए जो पाठ्यक्रम के Erlang serializes। – JasonSmith

उत्तर

3

डिस्क पर डेटाबेस फ़ाइल केवल संलग्न है; हालांकि बी-पेड़ अवधारणात्मक रूप से जगह में संशोधित है। आप किसी दस्तावेज़ को अपडेट करने पर

  1. इसकी पत्ती नोड लिखा है
  2. इसके माता-पिता नोड नई पत्ती को संदर्भित करने के
  3. दोहराएँ (बेशक संलग्न के माध्यम से) फिर से लिखा है (DB फाइल करने के लिए संलग्न के माध्यम से) चरण 2 जब तक आप रूट नोड

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

+0

यह अभी भी अस्पष्ट है जब विजेता संशोधन (http://books.couchdb.org/relax/reference/conflict-management) निर्धारित करने के लिए एल्गोरिदम वर्तमान दस्तावेज़ संशोधन लुकअप के दौरान खेल में आता है। यदि उपयोगकर्ता कुंजी आईडी 1 के साथ दस्तावेज़ पढ़ रहा है, तो आपके द्वारा वर्णित योजना के मुताबिक उसे ** नवीनतम लिखित ** संशोधन मिलेगा (एरलांग प्रक्रिया का उपयोग करके धारावाहिक लिखने पर आपके बिंदु के लिए धन्यवाद) ** ** नहीं एक जीतना **। –

+0

मुझे लगता है मुझे स्रोत कोड में खोदने की जरूरत है। यह काफी देखने योग्य है: 18 केएलसीसी। –

+0

संघर्ष प्रबंधन एल्गोरिदम तय करता है कि उन्हें किस क्रम में स्टोर करना है (यानी यह संशोधित 4 प्राप्त करता है और उसे संशोधित 5 या इसके विपरीत) मिलता है। आईडी द्वारा एक साधारण लुकअप हमेशा संग्रहीत नवीनतम संशोधन प्राप्त करता है। इस उदाहरण में, संशोधन 5 "विजेता" होगा। एप्लिकेशन 4 और 5 की राशि 6 ​​संशोधन करके एक और अर्थपूर्ण रूप से विवाद को विलय करना चाहता है। – JasonSmith

1

कॉच डीबी diffs स्टोर नहीं करता है। जब आप कोई दस्तावेज़ अपडेट करते हैं, तो यह पूरे नए दस्तावेज़ को नए _rev और पुराने संस्करण के समान _id के साथ जोड़ता है। पुराने संस्करण को compaction के दौरान हटा दिया जाता है।

+0

हां, कॉच डीबी diffs को स्टोर नहीं करता है। मेरा सवाल यह है कि यह दोनों लिखने-केवल सहेजने के लिए आंतरिक रूप से दस्तावेज़ों को कैसे स्टोर करता है * और * मौजूदा संस्करण पुनर्प्राप्ति, ताले के बिना? –