2010-05-04 20 views
6

मैंने एसपी या डीएस दोनों के लिए और उसके खिलाफ कई मजबूत विचार पढ़े हैं।गतिशील एसक्यूएल बनाम संग्रहीत प्रक्रियाओं - पेशेवरों और विपक्ष?

मैं सी ++ में एक क्वेरी इंजन लिख रहा हूं (अब के लिए mySQL बैकएंड, हालांकि मैं एक सी ++ ओआरएम के साथ जाने का फैसला कर सकता हूं)। मैं यह तय नहीं कर सकता कि एसपी लिखना है या गतिशील रूप से एसक्यूएल बनाना है और डीबी इंजन को क्वेरी भेजना है। #

निर्णय लेने के तरीके पर कोई सुझाव?

उत्तर

1

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

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

परिदृश्य पर विचार करें जहां आपके एसपी में एक बग है। अब इसे बदलने की जरूरत है, लेकिन फिर आप दूसरे डेवलपर डेटाबेस/सैंडबॉक्स पर आते हैं। सैंडबॉक्स और एसपी क्या संस्करण है? अब आपको कई संस्करणों को ट्रैक करना होगा।

+0

यह बीएस है। संस्करण नियंत्रण एसक्यूएल कोड बनाम सी ++ कोड के लिए यह कोई कठिन नहीं है। कई तरीकों से डीबी में चीजों को संशोधित करना बहुत आसान है; एक संग्रहित प्रक्रिया को बदलें, और आप कर रहे हैं, बनाम recompiling और पुस्तकालयों और निष्पादन योग्य पुनर्वितरण। – Joe

1

मुख्य अंतरियों में से एक यह है कि क्या आप "एक सच्चे फ्रंट एंड" लिख रहे हैं या डेटाबेस आपके आवेदन का केंद्रीय टुकड़ा है या नहीं।

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

अंत में, यदि आप एकाधिक डेटाबेस (उदाहरण के लिए ओरेकल और एसक्यूएल संगत कोड) के लिए कोडिंग कर रहे हैं, तो मैं संग्रहित प्रक्रियाओं से पूरी तरह से बचूंगा।

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

1

मुख्य परिदृश्यों चाहिए जब आप सपा है: आप भारी संकलन भूमि के ऊपर और डेटा के साथ प्रश्नों की बहुत ही जटिल सेट है जब

1) कम बहाव काफी है कि कंपाइल एक नियमित आधार पर की जरूरत नहीं है।

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

कोई अन्य परिदृश्य, यह बहस योग्य है, और एक या दूसरे तरीके से तय किया जा सकता है।

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

1

एक चीज जिसे आप टालना चाहते हैं, वह है कि आपके व्यवसाय के तर्क आपके आवेदन के कई स्तरों पर फैले हों। डाटाबेस डीडीएल और डीएमएल एक आवेदन कोड आधार के साथ सिंक में रखने के लिए काफी मुश्किल हैं।

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

अपने सभी व्यावसायिक तर्क को किसी एप्लिकेशन या सेवा में डालें जो कॉल (स्थिर/गतिशील) एसक्यूएल तब उस व्यावसायिक कार्यक्षमता को लपेटता है जिसे आप बेनकाब करने की कोशिश कर रहे हैं।

संग्रहीत प्रक्रियाओं के दो उद्देश्य हैं जिन पर मैं सोच सकता हूं।

  1. डेटा पहुंच को सरल बनाने में सहायता। संग्रहित प्रक्रिया उस में किसी भी व्यापार तर्क नहीं है, यह सिर्फ डेटा की संरचना के बारे में जानता है और अलग तीन टेबल तक पहुँचने के लिए एक इंटरफेस और एक दृश्य सिर्फ जानकारी के एक टुकड़े को पाने के लिए उजागर करता है।
  2. डेटा पर डोमेन मॉडल मैपिंग मॉडल, संग्रहीत प्रक्रिया को डेटा मॉडल को दिए गए डोमेन मॉडल की तरह बनाने में सहायता कर सकती है।

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

+1

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

+1

@ जो - सही स्थान तर्क के लिए डेटाबेस नहीं है। –

2

यहाँ सरल जवाब है:

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

+0

+1 दुबला और तेज़, जैसे हम उन उत्तरों को पसंद करते हैं। ;) –

+2

मैं असहमत हूं। ऐप में एसक्यूएल का मतलब है कि जब आप खराब लिखित क्वेरी (खराब प्रदर्शन, खराब डेटा इत्यादि) पाते हैं तो आपको ऐप का पुनर्निर्माण करने के लिए मजबूर किया जाता है। डेटाबेस में, आप proc को संशोधित करते हैं, और आप कर चुके हैं। – Joe

+2

बेशक, आपकी असहमति कई कारकों पर निर्भर करती है। आप वितरित एक मोनोलिथिक एप्लिकेशन मान रहे हैं। उस स्थिति में, हाँ, आप शायद सही हैं। लेकिन एक अच्छी तरह से निर्मित ऐप एक बड़ा exe नहीं है जिसे हर बदलाव पर पुन: संकलित करने की जरूरत है। जैसे आप एक आवेदन के लिए अपने सभी डेटा स्टोर करने के लिए एक टेबल का उपयोग नहीं करेंगे। – Sophtware

0

डीएस अधिक लचीला है। एसपी दृष्टिकोण आपके सिस्टम को और अधिक प्रबंधनीय बनाता है।

1

संग्रहित प्रक्रियाओं के लिए आदर्श हैं:

  • जटिल क्वेरी से अधिक पुन: प्रयोज्य कपोल-कल्पना बनाना;
  • टेबल के लिए विशिष्ट प्रकार के सम्मिलन/अपडेट लागू करना (यदि आप तालिका में अनुमतियों को भी अस्वीकार करते हैं);
  • विशेषाधिकार प्राप्त संचालन करना जो लॉग-इन उपयोगकर्ता को सामान्य रूप से करने की अनुमति नहीं दी जाएगी;
  • एक सतत निष्पादन योजना की गारंटी;
  • ओआरएम (बैच अपडेट, पदानुक्रम प्रश्न आदि) की क्षमताओं को विस्तारित करना।)

गतिशील एसक्यूएल आदर्श है के लिए:

  • चर खोज बहस या उत्पादन कॉलम:
    • वैकल्पिक खोज की स्थिति
    • धुरी टेबल
    • IN खंड उपयोगकर्ता द्वारा निर्दिष्ट मान
    • साथ
  • ओआरएम कार्यान्वयन (अधिकांश एसपी का उपयोग कर सकते हैं, लेकिन उन्हें पूरी तरह से बनाया नहीं जा सकता है);
  • डीडीएल और प्रशासनिक स्क्रिप्ट्स।

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

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

संबंधित मुद्दे