.net - रबन - संबंधपरक डेटाबेस प्रबंधन प्रणाली




कोड-प्रथम या डेटाबेस-प्रथम, कैसे चुनें? (8)

डोमेन मॉडलिंग बनाम संबंधपरक मॉडलिंग

ऐसे कई मूलभूत तरीके हैं जिनसे हम अपने बिजनेस डोमेन के विचारों को व्यक्त कर सकते हैं

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

संबंधपरक मॉडल ताकत

संबंधपरक मॉडल का आविष्कार अन्य कारणों के साथ किया गया था, जो पिछली मॉडल के कारण हुई कई समस्याओं को दूर करने के लिए था, जिसमें नेटवर्क मॉडल (जिसमें OO मॉडल शामिल हैं), श्रेणीबद्ध मॉडल (जिसमें XML / JSON मॉडल शामिल हैं), या सरल कुंजी शामिल हैं मूल्य भंडार। सभी विकल्पों पर इसकी बहुत अधिक ताकत है, जिसने इसे दशकों तक इतना लोकप्रिय बना दिया है।

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

सत्य के अपने स्रोत के रूप में, डीडीएल में व्यक्त रिलेशनल मॉडल देखें

XSD एक ही है

XML / XSD एक ऐसी ही तकनीक है। आपका डेटा XML के संदर्भ में व्यक्त किया गया है, लेकिन जब दो सिस्टम एक XML आधारित एपीआई, XSD (या यदि आप चाहते हैं तो WSDL जैसे) के माध्यम से एक दूसरे से संवाद करते हैं, तो वह संचार निर्दिष्ट करने के लिए सबसे उपयुक्त भाषा है।

यदि आप क्लाइंट टेक्नॉलॉजी, जैसे जावा में JAXB, का उपयोग कर अपने XML दस्तावेज़ों से बंधना चाहते हैं, तो आपको XSD से उन JAXB वर्गों को उत्पन्न करना चाहिए, न कि इसके विपरीत। क्यूं कर? क्योंकि XSD सच्चाई का स्रोत है

मैंने इस विषय के बारे में यहाँ लिखा है

मान लीजिए कि हम नई परियोजना शुरू करने जा रहे हैं - एप्लिकेशन जिसमें कुछ व्यावसायिक तर्क हैं, ASP.NET, WPF या उन दोनों पर उपयोगकर्ता इंटरफ़ेस। हम ORM या DAL कोड जनरेटर का उपयोग करना चाहते हैं और अपने व्यावसायिक तर्क को .NET कक्षाओं में लागू करते हैं। कई बुनियादी तरीके हैं कि हम अपने विचार कैसे व्यक्त कर सकते हैं व्यापार डोमेन:

  • .NET पर व्यावसायिक वर्गों को लागू करें और ORM को उपयुक्त डेटाबेस स्कीमा उत्पन्न करने दें
  • डेटाबेस स्कीमा को मैन्युअल रूप से बनाएं और कोड जनरेटर द्वारा .NET कक्षाएं उत्पन्न करें
  • किसी प्रकार के विज़ुअल डिज़ाइनर का उपयोग करें, जो व्यावसायिक कक्षाएं और डेटाबेस संरचना या स्क्रिप्ट उत्पन्न कर सकते हैं

आप क्या लिखना पसंद करते हैं: "क्रिएट टेबल पर्सन्स (...)" या "पब्लिक क्लास पर्सन {...}"?
उन तरीकों के पेशेवरों और विपक्ष क्या हैं?
हो सकता है कि कुछ विशेष परिस्थितियां हों जहां एक रास्ता दूसरे से बेहतर हो?
किसी विशेष परियोजना में इष्टतम तरीका कैसे चुनें?

मैं "कोड-फ़र्स्ट" (या "मॉडल-फ़र्स्ट") तरीके से काफी परिचित हूं, लेकिन ऐसा लगता है कि अधिकांश ORM को कोड जनरेटर या मैपर्स के रूप में डिज़ाइन किया गया है, मान लीजिए कि मैं डेटाबेस संरचना और व्यावसायिक वर्गों दोनों को मैन्युअल रूप से लागू करूंगा।

ओआरएम की समाप्ति और उदाहरण के आधार पर उत्तर विशेष रूप से स्वागत योग्य हैं।

संपादित करें: ध्यान दें, सवाल यह नहीं है कि "नई परियोजना शुरू करते समय मुझे पहले क्या करना चाहिए?", लेकिन "मैन्युअल रूप से घोषित / स्वचालित रूप से उत्पन्न, डोमेन कक्षाएं या डेटाबेस संरचना क्या होनी चाहिए?"


"मुझे अपनी फ़्लोचार्ट्स दिखाओ और अपनी टेबलें छुपा दो, और मैं रहस्यमयी बना रहूँगा। मुझे अपनी टेबल दिखाओ, और मुझे आमतौर पर आपके फ्लोचार्ट की आवश्यकता नहीं होगी; वे स्पष्ट हो जाएंगे। ”

- "पौराणिक मानव-माह" में फ्रेड ब्रुक्स


इंटरफ़ेस-प्रथम क्यों नहीं?

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

डिजाइन अपेक्षाकृत हल्का है। एक पेपर स्केच सस्ता और बदलने में आसान है। html डिज़ाइन अभी भी संशोधित (या बाहर फेंकने) के लिए अपेक्षाकृत सरल हैं। यह प्रोग्रामिंग का सच नहीं है। पहले डिजाइन करना आपको लचीला बनाए रखता है। प्रोग्रामिंग आपको पहले बाड़ देता है और आपको अतिरिक्त लागतों के लिए सेट करता है।

यह 37signals द्वारा वास्तविक होने के अध्याय 9 से है।


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

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

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


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

संपादित करें:
यहां डोमेन-प्रथम जनरेटर (ADO.NET एंटिटी फ्रेमवर्क ही) मॉडल प्रथम का एक उदाहरण है:

विजुअल स्टूडियो 2010 में डीडीएल उत्पन्न करने और इकाई डेटा मॉडल को संग्रहीत करने के लिए एक डेटाबेस बनाने की क्षमता है। डेवलपर के पास DDL को कस्टमाइज़ करने में, या उस डेटाबेस का चयन करने में, या मैपिंग प्रक्रिया को ठीक करने के लिए पूरी प्रक्रिया पर पूरा नियंत्रण है।


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

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


सीधे तौर पर या तो इसके बारे में सोचना शुरू करें, न कि "मॉडल" (अधिमानतः कागज पर), आपके आवेदन में उपयोगकर्ताओं के दृष्टिकोण से क्या भाग होंगे।

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

मैं डेटाबेस सामान्यीकरण समय और प्रयास में काफी कटौती करने के लिए इस विधि को ढूंढता हूं।


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





orm