व्यापार तर्क को संग्रहीत प्रक्रिया में रखना है या नहीं?


21

इस विषय पर हमेशा बहस होती है - "क्या व्यावसायिक तर्क को संग्रहीत प्रक्रिया में रखा जाना चाहिए या नहीं?"। यदि हम तय करते हैं कि ORM टूल का उपयोग न करें और Business Logic को Stored Procedure में नहीं डालें तो हम Business Logic को कहाँ रखेंगे?

अपने पिछले अनुप्रयोगों में मैंने हमेशा सभी व्यावसायिक लॉजिस्टिक्स को केवल संग्रहीत प्रक्रियाओं में रखना पसंद किया है। फिर .NET कोड से मैं डेटा एक्सेस एप्लिकेशन ब्लॉक का उपयोग करके इन संग्रहीत प्रक्रियाओं को कॉल करता हूं। SQLHelper आदि। लेकिन यह हर समय परिदृश्य नहीं हो सकता है। तो मैंने कुछ गुगली की लेकिन भ्रम में समाप्त हो गया ……।

कोई सुझाव ...?


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

4
@Darknight, अपने मंच और वास्तुकला पर बहुत कुछ निर्भर करता है जैसे कि एक बयान। मैं यह नहीं देखता कि एक संग्रहीत प्रक्रिया को किसी डेटाबेस में तैनात करना कहने की तुलना में बहुत कम समय लेने वाला क्यों है, एक नई WAR फ़ाइल बनाने के लिए एक बिल्ड और परिनियोजित स्क्रिप्ट को निष्पादित करने, इसे तैनात करने और ऐप सर्वर को पुनरारंभ करने के लिए।
maple_shaft

7
संग्रहीत प्रक्रियाएं - कंप्यूटर विज्ञान के सेप्टिक टैंक।
मोंगस पोंग

1
संग्रहीत प्रक्रियाएं - किसी भी अन्य की तरह सिर्फ एक और उपकरण।
सैम यी

जवाबों:


15

मैं एक व्यावहारिक दृष्टिकोण अपनाऊंगा - ऐतिहासिक रूप से संग्रहीत प्रोक्स में व्यावसायिक तर्क रखने का प्राथमिक 'लाभ' प्रदर्शन कारणों (2.5 स्तरीय वास्तुकला) के लिए है, जबकि व्यावसायिक तर्क को एक BLL टियर (3 / N tier) में अलग करना आम तौर पर एक से क्लीनर है रखरखाव के परिप्रेक्ष्य, और परीक्षण करने में आसान (डेटा एक्सेस का मॉक / स्टब आउट)।

हालांकि, यह देखते हुए कि LINQ2SQL, EF और NHibernate जैसे LINQ- सक्षम .NET ORMS अब पैरामीटर किए गए SQL क्वेरी बनाते हैं, जहां क्वेरी प्लान को कैश किया जा सकता है, SQL इंजेक्शन आदि के लिए बच जाते हैं, मुझे लगता है कि 3 या N टियर आर्किटेक्चर के लिए कदम है पहले से कहीं अधिक सम्मोहक, और अधिकांश SPROCs (विशेषकर क्वेरी-केंद्रित वाले) को पूरी तरह से टाला जा सकता है। .NET में रिपॉजिटरी पैटर्न आमतौर पर IQueryable / एक्सेप्ट करें। अभिव्यक्ति ट्री मापदंडों को स्वीकार करते हैं, जो आपके टेबल पर सुरक्षित, फिर भी लचीली पहुंच के लिए अनुमति देता है। (व्यक्तिगत रूप से SOA प्रकार के आर्किटेक्चर में, मैं BL से परे IQueryable को उजागर नहीं करूंगा, अर्थात आपकी सेवा और प्रस्तुति टियर को अच्छी तरह से परिभाषित तरीकों के साथ काम करना चाहिए। कारण यह है कि अन्यथा आप पूरी तरह से अपने सिस्टम का परीक्षण कभी नहीं कर सकते, और आप जीत गए। '

हालांकि, एक सभ्य आकार की प्रणाली में, हमेशा कुछ अपवाद होंगे, जहां प्रदर्शन के कारणों के लिए कोड के एक वास्तव में डेटा तीव्रता वाले टुकड़े को अभी भी संग्रहीत प्रोक के रूप में लिखने की आवश्यकता हो सकती है। इन उदाहरणों में मैं SPROC को रखेगा, और ORM के माध्यम से SPROC को उजागर करेगा, लेकिन फिर भी आपके BLL पर पास-थ्रू विधि के रूप में फ़ंक्शन को उजागर करेगा।


1
एप्लिकेशन टियर पर इकाई परीक्षण लिखना आसान है, हालांकि स्वचालित DB इकाई परीक्षण रूपरेखाओं ने एक लंबा सफर तय किया है।
maple_shaft

14

जावा डेवलपर होने के नाते मेरी प्राथमिकता बीएलएल (अच्छा और आसान स्रोत नियंत्रण, परिचित आदि) आदि में व्यावसायिक तर्क रखना था।

हालाँकि, विभिन्न तकनीकों (C #, Java, पिक (पूछें नहीं) का उपयोग करके कई वितरित अनुप्रयोगों के साथ एक बड़े उद्यम के लिए काम करने के बाद, संग्रहीत प्रक्रियाओं का उपयोग करने का एक महत्वपूर्ण लाभ स्पष्ट हो गया:

संग्रहीत कार्यविधियाँ विभिन्न अनुप्रयोगों में साझा की जा सकती हैं


बहुत अच्छा बिंदु
NoChance

1
यह बहुत सच है, और हम इसे अपने पर्यावरण में अच्छे प्रभाव के लिए उपयोग करते हैं। हालाँकि, डेटा लेयर का उपयोग करके कोड साझा करना हमेशा मेरे लिए थोड़ा खतरनाक लगता है। यदि आपके पास दिए गए तर्क / डेटा के कई उपभोक्ता हैं तो मैं इसके बजाय एक ही डेटाबेस के कई उपभोक्ताओं के सामने एक सेवा रखूँगा।
RationalGeek

2
यदि आप अपने डेटा प्रबंधन को पुस्तकालयों में विभाजित करते हैं, तो उन पुस्तकालयों को सैद्धांतिक रूप से अलग-अलग अनुप्रयोगों में साझा किया जा सकता है ...
ग्लेनट्रॉन

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

1
fyi यह उत्तर बैलोनी है, 6yrs बाद में - केवल डेटा डेटाबेस में जाता है। आप तर्क देते हैं कि आपको लाइन में बहुत परेशानी है। बस अपनी पसंद की भाषा में microservice बनाएँ जो db तक पहुँचती है।
निमचम्प्स्की

6

हमारी टीम का यहां नरम शासन है। कभी-कभी टी-एसक्यूएल में बिजनेस लॉजिक को हल करना बेहतर होता है, कभी-कभी इसे सी # (बिजनेस लेयर) में करना आसान होता है।

इसलिए हमारे पास एक व्यावहारिक समाधान है: जहां इसे बेहतर तरीके से फिट किया जाता है, वहां रखें। मुझे पता है कि सिद्धांत कभी-कभी इसके बारे में बहुत सख्त है ... लेकिन यह सिद्धांत :-)


2
निश्चित रूप से यह सभी का सबसे खराब समाधान है? एक डेवलपर को कैसे पता चलता है कि तर्क कहाँ संग्रहीत है? मुझे लगता है कि कभी-कभी यह एप्लिकेशन लेयर में भी रेंगता है, या इससे भी बदतर, UI?
पॉल टी डेविस

2
नहीं। यह हमेशा बिजनेस लेयर या T-SQL में है। यह पता लगाना कि तर्क कहाँ संग्रहीत है, यह रखरखाव की बात आने पर सबसे छोटी समस्या है।
gsharp

क्या होता है जब कोई टीम में शामिल होता है और आप उन्हें यह नियम बताते हैं? उन्हें कैसे पता होना चाहिए कि कुछ कहाँ "बेहतर है"? यह लगभग मुझे एक गैर-नियम की तरह लगता है। व्यक्ति के आधार पर बहुत व्यक्तिपरक।
RationalGeek

3
आओ दोस्तों, गंभीर? हम ऐसे लोगों को नियुक्त करते हैं जिनके पास सोचने के लिए एक मस्तिष्क है और जो बोर्ड पर कुछ अनुभव के साथ आते हैं। फिर .. ओह हाँ, उनके पास पूछने और बातचीत करने के लिए एक मुँह है। मैं कह सकता हूं कि हमारे सॉफ्टवेयर को बहुत कम रखरखाव की जरूरत है और नई सुविधाओं को हमारी टीम में लगभग हर कोई ठीक कर सकता है। हम जो कर रहे हैं वह गलत नहीं हो सकता।
gsharp

4
मुझे वास्तव में ऐसी चीज़ों का दुरुपयोग करने का कोई मतलब नहीं दिखता है जो कि SQLServer इतना बेहतर कर सकती हैं, और इसके विपरीत।
gsharp

3

दोनों के फायदे और नुकसान हैं (मेरी राय में):

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

दूसरी ओर, संग्रहीत कार्यविधियाँ कुछ स्थितियों में त्वरित बग फिक्स के लिए अनुमति देती हैं। यदि एक संग्रहीत कार्यविधि के साथ एक बग है तो आप इसे ठीक कर देते हैं और आपका काम हो जाता है। ORM में बग फिक्स के पुनर्निर्माण की आवश्यकता है। आपकी निर्माण प्रक्रिया के आधार पर यह लंबा / कष्टप्रद हो सकता है।


यदि आप उन्हें भारी उपयोग करने जा रहे हैं तो संग्रहीत प्रोक के साथ स्रोत नियंत्रण की आवश्यकता के लिए +1। कई DBAs जिनके साथ मैंने काम किया है, इस विचार के लिए बहुत प्रतिरोधी हैं।
RationalGeek

2

हम हमेशा अपने Business Logic को Business Logic Layer में रखते हैं। यदि आप इसे संग्रहीत प्रक्रिया में डालते हैं, तो अपना RDBMS बदलने के बाद यह खो जाएगा।


16
आखिरी चीज़ जो बदल जाती है वह है RDBMS ;-)
gsharp

तो क्या इसका मतलब है, कि आप डेटा को प्राप्त करने, अद्यतन करने और सम्मिलित करने के लिए संग्रहीत प्रक्रिया को सीमित करते हैं ....?
प्रवीण पाटिल

1
प्रत्येक बड़ी प्रणाली जो मैंने देखी है, वास्तविकता यह है कि डेटाबेस सिस्टम है। प्रोग्रामिंग भाषाएँ लगभग इस बिंदु पर अप्रासंगिक हो जाती हैं जैसे कि "फ्रंट एंड" ..
डार्कनाइट

2
@gharp, यह हमेशा सच नहीं है। आप या तो Oracle की तरह एक और RDBMS जोड़ना चाहते हैं, या मौजूदा को पूरी तरह से बदल सकते हैं। या, कुछ मामलों में, आप वास्तविक डेटा को डमी डेटा से बदलना चाहते हैं।
šljaker

2
@ šljaker बेशक यह हमेशा सच नहीं है। लेकिन यह अधिक संभावना है कि कार्यक्रम में परिवर्तन (सॉफ्टवेयर के नए स्वरूप, नई प्रोग्रामिंग भाषाओं, आदि) के बजाय डीबी।
gsharp

2

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

ऐसे मामले होते हैं, जब कोई नियम पढ़ा हुआ डेटाबेस पर आधारित होता है। कहते हैं कि आप खाता 1 से खाते 2 में धनराशि स्थानांतरित करना चाहते हैं। आपको दोनों खातों को पढ़ने की जरूरत है, सुनिश्चित करें कि वे अच्छी स्थिति में हैं और खाता 1 में राशि पर्याप्त है। इस मामले में, सर्वर इस नियम के लिए एक बेहतर उम्मीदवार है क्योंकि क्लाइंट (बीएल यहां) को इस प्रक्रिया के लिए डेटाबेस टियर को 3 कॉल जारी करने की आवश्यकता नहीं है।

बेशक, अगर आपको डेटाबेस के स्वतंत्र होने के लिए आपके समाधान की आवश्यकता है, तो केवल CRUD के लिए संग्रहीत प्रॉपर (यदि उपयोग किया गया हो)।


1

तर्क हमेशा BLL में होना चाहिए क्योंकि:

  • इसका सही परीक्षण किया जा सकता है
  • जब SQL 20XX अप्रचलित हो जाता है और आपको नवीनतम संस्करण में बदलने की आवश्यकता होती है, तो आपको अपने कोड को फिर से लिखना नहीं पड़ता है।
  • लोगों को मक्खी पर बदलाव करने के लिए लुभाया नहीं जाता है (जो कि एसपी के लिए एक तर्क के रूप में सामने रखा जा रहा है)
  • एसपी, मेरे अनुभव में, डेवलपर की त्रुटि का सबसे बड़ा बिंदु है, खासकर रखरखाव / परिवर्तन की कुछ पीढ़ियों के बाद।

मेरा मानना ​​है कि एक कानून होना चाहिए जिसमें कहा गया है कि एक एसपी एक्स लाइनों से अधिक लंबी होने के बाद, यह इरादा के अनुसार काम नहीं करता है।


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

मक्खी पर बदलाव से मेरा मतलब उन चीजों से है जिनका परीक्षण नहीं किया जाता है और वे औपचारिक रिलीज प्रक्रिया का पालन नहीं करते हैं। और हाँ, मास्क कोड बग में सपा परिवर्तन कुछ ऐसा है जिसे मैंने काफी हद तक देखा है।
पॉल टी डेविस

0

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

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

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


0

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

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