क्या आपका अपना डेटा एक्सेस / डेटा मैपिंग लेयर एक "अच्छा" विचार है?


20

वर्तमान में हम ऐसी स्थिति में हैं जहाँ हमारे पास आउट-ऑफ-द-बॉक्स ऑब्जेक्ट-रिलेशनल मैपर का उपयोग करने या अपना स्वयं का रोल करने के बीच एक विकल्प है

हमारे पास एक विरासत एप्लिकेशन (ASP.NET + SQL सर्वर) है जहां डेटा-लेयर और बिजनेस-लेयर दुर्भाग्य से एक साथ मैश किए हुए हैं। डेटा एक्सेस के संदर्भ में सिस्टम विशेष रूप से जटिल नहीं है। यह अंतर-संबंधित तालिकाओं के एक बड़े समूह (35-40) से डेटा पढ़ता है, इसे मेमोरी में हेरफेर करता है और इसे सारांश प्रारूप में कुछ अन्य तालिकाओं में वापस बचाता है। अब हमारे पास कुछ रीफैक्टरिंग के लिए अवसर हैं और हमारे डेटा एक्सेस को अलग और ठीक से उपयोग करने के लिए उम्मीदवार प्रौद्योगिकियों को देख रहे हैं।

हम जो भी तकनीक तय करेंगे, हम उसे पसंद करेंगे:

  • हमारे डोमेन मॉडल में POCO ऑब्जेक्ट हैं जो दृढ़ता इग्नोरेंट हैं
  • हमारे डोमेन मॉडल ऑब्जेक्ट को अंतर्निहित डेटा स्रोत के साथ मॉकडाउन करने के लिए यूनिट टेस्ट की अनुमति देने के लिए एक अमूर्त परत है

वहाँ स्पष्ट रूप से इस पर बहुत सारे सामान हैं पैटर्न और फ्रेमवर्क आदि के संदर्भ में।

व्यक्तिगत रूप से मैं ADO.NET यूनिट टेस्टेबल रिपोजिटरी जनरेटर / POCO इकाई जनरेटर के साथ संयोजन के रूप में EF का उपयोग करने के लिए जोर दे रहा हूं । यह हमारी सभी आवश्यकताओं को पूरा करता है, आसानी से रेपो / यूनिटऑफवर्क्स पैटर्न के अंदर बांधा जा सकता है और हमारा डीबी स्ट्रक्चर यथोचित रूप से परिपक्व है (पहले से ही एक रिफ्लेक्टर से गुजर रहा है) जैसे कि हम मॉडल में दैनिक परिवर्तन नहीं करेंगे।

हालाँकि समूह के अन्य लोग हमारे DAL को पूरी तरह से खरोंचने का काम कर रहे हैं। (कस्टम DataMappers, DataContexts, रिपोजिटरी, इंटरफेसेस हर जगह, डिपेंडेंसी इंजेक्शन कंक्रीट ऑब्जेक्ट बनाने के लिए ओवरक्लिल करता है, कस्टम LINQ-to-Under क्वेरी क्वेरी ट्रांसलेशन, कस्टम कैशिंग इंप्लीमेंटेशन, कस्टम फेटिशियल इंप्लीमेंटेशन ...) लिस्ट चलती है और फ्रैंक होने के लिए स्ट्राइक है। मैं पागलपन के रूप में।

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

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


4
कुछ अच्छे (बेहतर हैं, यदि आप मुझसे पूछते हैं, लेकिन मैं उस पवित्र युद्ध को शुरू नहीं करूंगा ... ओह इंतजार) ईएफ के विकल्प, जहां आप "कोड को नियंत्रित करने में सक्षम होंगे", जैसे कि एनएचबर्नेट।
ब्रुक

@ बरोक यह कैसे पता करता है कि आपका अपना डेटा एक्सेस / डेटा मैपिंग लेयर एक "अच्छा" विचार लिख रहा है?
मिक्यद

जवाबों:


22

मौजूदा ORM के विरुद्ध दोनों तर्क अमान्य हैं:

"कम से कम हम अपने स्वयं के कोड के नियंत्रण में होंगे"

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

"ओह, मैंने पिछले प्रोजेक्ट में L2S / EF का उपयोग किया है और यह सिरदर्द के अलावा और कुछ नहीं था"

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


तो, क्या आपको अपना स्वयं का ORM लिखना होगा?

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

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

बेशक, कुछ भी नहीं आप चीजों को जानने के लिए जिज्ञासा से बाहर अपने स्वयं के ORM लिखने के लिए मना करते हैं। लेकिन आपको इसे कमर्शियल प्रोजेक्ट पर नहीं करना चाहिए।


इस प्रश्न के उत्तर के 2 से 3 बिंदु भी देखें पहिया को फिर से चालू करने और इसे पछतावा नहीं। आप देख सकते हैं कि पहिया को सुदृढ़ करने के विभिन्न कारण यहां लागू नहीं होते हैं।


10
1. प्रणाली के व्यापार-महत्वपूर्ण भागों के नियंत्रण में होना अक्सर एक अच्छा विचार है। कभी-कभी इसमें एक स्थापित और लोकप्रिय पुस्तकालय का उपयोग करने के बजाय अपने स्वयं के ढांचे को लिखना शामिल हो सकता है। 2. कभी-कभी लोकप्रिय उपकरण ओवरसोल्ड या ओवरहीप होते हैं।
मात्रा_देव

3
@quant_dev: यदि आप एक ऐसा सॉफ़्टवेयर लिख रहे हैं जो परमाणु संयंत्र या अंतरिक्ष यान को नियंत्रित करेगा, तो आप सही हैं। लेकिन मुझे कुछ संदेह है कि यह यहाँ मामला है। BTW, मुझे यकीन नहीं है कि अगर हम EF को "स्थापित और लोकप्रिय पुस्तकालय" कह सकते हैं।
आर्सेनी मूरज़ेंको

3
क्वांटलिब नामक डेरिवेटिव मूल्य निर्धारण के लिए एक प्रसिद्ध ओपन सोर्स लाइब्रेरी है। लेकिन मुझे पता है कि प्रत्येक बैंक अपने स्वयं के मूल्य निर्धारण पुस्तकालयों को लिखता है, क्योंकि यह उनके व्यवसाय के लिए महत्वपूर्ण है। अंतरिक्ष यान होना जरूरी नहीं ...
quant_dev

2
नए कर्मचारियों को काम पर रखना भी आसान है, जिनके पास आपके द्वारा उपयोग किए जा रहे हर एक व्यक्ति को फ्रेमवर्क का उपयोग करने के लिए प्रशिक्षित करने के लिए मानक फ्रेमवर्क का अनुभव है।
HLGEM

2
अपनी भाषा क्यों नहीं लिखी जाती? आपकी अपनी रूपरेखा? आपका अपना ऑपरेटिंग सिस्टम? और यह सुनिश्चित करने के लिए कि आप हर चीज के नियंत्रण में हैं, अपना खुद का हार्डवेयर बनाना भी एक अच्छा विचार है , Apple ने क्या कहा है :-)
कोनामिमन

19

सभी सामान्य CRUD सामान (कोड का 80 से 95 प्रतिशत) के लिए एंटिटी फ्रेमवर्क का उपयोग करें, और किसी भी शेष कोड के लिए कस्टम डेटा एक्सेस कोड का उपयोग करें जिसे अनुकूलित करने की आवश्यकता है। यह उन लोगों की चिंताओं को पूरा करना चाहिए जो तर्क दे रहे हैं कि आपके पास पर्याप्त नियंत्रण नहीं है।


उसके लिए खुश हो जाओ। हाँ, यही वह जगह है जहाँ मैं इसे आगे बढ़ाने की कोशिश कर रहा हूँ।
इयोन कैंपबेल

खासकर जब से ईएफ प्रौद्योगिकी एम $ के लिए आगे बढ़ रहा है। और linq देव जीवन को इतना आसान बना देता है।
सोयलेंटग्रे जूल 27'11

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

5

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

लब्बोलुआब यह है कि यह समझ में आ सकता है, सिर्फ सही परिस्थितियों में। इन स्थितियों में आम तौर पर शामिल हैं:

  1. जिस प्रोजेक्ट पर आप काम कर रहे हैं, वह काफी बड़ा है, इसलिए बड़ी मात्रा में उपयोग करने पर लागत बढ़ जाती है।
  2. आपका डेटा उपयोग पर्याप्त रूप से असामान्य है कि मौजूदा पुस्तकालय (और ऐसे) आपके उद्देश्यों के लिए काफी खराब काम करते हैं।

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

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

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

  1. जिस हद तक बिंदु सटीक लगता है, अच्छी तरह से तथ्यों, आदि द्वारा समर्थित है, और
  2. वह बिंदु जो परियोजना के हाथ में लागू होता है।

फिर मैं एक निर्णय के साथ आने के लिए कागजात और समालोचना का मूल्यांकन करूंगा (हालांकि पूरी तरह से ईमानदार होने के नाते, यह कहना मुश्किल हो सकता है कि मैं निर्णय लेने के लिए उनका कितना उपयोग कर रहा था, और एक निर्णय को सही ठहराने के लिए मैं उनका कितना उपयोग कर रहा था मैं पहले से ही बना था - मुझे पता है कि मुझे शायद यह स्वीकार नहीं करना चाहिए, लेकिन वास्तविकता यह है कि मैं भी इंसान हूं ...)

संपादित करें:

यदि मैं विशेष रूप से बुरा (या "शैक्षिक" होना चाहता था - इस मामले में अंतर बताना मुश्किल है) तो मैं आप सभी के लिए एक मौजूदा ORM / DAL का उपयोग करके समग्र विकास के प्रयास का एक अनुमान विकसित करने का प्रयास करूँगा, और विकासशील अपनी खुद की। हालांकि यह केवल एक अनुमान है, मेरा तात्कालिक अनुमान यह है कि अपनी योजना बनाने के लिए भव्य योजना वाले अधिकांश लोग अपने अनुमानों को चालू करने की जहमत नहीं उठाते - जब तक कि वे समग्र प्रयास के अनुमान के साथ नहीं आते, जो दूर से भी समाप्त हो चुका था। (और यथार्थवादी), उन्हें पता चलता है कि ऐसा कोई तरीका नहीं था जिससे वे मौजूदा कोड का उपयोग करके प्रतिस्पर्धा के करीब भी आ सकते थे। उसी समय, यह '

2 संपादित करें: (@ CmdKey के सुझाव पर): हालांकि स्पष्ट रूप से उल्लेख नहीं किया गया है, मुझे लगता है कि अनुमानित रूप से जोखिम का मूल्यांकन शामिल होगा। विशेष रूप से, समय के अनुमान में आमतौर पर PERT- शैली संख्याएँ शामिल होनी चाहिए:

  1. सब कुछ सही होने पर सबसे तेज गति का सबसे अच्छा अनुमान लगाया जा सकता है।
  2. "सामान्य" अनुमान - आप इसे कब तक लेने की उम्मीद करते हैं।
  3. सबसे खराब स्थिति का अनुमान है कि अगर सब कुछ गलत हुआ तो सबसे लंबा समय लग सकता है।

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


उस जेरी के लिए धन्यवाद। (इस उत्तर को और अधिक उभार की आवश्यकता है :-))
इयोन कैम्पबेल

लागत के बारे में @ जेरी उत्कृष्ट बिंदु, अंत में इसके प्रबंधन के बारे में क्या परवाह है, हालांकि आपको अपने "शैक्षिक" अनुरोध में जोखिम का एक माप शामिल करने की आवश्यकता है। एक परियोजना में शामिल जोखिमों की सराहना करने में विफलता सामान्य रूप से अन्य विकल्पों की तुलना में सबसे कम बोली परियोजनाओं को अधिक महंगा बनाती है।
CdMnky

@CdMnky: अच्छी बात है। उचित रूप से संपादन।
जेरी कॉफ़िन

3

आमतौर पर यह पहिया को मजबूत करने के लिए एक अच्छा विचार नहीं है, और ऐसा करना आमतौर पर तकनीकी अज्ञानता के लिए एक संकेत है ("मुझे कुछ और पता नहीं है, और सीखना नहीं चाहता") या अहंकार ("एक्स बेवकूफ है, मैं कर सकता हूं" दो सप्ताह में अपना खुद का टूल लिखो! "); ऐसे परिपक्व उपकरण हैं जो कुछ औसत डेवलपर को कुछ हफ्तों में एक साथ हैक करने की तुलना में चीजों को बहुत बेहतर कर सकते हैं।

हालांकि, कहा गया है कि कई बार आप एक मौजूदा समाधान के चारों ओर एक विरासत अनुप्रयोग को मज़बूती से फिट नहीं कर सकते (कोई फर्क नहीं पड़ता कि यह कितना लचीला है) एक टन के बिना; इस तरह एक मामले में यह "अच्छा" विचार नहीं है, लेकिन विकल्पों की तुलना में एक बेहतर विचार है (जैसे कि यह है कि इसे छोड़ना, या इसके आधे हिस्से को फिर से लिखना तीसरे पक्ष की परत का उपयोग करने में सक्षम होना है) इसलिए आपके पास बहुत कम विकल्प हैं।


3

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

मौजूदा चौखटे दसियों साल के प्रयास के उत्पाद हैं। यह कल्पना करना बेमानी है कि एक एकल टीम कुछ ही हफ्तों में कहीं भी करीब आ सकती है।


1

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


0

मैं कहूंगा कि अपना खुद का ORM रोल करना BAD आइडिया है - जब तक कि आपके पास ऐसा करने के लिए एक बहुत, बहुत ही ईश्वर कारण नहीं है (btw) जिन लोगों का आपने हवाला दिया वे अच्छे नहीं हैं :)।

मैंने एक बार गलती की कि दूसरों ने मुझे ORM का उपयोग न करने के लिए मना लिया और मैं आपको बता सकता हूं कि सभी DAL को लिखने से वास्तव में हमें धीमा पड़ गया और उन विशेषताओं को लागू करने के बजाय जो हम DAL पर समय बिता रहे थे, यह बहुत अधिक काम है। लग रहा है)।

नया EF बहुत अच्छा लगता है, लेकिन यदि आप अधिक नियंत्रण चाहते हैं - तो मैंने माइक्रो ORM / s पर ले लिया है जैसे: ड्रॉपर http://code.google.com/p/dapper-dot-net/ या PetaPOCO http : //www.toptensoftware.com/petapoco/

आप मिश्रण और मैच भी कर सकते हैं - सामान के ढेर के लिए ईएफ का उपयोग करें और कुछ ठीक ट्यूनिंग के लिए ड्रॉपर।

वैसे भी यह सिर्फ मेरी 2 सी है;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.