मेरी वर्तमान परियोजना अनिवार्य रूप से मिल दस्तावेज प्रबंधन प्रणाली का एक भाग है।
उस ने कहा, कुछ झुर्रियाँ (आश्चर्य, आश्चर्य) हैं। जबकि कुछ झुर्रियाँ परियोजना के लिए काफी विशिष्ट हैं, मेरा मानना है कि कुछ सामान्य अवलोकन और प्रश्न हैं जो सामने आए हैं, जिनमें एक कैनोनिकल उत्तर नहीं है (जो मुझे मिल सकता है, वैसे भी) और यह एक व्यापक समस्या डोमेन पर लागू होता है । यहाँ बहुत कुछ है और मुझे यकीन नहीं है कि यह StackExchange Q & A प्रारूप के लिए एक अच्छा फिट है, लेकिन मुझे लगता है कि यह एक) एक जवाब देने योग्य प्रश्न है और b) गैर-विशिष्ट पर्याप्त है ताकि यह समुदाय को लाभान्वित कर सके। मेरे कुछ विचार मेरे लिए विशिष्ट हैं, लेकिन मुझे लगता है कि प्रश्न का उपयोग SQL बनाम NoSQL बनाम दोनों के साथ सामना करने वाले किसी के लिए भी हो सकता है।
पृष्ठ - भूमि:
हम जिस वेब ऐप का निर्माण कर रहे हैं, उसमें डेटा है जो स्पष्ट रूप से प्रकृति के साथ-साथ डेटा से संबंधित है जो दस्तावेज़-उन्मुख है। हम चाहेंगे कि हमारा केक हो और इसे भी खाएं।
TL; DR: मुझे लगता है कि नीचे # 5 गंध परीक्षण पास करता है। क्या आप? क्या किसी के पास एकल एप्लिकेशन में SQL और NOSQL के एकीकरण के साथ अनुभव है? मैंने समस्या के इस वर्ग के सभी संभावित दृष्टिकोणों को नीचे सूचीबद्ध करने का प्रयास किया। क्या मैंने एक आशाजनक विकल्प को याद किया है?
जटिलताओं:
- दस्तावेजों के कई अलग-अलग वर्ग हैं। आवश्यकताएं पहले से ही दर्जनों विभिन्न दस्तावेजों के लिए कॉल करती हैं। यह संख्या केवल कभी भी बढ़ जाएगी। सबसे अच्छा संभव मामला वह होगा जिसमें हम एक साधारण डोमेन विशिष्ट भाषा, कोड पीढ़ी और एक लचीली स्कीमा का लाभ उठा सकते हैं ताकि डोमेन विशेषज्ञ डीबीए या प्रोग्रामर के हस्तक्षेप के बिना नए दस्तावेज़ वर्गों को जोड़ सकें। (नोट: पहले से ही पता है कि हम ग्रीनस्पून के दसवें नियम से बाहर रह रहे हैं )
- पिछले सफल लेखन की अखंडता परियोजना की एक केंद्रीय आवश्यकता है। डेटा व्यापार महत्वपूर्ण होगा। लिखने पर पूर्ण ACID शब्दार्थ का त्याग किया जा सकता है, बशर्ते कि जो चीजें संक्षिप्त रूप से लिखी जाती हैं, वे लिखी रहें।
- दस्तावेज स्वयं जटिल हैं। हमारे विशिष्ट मामले में प्रोटोटाइप दस्तावेज़ को प्रति दस्तावेज़ उदाहरण में 150 + अलग-अलग डेटा के भंडारण की आवश्यकता होगी। पैथोलॉजिकल केस परिमाण का क्रम बदतर हो सकता है, लेकिन निश्चित रूप से दो नहीं।
- दस्तावेजों का एक एकल वर्ग बाद के समय में अद्यतन करने के लिए एक चलती लक्ष्य विषय है।
- जब हम एक रिलेशनल डेटाबेस में हुक करते हैं तो हमें Django से मिलने वाला मुफ्त सामान पसंद आता है। हम django-nonrel fork का उपयोग करने के लिए दो Django संस्करणों को वापस लाने के बिना मुफ्त में रखना चाहते हैं। ORM को पूरी तरह से डंप करना 1.3 पर डाउनग्रेड करने के लिए बेहतर है।
अनिवार्य रूप से, यह संबंधपरक डेटा (उपयोगकर्ताओं, समूहों, आदि जैसे आपके विशिष्ट वेब ऐप सामान, साथ ही दस्तावेज़ मेटाडेटा का एक mashmash है जिसे हमें वास्तविक समय में जटिल प्रश्नों के साथ स्लाइस और पासा करने में सक्षम होना होगा) और दस्तावेज़ डेटा (जैसे जिन सैकड़ों क्षेत्रों में हमें शामिल होने या उनके द्वारा क्वेरी करने में कोई रुचि नहीं है - डेटा के लिए हमारा एकमात्र उपयोग मामला एकल दस्तावेज़ को दिखाने के लिए होगा जिसमें यह दर्ज किया गया था)।
मैं एक पवित्रता जांच करना चाहता था (यदि आप मेरी पोस्टिंग इतिहास की जांच करते हैं, तो मैं इस तथ्य के बारे में बहुत स्पष्ट हूं कि मैं अपनी पसंदीदा पद्धति पर नहीं हूं) और साथ ही उन सभी विकल्पों की गणना करता हूं जो मैं दूसरों के लिए हल कर रहा हूं रिलेशनल और नॉन-रिलेशनल दोनों डेटा से संबंधित समान रूप से समान समस्याएं।
प्रस्तावित हल:
1. प्रति दस्तावेज़ वर्ग एक तालिका
प्रत्येक दस्तावेज़ वर्ग को अपनी तालिका प्राप्त होती है, जिसमें सभी मेटाडेटा और डेटा के लिए कॉलम होते हैं।
लाभ:
- मानक SQL डेटा मॉडल खेलने में है।
- रिलेशनल डेटा को सबसे अच्छे तरीके से हैंडल किया जाता है। बाद में अगर हमें जरूरत पड़ेगी तो हम इसे असामान्य कर देंगे।
- Django का बिल्ट-इन एडमिन इंटरफेस इन टेबल को इंट्रोस्पेक्ट करने में सहज है और ORM बॉक्स से 100% डेटा के साथ खुशी से रह सकता है।
नुकसान:
- रख-रखाव बुरा सपना। दर्जनों कॉलम के साथ तालिकाओं के दसियों (सैकड़ों?)।
- अनुप्रयोग-स्तरीय तर्क जो यह तय करने के लिए जिम्मेदार है कि किस तालिका को लिखना है। क्वेरी स्टिंक के लिए तालिका का नाम एक पैरामीटर बनाना।
- मूल रूप से सभी व्यावसायिक तर्क परिवर्तनों को स्कीमा परिवर्तनों की आवश्यकता होगी।
- पैथोलॉजिकल मामलों में कई तालिकाओं में एकल रूपों के लिए स्ट्रिपिंग डेटा की आवश्यकता हो सकती है (देखें: पोस्टरेक्यूक्यूल तालिका में कॉलम की अधिकतम संख्या क्या है? )।
- हमें शायद एक वास्तविक, ईमानदार-से-ईश्वर डीबीए की तलाश करने की आवश्यकता होगी, जो जीवन और हमसे नफरत करने में कोई संदेह नहीं करेंगे।
2. ईएवी मॉडलिंग
बस एक फील्ड टेबल है। इकाई-गुण-मूल्य मॉडलिंग पहले से ही अच्छी तरह से समझा जाता है। मैंने इसे पूर्णता के लिए शामिल किया है। मुझे नहीं लगता कि 2013 में शुरू की जा रही कोई नई परियोजना उद्देश्य पर ईएवी दृष्टिकोण के साथ जाएगी।
लाभ:
- मॉडल के लिए आसान है।
नुकसान:
- प्रश्न करना अधिक कठिन है।
- DB परत में अब एक एप-स्तरीय वस्तु के गठन के लिए एक सीधा-आगे प्रतिनिधित्व नहीं है।
- हम DB स्तर की बाधा जाँच खो देंगे।
- एक टेबल पर पंक्तियों की संख्या 100 गुना अधिक तेजी से बढ़ेगी। संभवतः भविष्य के दर्द बिंदु, प्रदर्शन-वार।
- सीमित अनुक्रमण संभव है।
- जहाँ तक ORM का संबंध है, DB स्कीमा निरर्थक है। बैटरियों में शामिल वेब ऐप सामान संरक्षित है लेकिन कस्टम डेटा मॉडल के लिए कस्टम क्वेरी की आवश्यकता होती है।
3. PostgreSQL hstore या json फ़ील्ड का उपयोग करें
या तो इन फ़ील्ड प्रकारों में संबंधपरक डीबी के संदर्भ में स्कीमालेस डेटा संग्रहीत करने के लिए चाल चलनी होगी। एकमात्र कारण जो मैं तुरंत इस समाधान के लिए नहीं कूदता हूं, वह अपेक्षाकृत नया है (संस्करण 8.4 में पेश किया गया है ताकि नया नहीं हो ), मेरे पास इसके लिए शून्य पिछला प्रदर्शन है और मुझे संदेह है। यह मुझे ठीक उसी तरह के लिए गलत ठहराता है, जैसा कि मैं महसूस करता हूं कि मैं अपने सभी अच्छे, आसानी से सामान्य किए गए डेटा को मानगो में फेंकने में असहज महसूस करूंगा - हालांकि मानगो दस्तावेजों के बीच संदर्भों को संभाल सकता है।
लाभ:
- हमें Django ORM और बिल्ट-इन इनटॉरस और सेशन मैनेजमेंट का लाभ मिलता है।
- सब कुछ एक बैकेंड में रहता है जिसे हमने पहले अन्य परियोजनाओं पर सफलतापूर्वक उपयोग किया है।
नुकसान:
- इसके साथ कोई अनुभव नहीं, व्यक्तिगत रूप से।
- यह बहुत ज्यादा इस्तेमाल की जाने वाली सुविधा नहीं है। ऐसा लगता है कि वे NOSQL समाधानों को देखने वाले लोगों के लिए काफी अनुशंसित हैं, लेकिन मुझे बहुत सारे सबूत नहीं दिख रहे हैं कि उन्हें चुना जा रहा है। इससे मुझे लगता है कि मुझे कुछ याद आ रहा है।
- संग्रहीत सभी मान तार हैं। डीबी स्तर की कमी की जाँच करें।
- जब तक वे विशेष रूप से एक दस्तावेज नहीं देखते हैं, तब तक हस्टोर में डेटा उपयोगकर्ता को कभी भी प्रदर्शित नहीं किया जाएगा, लेकिन अधिक मानक कॉलम में संग्रहीत मेटाडाटा होगा। हम उस मेटाडेटा की पिटाई करेंगे और मुझे चिंता है कि हम जो बड़े-बड़े काम कर रहे हैं, वे प्रदर्शन की कमियां हैं।
4. पूर्ण बोर दस्तावेज़ उन्मुख जाओ
सभी चीजें दस्तावेज (MongoDB अर्थ में) बनाएं। एक प्रकार का एकल संग्रह बनाएं Document
और उसे एक दिन कॉल करें। सभी परिधीय डेटा (उपयोगकर्ता खातों, समूहों आदि पर डेटा सहित) को मोंगो में भी लाएं। यह समाधान स्पष्ट रूप से ईएवी मॉडलिंग की तुलना में बेहतर है, लेकिन यह मुझे उसी कारण से गलत लगता है # 3 गलत लगा - वे दोनों एक हथौड़ा के रूप में भी एक पेचकश का उपयोग करने की तरह महसूस करते हैं।
लाभ:
- डेटा अपफ्रंट को मॉडल करने की आवश्यकता नहीं है। प्रकार के दस्तावेजों के साथ एक संग्रह रखें
Document
और इसे एक दिन कॉल करें। - अच्छी स्केलिंग विशेषताओं को जाना जाता है, संग्रह को लाखों या अरबों दस्तावेजों को शामिल करने के लिए बढ़ने की आवश्यकता होनी चाहिए।
- JSON प्रारूप (BSON) डेवलपर्स के लिए सहज है।
- जैसा कि मैं इसे समझता हूं (जो इस बिंदु पर केवल अस्पष्ट है), लिखने-चिंता के स्तर के संबंध में पागल होने से भी एक भी उदाहरण कुछ भी होने की स्थिति में बहुत मजबूत डेटा सुरक्षा प्रदान कर सकता है और हार्ड ड्राइव क्रैश तक सब कुछ।
नुकसान:
- ORM Django ट्रंक के लिए खिड़की से बाहर है। मुफ्तखोर जो इसके साथ खिड़की से बाहर निकलते हैं: ऑउटफिट फ्रेमवर्क, सेशन फ्रेमवर्क, एडमिन इंटरफेस, निश्चित रूप से कई अन्य चीजें।
- या तो मोंगो की संदर्भित क्षमताओं (जिसमें कई प्रश्नों की आवश्यकता होती है) का उपयोग करना चाहिए या डेटा को असामान्य बनाना चाहिए। न केवल हम Django से मिलने वाले मुफ्त के सामानों को खो देते हैं, हम उन पोस्टों को भी खो देते हैं, जैसे जोइनिंग्स को हमने पोस्टग्रेक्यूएल में दी थी।
- डेटा सुरक्षा। जब कोई MongoDB के बारे में पढ़ता है, तो ऐसा लगता है कि हमेशा कम से कम एक व्यक्ति यह बताता है कि यह आपके डेटा को कैसे खो देगा और खो देगा। वे कभी भी किसी विशेष घटना का हवाला नहीं देते हैं और हो सकता है कि यह सब केवल हॉगवॉश हो या सिर्फ पुरानी डिफ़ॉल्ट आग से संबंधित हो और लेखन-चिंता को भूल जाए लेकिन यह अभी भी मुझे चिंतित करता है। हम निश्चित रूप से किसी भी मामले में एक बहुत ही पागल बैकअप रणनीति का उपयोग कर रहे हैं (यदि डेटा चुपचाप दूषित है कि अच्छी तरह से निश्चित रूप से सारहीन हो सकता है ..)।
5. PostgreSQL और MongoDB
संबंधपरक डेटा रिलेशनल डेटाबेस में जाता है और दस्तावेज़ डेटा दस्तावेज़-उन्मुख डेटाबेस में जाता है। documents
संबंधपरक डेटाबेस की तालिका में उन सभी डेटा शामिल होते हैं जिन्हें हमें अनुक्रमण या स्लाइस और डाइस के साथ-साथ एक MongoDB ObjectId की आवश्यकता होती है, जिसका उपयोग हम तब करते थे जब हमें दस्तावेजों पर फ़ील्ड के वास्तविक मूल्यों के लिए क्वेरी करने की आवश्यकता होती थी। हम स्वयं दस्तावेजों के मूल्यों के लिए ORM या बिल्ट-इन एडमिन का उपयोग नहीं कर पाएंगे, लेकिन यह नुकसान की बड़ी बात नहीं है क्योंकि पूरे ऐप मूल रूप से दस्तावेजों के लिए एक व्यवस्थापक इंटरफ़ेस है और हमें इसकी संभावना होगी ओआरएम के उस विशिष्ट हिस्से को अस्वीकार्य डिग्री के लिए अनुकूलित करें ताकि यह ठीक उसी तरह काम कर सके जिस तरह से हमें ज़रूरत है।
लाभ:
- प्रत्येक बैकएंड केवल वही करता है जो इसमें अच्छा है।
- कई प्रश्नों की आवश्यकता के बिना मॉडल के बीच संदर्भ संरक्षित हैं।
- हमें बैटरी रखने के लिए मिलती है जो Django ने हमें दिया है जहां तक उपयोगकर्ता, सत्र आदि का संबंध है।
- केवल एक
documents
टेबल की जरूरत है, चाहे कितने ही अलग-अलग वर्ग के दस्तावेज बनाए जाएं। - कम अक्सर queried दस्तावेज़ डेटा को दृढ़ता से कहीं अधिक अक्सर मेटाडेटा से अलग किया जाता है।
नुकसान:
- दस्तावेज़ डेटा को पुनर्प्राप्त करने के लिए 2 अनुक्रमिक प्रश्नों की आवश्यकता होगी, पहले SQL DB के खिलाफ और फिर MongoDB के खिलाफ (हालांकि यह इससे भी बदतर नहीं है अगर मानगो में एक ही डेटा संग्रहीत किया गया था और इसे असामान्य नहीं किया गया है)
- लिखना अब परमाणु नहीं होगा। एक एकल Mongo दस्तावेज़ के खिलाफ एक लेख को परमाणु होने की गारंटी दी गई है और PG स्पष्ट रूप से परमाणु गारंटी दे सकता है, लेकिन दोनों में लिखने की परमाणुता सुनिश्चित करने के लिए आवेदन तर्क की आवश्यकता होगी, प्रदर्शन और जटिलता दंड के साथ कोई संदेह नहीं है।
- दो बैकएंड = दो क्वेरी भाषाएँ = असंतुष्ट व्यवस्थापक आवश्यकताओं के साथ दो अलग-अलग प्रोग्राम = दो डेटाबेस स्मृति के लिए मर रहे हैं।
JSON
डेटाटाइप वाले कॉलम के लिए जाऊंगा । Postgres में नई सुविधाओं का उपयोग करने से डरो मत - Postgres टीम उन विशेषताओं को जारी नहीं करती है जो स्थिर नहीं हैं। और 9.2 वास्तव में वह नया नहीं है)। इसके अलावा आप 9.3 JSON सुविधाओं का उपयोग एक बार कर सकते हैं। यदि आप हमेशा अपने एप्लिकेशन कोड में दस्तावेजों को पूरी तरह से संसाधित कर रहे हैं (बल्कि तब SQL का उपयोग करके), तो आप JSON को एक नियमितtext
कॉलम में भी संग्रहीत कर सकते हैं ।