2011-12-22 9 views
5

सबसे पहले, एक चेतावनी: मैं दस्तावेज़ डेटाबेस के पीछे अवधारणाओं के लिए नया हूं, इसलिए यह एक पूरी तरह से स्पष्ट सवाल हो सकता है।क्या RavenDB इस अवधारणा के लिए एक अच्छा फिट है?

मुझे ऐसी प्रणाली तैयार करने की आवश्यकता है जो अत्यधिक जटिल उत्पादों को बनाने वाले हिस्सों की गहरी पदानुक्रमित सूची बनाए रखे। यह भौतिक घटकों को विस्तारित करेगा जो प्रत्येक भाग को बनाते हैं - और प्रत्येक भाग अन्य भागों के घटक हो सकता है - सभी तरह से अंतिम उत्पाद तक। इस तरह:

Widget 
|- Sprocket 
| |- A4 nut 
| |- B15 screw 
| |- Sprocket Backshell 
|- Flange 
| |- A4 washer 
| |- Flange Housing 
|- Widget Assembly 

इस उदाहरण में विजेट को बाद में किसी अन्य उत्पाद के नीचे एक भाग के रूप में शामिल किया जा सकता है।

प्रत्येक उत्पाद में सैकड़ों हजारों हिस्सों में हजारों शामिल हो सकते हैं और प्रत्येक प्रकार के घटक में अलग-अलग, असंबद्ध गुण होते हैं जिन्हें बनाए रखा जाना चाहिए। इन गुणों में संबंधित भागों के बीच कनेक्शन शामिल हो सकते हैं।

हमारे पास इस प्रणाली का एक खराब-डिज़ाइन किया गया संस्करण है, एसक्यूएल सर्वर में, लगभग 120 कॉलम और कई मिलियन रिकॉर्ड वाले एक फ्लैट टेबल के रूप में। इस तालिका में लगभग 85% फ़ील्ड शून्य हैं। मेरा काम कुछ और अधिक रखरखाव और कुशल और कम त्रुटि-प्रवण के साथ इसे प्रतिस्थापित करना है।

एक संबंधपरक डेटाबेस में इसे कुशलता से बनाना सामान्यीकरण का मतलब होगा - इस मामले में, प्रत्येक प्रकार के हिस्से के लिए एक टेबल है। यह एक ऐसी समस्या होगी जो मुझे संदेह है क्योंकि सैकड़ों भाग प्रकार हैं, और अपने स्वयं के विशिष्ट गुणों के साथ नए भाग प्रकार नियमित रूप से जोड़े जाते हैं।

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

क्या रावेनडीबी इस अवधारणा के लिए उपयुक्त है? दस्तावेजों में इसका प्रतिनिधित्व करने के तरीके पर कोई संकेतक हैं?

उत्तर

5

एरिक, क्या एक दस्तावेज़ डेटाबेस इस स्थिति में एक अच्छा फिट है और किस प्रकार की संरचना सबसे अच्छी होगी इस बात पर निर्भर करती है कि आप इस डेटा पर किस तरह के संचालन करना चाहते हैं।

आप निश्चित रूप से अपने भागों और उत्पादों लागू करने के लिए है, लेकिन सवाल का जवाब देने RavenDB उपयोग कर सकते हैं, तो आप निम्नलिखित प्रश्न का जवाब देना होगा अगर यह एक अच्छा विकल्प है:

  • आप प्रश्नों किस तरह की जरूरत है?
  • आपके सिस्टम के लिए अधिक प्रदर्शन-महत्वपूर्ण क्या है, पढ़ता है या लिखता है?
  • क्या आप अंतिम स्थिरता के साथ रह सकते हैं?
  • क्या आप मानचित्र/इंडेक्स को कम करने जैसी सुविधाओं का लाभ उठा सकते हैं?
  • आदि
+0

यह मेरे प्रश्न का बहुत अधिक जवाब देता है - मुझे नहीं लगता कि रावेनडीबी यहां एक अच्छा फिट होगा। अंततः स्थिरता यहां एक समस्या होगी - मैं उस विशेषता के बारे में भूल गया था - और मानचित्र/कमी इस समस्या के साथ मुझे बहुत मदद नहीं करेगी, मुझे नहीं लगता। शर्म - मुझे भागों के डेटा को संग्रहीत करने के लिए दस्तावेज़ डेटाबेस की गतिशील स्कीमा प्रकृति पसंद है, लेकिन मुझे नहीं लगता कि मैं ग्राहक को दो स्वतंत्र डेटाबेस बनाए रखने पर साइन इन करने में सक्षम हूं ... –

+0

यह एक दिलचस्प है। मुझे लगता है कि व्यावहारिक रूप से बहुत कम मामले हैं जहां आप अंतिम स्थिरता के साथ नहीं रह सकते हैं, क्योंकि अधिकांश समय आप किसी भी अंतर को पहचान नहीं पाएंगे (रैवेन्स इंडेक्सिंग बहुत तेज़ है, हालांकि यह असीमित होता है) और यहां तक ​​कि यदि - आप स्थिरता को लागू कर सकते हैं उन प्रश्नों के लिए आसानी से। मैंने RavenDB के साथ कई व्यावसायिक अनुप्रयोगों का निर्माण किया है और इसे कोई समस्या नहीं मिली है (अन्य भी हैं)। मुझे कोई कारण नहीं दिख रहा है कि आपके ग्राहक को स्वतंत्र डीबीएस को बनाए रखने की आवश्यकता क्यों होगी। यदि आप उस पर अनुवर्ती करना चाहते हैं तो आप मुझे एक ईमेल छोड़ सकते हैं। –

3

यह एक संबंधपरक डेटाबेस के लिए एक सुंदर अच्छा फिट की तरह लगता है:

Part 
    - PartId 
    - Name 
    - ...more fields.. 

PartRelations 
    - ParentPartId (PK) 
    - ChildPartId (PK) 

, का उपयोग करते हुए कि स्कीमा, आप आसानी से भागों की भारी पदानुक्रम बना सकते हैं हिस्सा जानकारी एक ही समय भंडारण, और फिर बस संबंध भंडारण बच्चे के हिस्से में माता-पिता का हिस्सा।

लिए आप अपने भागों सभी विभिन्न गुणों

PartAttribute 
    - PartId 
    - Attribute 
    - Value 

गुण है करने के लिए अनुमति देने के लिए यह करने के लिए विशेषता मॉडल जोड़ सकता है, आगे से टूट किया जा सकता है यदि आप किसी अन्य तालिका गुण

Attribute 
    - AttributeId 
    - AttributeName 
    - ..datatype?.. (for pretty formatting logic or other..) 

में करना चाहता था फिर PartAttribute तालिका में, आप विशेषता के बजाय AttributeId का उपयोग कर सकते हैं। प्रैक्टिस में, मैंने पाया है कि केवल एक विशेषता तालिका के बजाय एक स्ट्रिंग का उपयोग करना जो उन्हें सूचीबद्ध करता है, कोडिंग के लिए थोड़ा आसान है और

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

+0

गुण अन्य प्रयोजनों के लिए प्रणाली में कहीं और उपयोग किया जाता है, तो अपने गुण तालिका सुझाव वास्तव में काम करने के लिए नहीं जा रहा है। मैं देखता हूं कि आप कहां जा रहे हैं। –

+0

@ErikForbes मेला पर्याप्त है। – Prescott

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