2008-09-24 22 views
8

रेल ActiveRecord API का उपयोग कर मॉडल परिवर्तनों से निपटने के लिए माइग्रेशन की अवधारणा का उपयोग करता है।कॉच डीबी दस्तावेज़ मॉडल परिवर्तन?

कॉच डीबी अपने मॉडल ऑब्जेक्ट्स का प्रतिनिधित्व करने के लिए JSON (नेस्टेड मानचित्र और सरणी) का उपयोग करता है।

अब तक कॉच डीबी के साथ काम करने में, मुझे दस्तावेज़ की संरचना बदलने के बाद (डेवलपर के रूप में अनुशासित होने के अलावा), या पुराने से नए मॉडल तक माइग्रेट करने के लिए पहचानने के अच्छे तरीके नहीं दिखते हैं।

क्या मौजूदा विशेषताएं हैं या आपके पास कॉच डीबी में मॉडल परिवर्तनों को संभालने के लिए सर्वोत्तम प्रथाएं हैं?

उत्तर

9

आरडीबीएमएस डी-ब्रेनवॉशिंग के लिए समय। :)

सोफेड के स्कीमा-कम डिज़ाइन के सबसे बड़े बिंदुओं में से एक सीधे माइग्रेशन की आवश्यकता को रोकने के लिए लक्षित है। ऑब्जेक्ट्स का JSON प्रतिनिधित्व केवल आपके ऑब्जेक्ट्स को बतख करना आसान बनाता है।

उदाहरण के लिए, यह देखते हुए कि आपके पास ब्लॉग के साथ एक ब्लॉग प्रकार का वेब ऐप है और जो भी फैंसी चीजें लोग ब्लॉग में स्टोर करते हैं। आपके पोस्ट दस्तावेज़ों में लेखक, शीर्षक, इत्यादि जैसे फ़ील्ड हैं। अब आप साथ आते हैं और खुद से सोचते हैं, "मुझे ट्रैक करना चाहिए कि जब मैं अपनी पोस्ट प्रकाशित करता हूं तो चंद्रमा किस चरण में होता है ..." आप केवल चांद_फेज जोड़ना शुरू कर सकते हैं नई पोस्ट के लिए एक विशेषता।

यदि आप पूरा होना चाहते हैं तो आप वापस जाएंगे और पुरानी पोस्ट में moon_phase जोड़ देंगे, लेकिन यह कड़ाई से जरूरी नहीं है।

अपने विचारों में, आप moon_phase को एक विशेषता के रूप में एक्सेस कर सकते हैं। और यह शून्य हो जाएगा या अपवाद या कुछ कारण होगा। (एक जेएस विशेषज्ञ नहीं, मुझे लगता है कि शून्य सही जवाब है)

बात यह है कि इससे कोई फर्क नहीं पड़ता। यदि आप कुछ बदलना चाहते हैं तो बस इसे बदलें। हालांकि सुनिश्चित करें कि आपके विचार उस परिवर्तन को समझते हैं। जो मेरे अनुभव में वास्तव में ज्यादा आवश्यकता नहीं है।

इसके अलावा, अगर तुम सच में पागल हो, तो आप एक संस्करण/प्रकार विशेषता के रूप में संग्रहीत कर सकता है,:

{ 
    _id: "foo-post", 
    _rev: "23490AD", 
    type: "post", 
    typevers: 0, 
    moon_phase: "full" 
} 

आशा है कि मदद करता है।

3

चेक बाहर ActiveCouch: http://code.google.com/p/activecouch/

CouchDB स्कीमा-कम उद्देश्य पर है, इसलिए वहाँ एक CouchDB बराबर करने के लिए ActiveRecord माइग्रेशन से अवधारणाओं का एक 1 से 1 मानचित्रण नहीं है। हालांकि, एक्टिवचच में कॉच डीबी के "विचार" के लिए माइग्रेशन शामिल हैं।

+1

ऐसा लगता है कि सक्रियकच अब गिटहब पर है - http://github.com/arunthampi/activecouch/tree/master – Evan

3

यदि आप स्कीमा ले रहे हैं और अभी भी कॉच डीबी का उपयोग करना चाहते हैं तो आपको "प्रतिबाधा मेल नहीं मिला"।

फिर भी, "माइग्रेशन" होना मुश्किल नहीं है। प्रत्येक दस्तावेज़ में schema_version तत्व जोड़ें। फिर अपने "दस्तावेज़ पढ़ने का फ़ंक्शन" अपडेट करना शामिल है। कुछ इस तरह:

def read(doc_id): 
    doc = db.get(doc_id) 
    if doc.schema_version == 1: 
     # version 1 had names broken down too much 
     doc.name = "%s %s" % (doc.first, doc.last) 
     del doc.first 
     del doc.last 
     doc.schema_version = 2 
     db.put(doc) 
    if doc.schema_version == 2: weight 
     # version 2 used kg instead of g 
     doc.weight_g = doc.weight_kg * 1000 
     del doc.volume_kg 
     doc.schema_version = 3 
     db.put(doc) 
    return doc 

आप में पूरे डीबी उन्नत करने के लिए चाहते हैं, तो एक बार बस हर दस्तावेज के लिए read(doc_id) कहते हैं।

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