क्या डोमेन संचालित डिज़ाइन एक एंटी-SQL पैटर्न है?


44

मैं डोमेन संचालित डिजाइन (डीडीडी) में गोता लगा रहा हूं और जब मैं इसमें और गहराई से जाता हूं तो कुछ चीजें हैं जो मुझे नहीं मिलती हैं। जैसा कि मैं इसे समझता हूं, एक मुख्य बिंदु इन्फ्रास्ट्रक्चर (डीबी, फाइल सिस्टम, आदि) से डोमेन लॉजिक (बिजनेस लॉजिक) को विभाजित करना है।

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

बुनियादी ढांचे में इन गणनाओं को करने से भी नहीं हो सकता है, क्योंकि DDD पैटर्न डोमेन लेयर को बदले बिना बुनियादी ढांचे में बदलाव की अनुमति देता है और यह जानते हुए भी कि MongoDB में उसी SQL सर्वर की समान क्षमता नहीं है, ऐसा नहीं हो सकता है।

कि DDD पैटर्न का एक नुकसान है?


34
जबकि SQL को रिलेशनल सेट बीजगणित को संभालने के लिए डिज़ाइन किया गया है, यह एक मज़ेदार दिन नहीं है जब आपको पता चलता है कि आपके व्यापार तर्क का आधा हिस्सा SQL कार्यों के मुट्ठी भर में दफन है जो कि रिफ्लेक्टर के लिए कठिन और परीक्षण के लिए भी कठिन हैं। इसलिए, इसे डोमेन लेयर पर ले जाना जहाँ यह अपने दोस्तों के साथ खेल सकता है, मुझे बहुत अच्छा लग रहा है। क्या यह एसक्यूएल तकनीक का अच्छा हिस्सा है? निश्चित रूप से, लेकिन SQL बहुत आसान है जब आप केवल SELECT / JOIN का उपयोग कर रहे हैं।
जारेड गोगुएन

30
@JaredGoguen लेकिन ऐसा इसलिए हो सकता है क्योंकि आपका कोई SQL एक्सपर्ट नहीं है और न ही टेक्नोलॉजी की वजह से
लियोनार्डो मैंगानो

2
@JimmyJames जो मैंने कहने की कोशिश की है कि अगर DDD अच्छी तरह से लागू किया जाता है, तो यह न्यूनतम प्रयास के साथ परतों को बदलने की अनुमति देता है, जैसे SQL सर्वर से MongoDB पर स्विच करना। लेकिन, यदि SQL में जटिल प्रश्न हैं, तो संभव है कि मैं MongoDB पर स्विच नहीं कर पाऊंगा क्योंकि उनके तकनीकी अंतर हैं। मुझे लगता है कि मैंने एक स्पष्ट बात कही है।
लियोनार्डो मैंगानो

7
... is like throwing away the SQL technologyसिर्फ इसलिए कि एक विशेष तकनीक कुछ कर सकती है इसका मतलब यह नहीं है कि यह सबसे अच्छा विकल्प है। यह एक महत्वपूर्ण साक्ष्य है, लेकिन मैं बहुत से व्यवसायों से मिला हूं जो डेटाबेस में व्यावसायिक तर्क को संग्रहीत करते थे और लंबे समय तक बनाए रखने वाले सिरदर्द के कारण इसे दूर कर रहे हैं। Oversimplifying, लेकिन डेटा संग्रहीत करने के लिए डेटाबेस हैं और प्रोग्रामिंग भाषा डेटा बदलने के लिए हैं। मैं व्यवसाय तर्क के लिए एक DB का उपयोग नहीं करना चाहूंगा, जितना मैं सीधे अपने डेटा को संग्रहीत करने के लिए अपने एप्लिकेशन का उपयोग करने का प्रयास करना चाहूंगा।
कोनार मैनकॉन

8
SQL खुद DDD का एक बेहतरीन उदाहरण है। जब संबंधित डेटा के आयोजन के साथ लोगों ने पहली बार इसे करने के लिए एक भाषा निर्दिष्ट की: एसक्यूएल। कार्यान्वयन वास्तव में ज्यादा मायने नहीं रखता है। डेटाबेस को क्वेरी करने के लिए एक DB व्यवस्थापक को C / C ++ जानने की आवश्यकता नहीं है। इसी प्रकार जब शेड्यूलिंग ईवेंट के कार्य का सामना करना पड़ता है तो कोई व्यक्ति CRON सिंटैक्स (mhdmw) के साथ आता है जो एक साधारण डोमेन मॉडल है जो शेड्यूलिंग समस्याओं का 99% फिट बैठता है। DDD का मूल वर्ग या तालिकाओं आदि को बनाना नहीं है। यह आपकी समस्या को समझना है और आपकी समस्या डोमेन में काम करने के लिए एक प्रणाली के साथ आना है
slebetman

जवाबों:


39

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

आप बिलकुल सही हैं कि हमें SQL को प्रस्तुत करना चाहिए जो कि SQL है। इसलिए हम रीड्स के चारों ओर अनुकूलित एक डेटा मॉडल तैयार करेंगे, और उस डेटा मॉडल की एक क्वेरी आमतौर पर एक कोड पथ लेगी जिसमें डोमेन मॉडल शामिल नहीं है (कुछ इनपुट सत्यापन के संभावित अपवाद के साथ - क्वेरी में उस पैरामीटर को सुनिश्चित करना वाजिब हैं)।


13
+1 अच्छा जवाब, लेकिन आपको इस अवधारणा को इसका उचित नाम देना चाहिए, कमांड-क्वेरी सेग्रीगेशन।
माइक

6
@ माइक पढ़ने और लिखने के लिए पूरी तरह से अलग मॉडल होने के बजाय CQS की तरह CQRS अधिक है।
एंडी

3
"रीड मॉडल" डोमेन मॉडल (या इसका हिस्सा) नहीं है? मैं CQRS का विशेषज्ञ नहीं हूं, लेकिन मैंने हमेशा सोचा था कि कमांड मॉडल क्लासिक डोमेन मॉडल से काफी अलग है, लेकिन रीड मॉडल नहीं। तो शायद आप इसके लिए एक उदाहरण दे सकते हैं?
डॉक ब्राउन

मुझे यह महसूस करने में बहुत समय लगा कि उच्च प्रदर्शन मार्क एक टाइपो पर ध्यान दे रहा है।
VoiceOfUnreason

@DocBrown - यहाँ आपके लिए स्पष्ट करने का मेरा प्रयास है -> cascadefaliure.vocumsineratio.com/2019/04/…
VoiceOfUnreason

21

जैसा कि मैं इसे समझता हूं, एक मुख्य बिंदु इन्फ्रास्ट्रक्चर (डीबी, फाइल सिस्टम, आदि) से डोमेन लॉजिक (बिजनेस लॉजिक) को विभाजित करना है।

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

बीएल / डीएल बाधा के रूप में "एसक्यूएल में होने" के बारे में न सोचें - यह ऐसा नहीं है। इसके बजाय, अवरोध के रूप में "यह आंतरिक डोमेन का अंत है" के बारे में सोचें।

प्रत्येक डोमेन में बाहरी-सामना करने वाला एपीआई होना चाहिए जो इसे अन्य सभी डोमेन के साथ काम करने की अनुमति देता है : डेटा स्टोरेज लेयर के मामले में , इसमें डेटा-ऑब्जेक्ट्स को स्टोर करने के लिए रीड / राइट (CRUD) एक्शन होना चाहिए। इसका मतलब यह है कि एसक्यूएल ही वास्तव में बाधा नहीं है, VIEWऔर PROCEDUREघटक हैं। आपको तालिका से कभी भी सीधे नहीं पढ़ना चाहिए: यह कार्यान्वयन विवरण है डीडीडी हमें बताता है कि, बाहरी उपभोक्ता के रूप में, हमें चिंता नहीं करनी चाहिए।

अपने उदाहरण पर विचार करें:

मैं जो सोच रहा हूं, क्या होता है जब मेरे पास सामग्री संसाधन गणना क्वेरी जैसे बहुत जटिल प्रश्न होते हैं? उस प्रकार की क्वेरी में आप भारी सेट संचालन के साथ काम करते हैं, जिस तरह की SQL के लिए डिज़ाइन किया गया था।

यह वास्तव में SQL में क्या होना चाहिए, और यह DDD का उल्लंघन नहीं है। यह वही है जिसके लिए हमने डीडीडी बनाया है । SQL में उस गणना के साथ, जो BL / DL का हिस्सा बन जाता है । आप में उपयोग करना होगा क्या एक अलग दृश्य / संग्रहीत प्रक्रिया / क्या-है-आप, और व्यापार तर्क डेटा परत से अलग रखने के लिए, के रूप में है कि अपने बाहरी API है। वास्तव में, आपकी डेटा-लेयर एक और DDD डोमेन लेयर होनी चाहिए, जहाँ आपके डेटा-लेयर के पास अन्य डोमेन लेयर्स के साथ काम करने के लिए खुद का एबस्ट्रैक्शन है।

बुनियादी ढांचे में इन गणनाओं को करने से भी नहीं हो सकता है, क्योंकि DDD पैटर्न डोमेन लेयर को बदले बिना बुनियादी ढांचे में बदलाव की अनुमति देता है और यह जानते हुए भी कि MongoDB में उसी SQL सर्वर की समान क्षमता नहीं है, ऐसा नहीं हो सकता है।

यह एक और गलतफहमी है: यह कहता है कि कार्यान्वयन विवरण आंतरिक रूप से अन्य डोमेन परतों को बदलने के बिना बदल सकते हैं । यह नहीं कहता कि आप बस एक पूरे बुनियादी ढाँचे को बदल सकते हैं ।

फिर, ध्यान रखें, DDD अच्छी तरह से परिभाषित बाहरी एपीआई के साथ आंतरिक छिपाने के बारे में है। जहां उन एपीआई का बैठना बिल्कुल अलग सवाल है, और डीडीडी इसे परिभाषित नहीं करता है। यह केवल यह परिभाषित करता है कि ये API मौजूद है, और इसे कभी नहीं बदलना चाहिए

DDD ने आपको MongoDB के साथ MSSQL की जगह एड-हॉक की अनुमति देने के लिए सेटअप नहीं किया है - वे दो बिल्कुल अलग बुनियादी ढांचे के घटक हैं।

इसके बजाय, आइए DDD को परिभाषित करने के लिए एक सादृश्य का उपयोग करें: गैस बनाम इलेक्ट्रिक कार। दोनों वाहनों में प्रणोदन बनाने के लिए दो पूरी तरह से अलग-अलग विधियां हैं, लेकिन उनके पास एक ही एपीआई है: ऑन / ऑफ, एक थ्रॉटल / ब्रेक, और वाहन को चलाने के लिए पहियों। डीडीडी का कहना है कि हमें अपनी कार में इंजन (गैस या इलेक्ट्रिक) को बदलने में सक्षम होना चाहिए। यह नहीं कहता कि हम कार को मोटरसाइकिल से बदल सकते हैं, और यह प्रभावी रूप से MSSQL → MongoDB है।


1
स्पष्टीकरण के लिए धन्यवाद। मेरे लिए बहुत कठिन विषय है, हर किसी का दृष्टिकोण अलग है। केवल एक चीज जिससे मैं सहमत नहीं हूं, वह है MSSQL (कार) और मोंगोडीबी (मोटरसाइकिल) के बीच तुलना, मेरे लिए सही तुलना यह है कि ये एक ही कार के लिए दो अलग-अलग इंजन हैं, लेकिन यह सिर्फ एक राय है।
लियोनार्डो मैंगानो

8
@LeardoardoMangano आह, लेकिन वे नहीं हैं। MSSQL एक संबंधपरक डेटाबेस है, MongoDB एक दस्तावेज़ डेटाबेस है। हां, "डेटाबेस" दोनों का वर्णन करता है, लेकिन जहां तक ​​यह जाता है। पढ़ने / लिखने की तकनीक पूरी तरह से अलग हैं। MongoDB के बजाय, आप एक विकल्प के रूप में Postgre या MySQL का उपयोग कर सकते हैं, और यह एक वैध तुलना होगी।
410_गोन 15

3
"आपको टेबल से सीधे नहीं पढ़ना चाहिए ..." पागलपन।
jpmc26

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

@ ल्यूसिफरसम ऐ। यह कार्यान्वयन विवरण और डोमेन सीमाओं के बीच अलगाव को प्रबंधित करना बहुत आसान बनाता है। डोमेन में एक "ऑब्जेक्ट" को 5 तालिकाओं द्वारा दर्शाया जा सकता है, इसलिए हम उस ऑब्जेक्ट को एनक्रिप्ट करने के लिए एक व्यू का उपयोग करते हैं।
410_Gone

18

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

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

एक वास्तुशिल्प पैटर्न से विचलन

जब आप खुद को शुद्ध रूप से एक पैटर्न लागू करने या किसी क्षेत्र में विचलन के साथ बाधाओं पर पाते हैं, तो आपके पास बनाने का निर्णय है। एक पैटर्न बस अपनी परियोजना को व्यवस्थित करने में मदद करने के लिए चीजों को करने का एक अस्थायी तरीका है। इस बिंदु पर मूल्यांकन के लिए समय निकालें:

  • क्या यह सही पैटर्न है? (कई बार यह होता है, लेकिन कभी-कभी यह सिर्फ एक खराब फिट होता है)
  • क्या मुझे इस एक तरीके से विचलन करना चाहिए?
  • अभी तक मैंने कितना विचलन किया है?

आप पाएंगे कि कुछ वास्तु पैटर्न आपके आवेदन के 80-90% के लिए एक अच्छा फिट हैं, लेकिन शेष बिट्स के लिए इतना नहीं। निर्धारित पैटर्न से सामयिक विचलन प्रदर्शन या तार्किक कारणों से उपयोगी है।

हालांकि, यदि आप पाते हैं कि आपके संचयी विचलन आपके आवेदन आर्किटेक्चर के 20% से अधिक अच्छे सौदे के लिए हैं, तो यह शायद सिर्फ एक खराब फिट है।

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


मैं जवाब में "यह सही पैटर्न है" जैसे वाक्यांशों के उपयोग से बचना चाहिए। लोगों को विशिष्ट होने के लिए पर्याप्त कठिन है जब वे अपने प्रश्न लिखते हैं, और अपने स्वयं के प्रवेश द्वारा "कभी-कभी यह एक खराब फिट है," जो बताता है कि नहीं, यह सही पैटर्न नहीं है।
रॉबर्ट हार्वे

@RobertHarvey, मैं उन परियोजनाओं में रहा हूँ जहाँ इस्तेमाल किया गया पैटर्न सिर्फ आवेदन के लिए सही नहीं था, जिसके कारण यह कुछ निश्चित मैट्रिक्स को विफल कर देता है। यह निश्चित रूप से आदर्श नहीं है, लेकिन जब ऐसा होता है तो आपके पास आर्किटेक्चर बदलने या ऐप में जूता कोड रखने का कठिन निर्णय होता है। जितनी जल्दी आप खराब फिट का निर्धारण कर सकते हैं, उतना ही आसान इसे ठीक करना है। इसलिए मैं हमेशा उस विचार को शामिल करता हूं, जो एज केसों का मूल्यांकन करता है। अंतिम गोली के साथ, कभी-कभी आपको यह महसूस नहीं होता है कि जब तक आप विचलन के संचय को नहीं देखते हैं, तब तक यह कितना खराब है।
बेरिन लोरिट्श

7

सेट हेरफेर तर्क कि SQL अच्छा है DDD कोई समस्या नहीं के साथ एकीकृत किया जा सकता है।

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

मैं बस एक नया डोमेन ऑब्जेक्ट परिचय देता हूं,

ProductInventory
{
    ProductType
    TotalCount
    DateTimeTaken
}

और मेरे भंडार पर एक विधि

ProductRepository
{
    List<ProductInventory> TakeInventory(DateTime asOfDate) {...}
}

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


खैर, अब तक मुझे याद है। रिपॉजिटरी Queryको पैरामीटर के रूप में भी मिलना चाहिए । repository.find(query);। मैं एक ही है, लेकिन Specs. That opens a door to leave Query` के साथ एक अमूर्त और QueryImplया विशिष्ट-क्वेरी कार्यान्वयन के रूप में अवसंरचना परत पर पढ़ा है ।
लैव

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

I know some people do thatकुछ लोग Pivotal और इसकी रूपरेखा हैं। स्प्रिंगफ्रैमवर्क में यह बहुत है :-)। वैसे भी, जैसा कि @VoiceOfUnreason ने सुझाव दिया है, डीडीडी के आसपास की कुंजी लेखन की निरंतरता को बनाए रख रही है। मैं उन डोमेन मॉडल के साथ डिज़ाइन को मजबूर करने के बारे में अनिश्चित हूं, जिनका केवल उद्देश्य क्वेरी करना या पैराड्रिंक करना है। डेटा संरचना (पोकोस, पोजो, डीटीओ, पंक्ति मैपर्स, जो भी हो) के साथ डोमेन से संपर्क किया जा सकता है।
Laiv

स्पष्ट रूप से हमें उन लोगों की मदद करने के लिए किसी प्रकार के जिज्ञासा की आवश्यकता है जो वापस पवित्रता में आए। लेकिन मैं अपनी बंदूकों से चिपका हुआ हूं। जब यह उद्देश्यपूर्ण रूप से एक बेहतर अनुप्रयोग के लिए बनाता है, तो डटलटर का आंशिक प्रदर्शन स्वीकार्य है, जहां "डोमेन ऑब्जेक्ट" क्या है या व्यक्तिपरक नहीं है
इवान

1
@ लियोनार्डो मैंगानो आपके आवेदन और कार्यान्वयन पर निर्भर करता है। एहसास करने के लिए मुख्य बात यह है कि आप इसे व्यावहारिक बनाने के लिए अपने डोमेन को फिर से व्याख्या कर सकते हैं।
इवान

3

इस दुविधा को हल करने के संभावित तरीकों में से एक एसक्यूएल को असेंबली भाषा के रूप में सोचना है: आप शायद ही कभी, यदि बिल्कुल, तो इसमें सीधे कोड करें, लेकिन जहां प्रदर्शन मायने रखता है, आपको अपने सी द्वारा उत्पादित कोड को समझने में सक्षम होना चाहिए। / C ++ / Golang / Rust संकलक और शायद असेंबली में एक छोटा सा स्निपेट भी लिखें, यदि आप वांछित मशीन कोड का उत्पादन करने के लिए आप में उच्च स्तरीय भाषा में कोड नहीं बदल सकते हैं।

इसी तरह, डेटाबेस और SQL के दायरे में, विभिन्न SQL लाइब्रेरी (जिनमें से कुछ ORM हैं ), जैसे कि SQLAlchemy और Django ORM, Python, LINQ for .NET के लिए, उच्च स्तर के एब्स्ट्रक्शन प्रदान करते हैं, फिर भी प्रदर्शन को प्राप्त करने के लिए उत्पन्न SQL कोड का उपयोग संभव है। वे उपयोग किए गए डीबी के रूप में कुछ पोर्टेबिलिटी भी प्रदान करते हैं, संभवतः कुछ अलग-अलग इष्टतम डीबी-विशिष्ट एसक्यूएल का उपयोग करते हुए कुछ ऑपरेशन के कारण, पोस्टग्रेज और माईएसक्यूएल पर अलग-अलग प्रदर्शन करते हैं।

और बस उच्च स्तरीय भाषाओं के साथ, यह समझना महत्वपूर्ण है कि SQL कैसे काम करता है, भले ही यह उपरोक्त SQL पुस्तकालयों के साथ किए गए प्रश्नों को पुनर्व्यवस्थित करने के लिए हो, वांछित दक्षता प्राप्त करने में सक्षम हो।

पीएस मैं इसके बजाय टिप्पणी करना चाहता हूं लेकिन मेरे पास इसके लिए पर्याप्त प्रतिष्ठा नहीं है।


2

हमेशा की तरह, यह उन चीजों में से एक है जो कई कारकों पर निर्भर करता है। यह सच है कि बहुत कुछ है जो आप SQL के साथ कर सकते हैं। इसका उपयोग करने के साथ चुनौतियां भी हैं और संबंधपरक डेटाबेस की कुछ व्यावहारिक सीमाएं हैं।

जैसा कि जेरेड गोगुएन टिप्पणियों में बताता है, एसक्यूएल परीक्षण और सत्यापन के लिए बहुत मुश्किल हो सकता है। इसके लिए मुख्य कारक यह हैं कि यह (सामान्य रूप से) घटकों में विघटित नहीं हो सकता है। व्यवहार में, टोटको में एक जटिल प्रश्न पर विचार किया जाना चाहिए। एक और जटिल कारक यह है कि SQL का व्यवहार और शुद्धता आपके डेटा की संरचना और सामग्री पर अत्यधिक निर्भर है। इसका मतलब यह है कि सभी संभावित परिदृश्यों का परीक्षण करना (या यहां तक ​​कि वे क्या हैं यह निर्धारित करना) अक्सर असंभव या असंभव है। एसक्यूएल की रीक्रैक्टरिंग और डेटाबेस संरचना का संशोधन इसी तरह समस्याग्रस्त है।

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

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


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

@ मुझे लगता है कि जहाँ आप गलत हो गए हैं यहाँ यह माना जा रहा है कि एक ही कोर सिस्टम होना चाहिए जो दूसरों के 'हैंग' हो।
जिमीजैम

@Steve एक उदाहरण देने के लिए, आप सिस्टम पूरे डेटाबेस को एक एकल-SQL डेटाबेस के साथ बदल सकते हैं (मैं यह नहीं कह रहा हूं कि यह हमेशा सही विकल्प है, बस यह किया जा सकता है।) उस डेटाबेस को फिर कई में संग्रहीत किया जा सकता है। सिस्टम, यहां तक ​​कि भौगोलिक क्षेत्र भी। ऐसा DB सहायक नहीं है, यह SQL DB का थोक प्रतिस्थापन है।
जिमीजैम

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

@jmoreno किसी चीज को संसाधनों में फेंकने के लिए इसके साथ-साथ मैं अच्छी इंजीनियरिंग नहीं कहूंगा: "साइट के बड़े पैमाने पर डेटा वॉल्यूम को संभालने के लिए, और लेन-देन की संख्या को बनाए रखने के लिए मेमेक के 9,000 इंस्टेंस चल रहे हैं। डेटाबेस की सेवा करनी चाहिए। " क्या आप अपने डिजाइनों की लागत पर विचार करते हैं या क्या आप मानते हैं कि कोई व्यक्ति आपकी व्यक्तिगत प्राथमिकताओं को कारगर बनाने के लिए पैसे खर्च करेगा?
जिमीजैम

2

कि DDD पैटर्न का एक नुकसान है?

पहले मुझे कुछ गलतफहमी दूर करने दें।

DDD एक पैटर्न नहीं है। और यह वास्तव में पैटर्न नहीं लिखता है।

एरिक इवान की DDD पुस्तक की प्रस्तावना में कहा गया है:

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

[...]

सफलताओं के लिए एक विशेषता सामान्य डोमेन मॉडल था जो डिजाइन के पुनरावृत्तियों के माध्यम से विकसित हुआ और परियोजना के कपड़े का हिस्सा बन गया।

यह पुस्तक डिजाइन निर्णय लेने के लिए एक रूपरेखा प्रदान करती है और डोमेन डिजाइन पर चर्चा करने के लिए एक तकनीकी शब्दावली है। यह मेरी अपनी अंतर्दृष्टि और अनुभवों के साथ व्यापक रूप से स्वीकृत सर्वोत्तम प्रथाओं का एक संश्लेषण है।

इसलिए, यह सॉफ्टवेयर डेवलपमेंट और डोमेन मॉडलिंग के साथ संपर्क करने का एक तरीका है, साथ ही कुछ तकनीकी शब्दावली जो उन गतिविधियों का समर्थन करती है (एक शब्दावली जिसमें विभिन्न अवधारणाएं और पैटर्न शामिल हैं)। यह भी बिल्कुल नया नहीं है।

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

इसके बारे में कुछ भी स्वाभाविक रूप से समर्थक विरोधी या SQL नहीं है, हालांकि OO डेवलपर्स आमतौर पर OO भाषाओं में मॉडल को व्यक्त करने में बेहतर हैं, और कई डोमेन अवधारणाओं की अभिव्यक्ति OOP द्वारा बेहतर समर्थित है। लेकिन कभी-कभी मॉडल के कुछ हिस्सों को एक अलग प्रतिमान में व्यक्त किया जाना चाहिए।

मैं जो सोच रहा हूं, वह तब होता है जब मेरे पास बहुत जटिल प्रश्न होते हैं [...]?

खैर, आम तौर पर बोलना यहां दो परिदृश्य हैं।

पहले मामले में, डोमेन के कुछ पहलू को वास्तव में एक जटिल क्वेरी की आवश्यकता होती है, और शायद यह पहलू SQL / संबंधपरक प्रतिमान में सबसे अच्छा व्यक्त किया जाता है - इसलिए नौकरी के लिए उपयुक्त उपकरण का उपयोग करें। अपने डोमेन सोच और अवधारणाओं को संप्रेषित करने में उपयोग की जाने वाली भाषा में उन पहलुओं को प्रतिबिंबित करें। यदि डोमेन जटिल है, तो शायद यह एक उप-डोमेन का एक हिस्सा है, जिसके पास स्वयं का बाध्य संदर्भ है।

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


0

मेमोरी महंगा होने पर सीक्वल लोकप्रिय हो गया, क्योंकि रिलेशनल डेटा मॉडल ने आपके डेटा को सामान्य करने की संभावना प्रदान की और इसे प्रभावी रूप से फाइल सिस्टम में स्टोर किया।

अब मेमोरी अपेक्षाकृत सस्ती है, इसलिए हम सामान्यीकरण को छोड़ सकते हैं और प्रारूप में स्टोर कर सकते हैं जो हम इसका उपयोग करते हैं या गति के लिए समान डेटा का एक बहुत डुप्लिकेट करते हैं।

डेटाबेस को सरल IO डिवाइस के रूप में विचार करें , जो फ़ाइल सिस्टम में डेटा को स्टोर करने की जिम्मेदारी देता है - हाँ मुझे पता है कि इसकी कल्पना करना मुश्किल है, क्योंकि हमने SQL प्रश्नों में लिखे महत्वपूर्ण व्यावसायिक तर्क के साथ बहुत सारे आवेदन लिखे थे - लेकिन बस उस SQL ​​सर्वर की कल्पना करने की कोशिश करें बस एक और प्रिंटर है।

क्या आप पीडीएफ जनरेटर को प्रिंटर ड्राइवर में एम्बेड करेंगे या एक ट्रिगर जोड़ा जाएगा जो हमारे प्रिंटर से छपे हर बिक्री ऑर्डर के लिए लॉग पेज प्रिंट करेगा?

मुझे लगता है कि उत्तर नहीं होगा, क्योंकि हम नहीं चाहते हैं कि हमारा आवेदन विशिष्ट डिवाइस प्रकार के लिए युग्मित हो (ऐसे विचार की दक्षता के बारे में भी बात नहीं कर रहा है)

70-90 के एसक्यूएल डेटाबेस में कुशल थे, अब? - यकीन नहीं, कुछ परिदृश्यों में एसिंक्रोनस डेटा क्वेरी एसक्यूएल क्वेरी में कई जॉइन की तुलना में तेजी से आवश्यक डेटा लौटाएगी।

SQL जटिल प्रश्नों के लिए डिज़ाइन नहीं किया गया था, इसे डेटा को कुशल तरीके से संग्रहीत करने के लिए डिज़ाइन किया गया था और फिर संग्रहीत डेटा को क्वेरी करने के लिए इंटरफ़ेस / भाषा प्रदान करता है।

मैं कहूंगा कि जटिल प्रश्नों के साथ संबंधपरक डेटा मॉडल के आसपास अपना एप्लिकेशन बनाना डेटाबेस इंजन का दुरुपयोग है। बेशक डेटाबेस इंजन प्रदाता खुश होते हैं जब आप अपने व्यवसाय को अपने उत्पाद के साथ कसकर जोड़ते हैं - वे अधिक सुविधाएँ प्रदान करने के लिए खुश से अधिक होंगे जो इस बाध्य को मजबूत बनाते हैं।


1
लेकिन मुझे लगता है कि SQL किसी भी अन्य भाषा की तुलना में सेट गणना के लिए बेहतर है। मेरे नज़रिये से। आपका उदाहरण उल्टा है, लाखों # पंक्तियों और जोड़ के साथ बहुत जटिल सेट संचालन के लिए C # का उपयोग गलत उपकरण का उपयोग कर रहा है, लेकिन मैं गलत हो सकता है।
लियोनार्डो मैंगानो

@ लियोनार्डो मैंगानो, कुछ उदाहरण: सी # के साथ मैं लाखों पंक्तियों को काट सकता हूं और इसे समानांतर में गणना कर सकता हूं, मैं डेटा को अतुल्यकालिक रूप से पुनर्प्राप्त कर सकता हूं और "समय पर गणना" निष्पादित कर सकता हूं जब डेटा वापस आ जाता है, तो ग # के साथ मैं पंक्ति की गणना करके कम मेमोरी उपयोग के साथ गणना कर सकता हूं। पंक्ति से। कोड में जटिल तर्क रखने से आपको गणना करने के लिए बहुत सारे विकल्प मिलेंगे।
फाबियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.