2011-01-23 16 views
19

में "स्कीमा" बदलना बस मेरे ज्ञान का विस्तार करने के हित के लिए मैंने विभिन्न NoSQL विकल्पों को देखना शुरू कर दिया है। मैंने जो पहला देखा वह रावेनडीबी है और यह दिलचस्प लग रहा है। मैं अभी भी सामान्य आरडीबीएमएस रखरखाव दिनचर्या के साथ-साथ अपनी गहरी बैठे संबंधपरक सोच को तोड़ने की कोशिश कर रहा हूं।RavenDB

मेरे दिन-प्रति-दिन एंटिटी फ्रेमवर्क से निपटने में हम डीबी परिवर्तनों की रीडिंग के माध्यम से जाते हैं, ईएफ मैपिंग मॉडल को रीफ्रेश करते हैं, आदि। यह नोएसक्यूएल सामान, विशेष रूप से रावेनडीबी में कैसे काम करता है? एक बार ऐप जीवन चला गया है, तो कैसे विभिन्न पीओसीओ वस्तुओं आदि में परिवर्तन करता है और इसे उत्पादन में तैनात करता है? पुरानी पीओसीओ कक्षाओं में संग्रहीत डेटा का क्या होता है?

मैंने अभी तक क्रोध में गहरा या उपयोग किया गया रावेन डीबी नहीं निकाला है। ऐसा करने के बाद यह स्पष्ट हो सकता है लेकिन हाथ से पहले जानना अच्छा लगेगा, इसलिए मैं खुद को कोने में कोड नहीं करता हूं।

धन्यवाद, डी

+0

निश्चित रूप से मुझे कुछ याद आ रहा है, लेकिन आईआईआरसी जो एक * स्कीमा-कम * दस्तावेज़ डेटाबेस है, इसलिए केवल एकमात्र जवाब है "कुछ भी नहीं होता"। वे अभी भी उसी प्रारूप में मौजूद हैं जो आपने उन्हें * इन * में रखा है ...? –

+1

बहुत अच्छा मुद्दा ... अरे पारंपरिक रिलेशनल स्पेस से मेरा सिर मुश्किल हो रहा है! – codedog

+0

@ कोडिडॉग मुझे लगता है कि परंपरा पारंपरिक संबंधपरक जगह से बाहर निकलने के लिए जरूरी नहीं है, लेकिन यह समझने के लिए कि प्रत्येक लक्ष्य के एक अलग सेट के साथ एक उपकरण है। हम अपने आवेदन में एक संबंधपरक डेटाबेस और NoSQL डेटाबेस दोनों का उपयोग करते हैं। आप केवल एक हथौड़ा के साथ एक पूरा घर नहीं बनायेगा। इसी तरह, आप केवल एक आंख के साथ एक घर नहीं बनायेगा। – Brain2000

उत्तर

27

वे रहने के रूप में वे कर रहे हैं - अब और मौजूदा नहीं गुण जब लोड हो रहा है पर ध्यान नहीं दिया जाएगा (और परिवर्तन पर खो दिया है), और लापता गुण वापस अशक्त के रूप में आ जाएगा,

आप सिफारिश ऑब्जेक्ट मॉडल के साथ डेटा को रखने के लिए सेट आधारित संचालन का उपयोग करें।

ओह, मुझे देखो, मैं अब कंप्यूटर पर हूं!

ठीक उसी तरह, मूल रूप से, एक दस्तावेज़ स्टोर में जाने में आप यह स्वीकार करने में सही हैं कि आप कुछ कार्यक्षमता खो देते हैं और डेटाबेस में उसमें कुछ स्वतंत्रता प्राप्त करते हैं, आपके पास एक शीर्ष-स्कीमा परिभाषित है और डेटा अपलोड करने का प्रयास कर रहा है जो ' टी स्कीमा से मेल खाता है एक त्रुटि होगी।

हालांकि यह पहचानना महत्वपूर्ण है कि स्कीमा-कम और संरचना-कम के बीच एक अंतर है, जिसमें आपके दस्तावेज़ों में सभी की अपनी संरचना होती है (कुंजी/मूल्य जोड़े संपत्ति का नाम और संपत्ति मूल्य दर्शाती हैं)।

यह कुछ कोड लिखने के लिए "बस हो रहा है" कारक के लिए उपयोगी बनाता है और आपका डेटा जारी रहता है - लेकिन जब आपकी कोड संरचना को बदलने के लिए जाना इतना आसान होता है तो यह आपके साथ पहले से ही जारी रहना मुश्किल हो सकता है डेटा।

कुछ रणनीतियों के लिए खुद को इस बिंदु पर मौजूद:

  • अपने संरचना अपरिवर्तनीय बनाओ एक बार आप डेटा कायम किया है, संस्करण अपनी कक्षाओं
  • संरचना बदलाव की अनुमति दें, लेकिन आपरेशन सेट के आधार पर उपयोग करने के लिए डेटा को अद्यतन करने नई संरचना से मेल
  • संरचना बदलाव की अनुमति दें, और विसंगतियों से निपटने के लिए कोड लिखने जब डेटा

तीसरा स्पष्ट है लोड हो रहा है एक बुरा विचार है क्योंकि यह अनजान कोड का कारण बन जाएगा, आपके वर्गों का संस्करण काम कर सकता है यदि आप केवल घटनाओं या ऐसे अन्य डेटा संग्रहीत कर रहे हैं लेकिन अधिकांश परिदृश्यों के लिए वास्तव में उपयुक्त नहीं है, इसलिए आपको मध्य विकल्प के साथ छोड़ दिया गया है।

मैं बस ऐसा करने की अनुशंसा करता हूं, और कुछ सरल नियमों का पालन करता हूं जैसे आप एक रिलेशनल डेटाबेस में अप-फ्रंट स्कीमा से निपटने के दौरान अनुसरण करेंगे।एक दस्तावेज़ लोड और दस्तावेज़ को सहेजने परिणाम देगा के रूप में -

  • तैनात संस्करणों
  • लिखें माइग्रेशन स्क्रिप्ट के बीच परिवर्तन है कि एक संस्करण से नवीनीकृत एक और
  • को/renames से सावधान रहें गुण को हटाने निर्धारित करने के लिए अपने VCS प्रणाली का उपयोग करें जिससे डेटा की उन गुणों नया दस्तावेज़ पर मौजूद नहीं हैं, तो

आदि

मुझे आशा है कि यह वह जगह है और अधिक उपयोगी :-)

+1

मैं एक और पूर्ण उत्तर दूंगा, लेकिन फोन पर हूं –

+1

एक पूर्ण उत्तर से प्यार होगा, लेकिन मुझे लगता है कि आप सभी लोगों ने पूरे बिंदु को सारांशित करने से पहले क्या कहा है। मैं कल्पना करने की कोशिश कर रहा हूं कि एम्बेडेड रावेनडीबी चलाने वाली वेबसाइट को बनाए रखना कैसा होगा। मेरे पास काम में एक एमवीसी 3 साइट है, वर्तमान में ईएफ 4 का उपयोग कर रही है। डीएएल को बाहर निकालने और इसे RavenDB के साथ बदलने के लिए बहुत मोहक! – codedog

+0

इसे मानें –

3

रावेनडीबी आपके .NET ऑब्जेक्ट्स को जेएसओएन प्रारूप में क्रमबद्ध करता है। कोई स्कीमा नहीं है।

यदि आप अपने डेटाबेस में कुछ ऑब्जेक्ट्स जोड़ते हैं, तो उन्हें क्रमबद्ध किया जाएगा। यदि आप उस प्रकार के कुछ गुण जोड़ते हैं जिन्हें आप क्रमबद्ध कर रहे हैं, तो आपके द्वारा पहले से संग्रहीत वस्तुओं को वे गुण अनुपलब्ध होंगे।

2

आपके पास अपने कोड में स्थानांतरित होने के रूप में कोई स्कीमा प्रबंधन नहीं है, इसलिए आपके कोड में और आपके डेटाबेस में मौजूद वस्तुओं के बीच कोई मेल नहीं है।

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

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

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

+0

आप वाक्यांश का उपयोग करते हैं "... यह सुनिश्चित करने के लिए कि आप एक धारावाहिक का उपयोग करें ..."। मुझे लगता है कि आपकी सलाह RavenDB के लिए विशिष्ट नहीं है? रावेनडीबी की सीमित समझ में मैंने सोचा कि इसमें एक अंतर्निहित धारावाहिक है, यानी मुझे कुछ ऐसा नहीं करना है जो मुझे खुद को संभालना है। क्या यह सही नहीं है? – codedog

+0

हां, यह जेनेरिक नोएसक्यूएल दस्तावेज़/ऑब्जेक्ट स्टोरेज के लिए है - मैं ज्यादातर रेडिस में जेएसओएन का उपयोग करता हूं। रेवेन के साथ यदि आप की आवश्यकता है तो आप कस्टम सीरिएलाइज़र निर्दिष्ट कर सकते हैं, लेकिन मानक एक आपको विशेषताओं का उपयोग करके आवश्यक/वैकल्पिक/अनदेखा फ़ील्ड सेट करने देता है। –

3

Ayende द्वारा यह आलेख वर्णन करता है कि कैसे (संस्करण 2 1 से माइग्रेशन निष्पादित करने के लिए इस मामले में एक "नाम" संपत्ति को "प्रथम" और "अंतिम नाम" गुणों को बदलने में।

http://ayende.com/blog/66563/ravendb-migrations-rolling-updates

मूल रूप से एक श्रोता DocumentStore में पंजीकृत है:

:

documentStore.RegisterListener(new CustomerVersion1ToVersion2Converter()) 

नमूना impementation लेख से लिया कि ऊपर उल्लेख किया