एसक्यूएल अधिक परिष्कृत क्यों नहीं है? [बन्द है]


39

हर कोई जानता है कि नए डेवलपर्स लंबे कार्य लिखते हैं। जैसे-जैसे आप प्रगति करते हैं, आप अपने कोड को छोटे टुकड़ों में तोड़ने में बेहतर होते हैं और अनुभव आपको ऐसा करने का मूल्य सिखाता है।

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

मान लें कि मेरे पास एक क्वेरी है जो फॉर्म लेती है:

select * from subQuery1 inner join subQuerry2 left join subquerry3 left join join subQuery4 

कुछ आईडी या दिनांक आदि का उपयोग करना।

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

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

मैंने तीन संभावित उत्तरों के बारे में सोचा है:

  1. यह पहले से ही सामान्य है और मैं अनुभवहीन लोगों के साथ काम कर रहा हूं

  2. अनुभवी प्रोग्रामर जटिल एसक्यूएल नहीं लिखते क्योंकि वे प्रक्रियात्मक कोड के साथ हार्ड डेटा प्रोसेसिंग समस्याओं को हल करना पसंद करते हैं

  3. कुछ और


12
ऐसे संगठन हैं जो केवल एक डेटाबेस को विचारों के माध्यम से क्वेरी करते हैं और संग्रहीत प्रक्रियाओं के माध्यम से इसे संशोधित करते हैं।
पीटर बी

3
एसक्यूएल मेरे लिए बहुत अधिक सुखद हो गया जब मैंने आखिरकार स्वीकार किया कि यह कभी भी मेरे सामान्य प्रक्रियात्मक कोड के रूप में डीआरवाई नहीं था।
ग्राहम

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

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

3
"कल्पना करें कि यदि अन्य प्रकार के प्रोग्रामर को हर बार फ़ंक्शन बनाने के लिए अनुरोध प्रस्तुत करना पड़ता है" ... उम्म। आप कोड की समीक्षा नहीं करते हैं?
svidgen

जवाबों:


25

मुझे लगता है कि मुख्य समस्या यह है कि सभी डेटाबेस कॉमन टेबल एक्सप्रेशन का समर्थन नहीं करते हैं।

मेरे नियोक्ता एक महान कई चीजों के लिए DB / 2 का उपयोग करते हैं। इसके नवीनतम संस्करण सीटीई का समर्थन करते हैं, जैसे कि मैं चीजों को करने में सक्षम हूं:

with custs as (
    select acct# as accountNumber, cfname as firstName, clname as lastName,
    from wrdCsts
    where -- various criteria
)
, accounts as (
    select acct# as accountNumber, crBal as currentBalance
    from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber

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

इसके साथ किया जा सकता है:

  • डीबी / 2
  • PostgreSQL
  • आकाशवाणी
  • एमएस SQL ​​सर्वर
  • MySQL (नवीनतम संस्करण; अभी भी थोड़े नया)
  • शायद दूसरों को

लेकिन यह कोड क्लीनर, अधिक सुपाठ्य, अधिक DRY बनाने की दिशा में एक लंबा रास्ता तय करता है।

मैंने सीटीई की एक "मानक लाइब्रेरी" विकसित की है जिसे मैं विभिन्न प्रश्नों के लिए प्लग-इन कर सकता हूं, जो मुझे मेरी नई क्वेरी पर उड़ान शुरू करने के लिए बंद कर देगा। उनमें से कुछ मेरे संगठन में अन्य देवों द्वारा भी गले लगने लगे हैं।

समय के साथ, इनमें से कुछ को विचारों में बदलने का कोई मतलब हो सकता है, जैसे कि यह "मानक पुस्तकालय" कॉपी / पेस्ट करने की आवश्यकता के बिना उपलब्ध है। लेकिन मेरी CTEs अंत में कभी-कभार, कभी-कभार, बहुत कम समय के लिए, बिना किसी CTE के SO WIDELY, बिना मॉड्स के उपयोग में लाने में सक्षम हो जाती है, कि यह देखने लायक हो सकती है।

ऐसा लगता है कि आपके पकड़ का हिस्सा "मुझे सीटीई के बारे में क्यों नहीं पता है?" या "मेरा DB सीटीई का समर्थन क्यों नहीं करता है?"

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

आप हटाने के लिए सीटीई का उपयोग कर सकते हैं। आप उस तालिका से रिकॉर्ड करने के लिए PK / FK मान निर्धारित करने के लिए कई CTEs ले सकते हैं। फिर, आप जिस तालिका को संशोधित कर रहे हैं, उस पर अस्पष्ट तालिका / फ़ील्ड नामों से बच नहीं सकते।

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

एसक्यूएल आपको गेटर्स / सेटर्स के साथ, टेबल को लपेटकर, डोमेन ऑब्जेक्ट के बराबर बनाने की अनुमति नहीं देता है। उसके लिए, आपको अधिक प्रक्रियात्मक / OO प्रोग्रामिंग भाषा के साथ, किसी प्रकार के ORM का उपयोग करने की आवश्यकता होगी। मैंने जावा / हाइबरनेट में इस प्रकृति की बातें लिखी हैं।


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

3
इसके अलावा ORM कुछ सुंदर जघन्य चीजों को प्रदर्शन के लिहाज से भी कर सकते हैं, खासकर ... जब आप सिर्फ डेटा का एक गुच्छा लाने के लिए गेटर्स और सेटर का उपयोग कर रहे होते हैं। हाइबरनेट एक बड़ी ज्वाइन की गई क्वेरी के बजाय सैकड़ों व्यक्तिगत प्रश्नों का उपयोग करने के लिए कुख्यात है, जो कि प्रत्येक क्वेरी पर ओवरहेड होने पर एक समस्या है।
user3067860

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

2
अन्य उत्तर महान हैं, लेकिन यह वही है जो मैं व्यक्तिगत रूप से देख रहा था। 'मुझे सीटीई के बारे में क्यों नहीं पता' मेरी समस्या का अधिकांश हिस्सा था।
ebrts

2
@ Meower68 क्या कोई जोखिम नहीं है जो CTE के व्यापक उपयोग से लोगों को ठीक से सीखने और अच्छे डेटाबेस डिज़ाइन के बारे में जानने से रोकता है? मैं सीटीई के मूल्य का समर्थन करता हूं, लेकिन यह सबक्वेरीज के साथ काम करना भी आसान बनाता है, जहां आपको नहीं करना चाहिए।
पीटर बी

36

डेटाबेस विचारों के निर्माण को बंद करना अक्सर डेटाबेस में प्रदर्शन समस्याओं से पागल संगठनों द्वारा किया जाता है। यह SQL के साथ तकनीकी समस्या के बजाय एक संगठनात्मक संस्कृति का मुद्दा है।

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

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

यह अमूर्तता के साथ है कि कोड को रिफलेक्टर करना आसान हो जाता है, क्योंकि एक अमूर्त उस अमूर्त के उपभोक्ता से कार्यान्वयन विवरण छुपाता है। स्ट्रेट SQL ऐसा कोई अलगाव प्रदान नहीं करता है, हालाँकि Oracle के लिए PL / SQL जैसे SQL के लिए प्रक्रियात्मक एक्सटेंशन या SQL सर्वर के लिए Transact-SQL लाइनों को थोड़ा धुंधला करना शुरू करते हैं।


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

5
@MasonWheeler: मुझे लगता है कि मैं SQL के उस डेटा के दृष्टिकोण से अधिक सोच रहा था जो उस पर काम करता है, न कि भाषा की विशेषताओं का कार्यान्वयन। एक डेटाबेस में टेबल्स एक अमूर्त की तरह नहीं लगते हैं। वे ठोस होते हैं, जैसे कि "phone_numbers" नामक तालिका में फ़ोन नंबर होते हैं। फोन नंबर एक अमूर्त अवधारणा नहीं है।
ग्रेग बरगार्ड

12

मुझे लगता है कि आपके प्रश्न / दृष्टिकोण से गायब होने वाली बात यह है कि SQL सेट पर संचालन (सेट संचालन आदि का उपयोग करके) निष्पादित करता है।

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

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

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

@ Greg-burghardt के रूप में छोटे मॉड्यूल में कोड को विभाजित करने के मामले में, SQL आमतौर पर कोड का एक उद्देश्य निर्मित टुकड़ा होता है और परिणामस्वरूप। यह ऐसा करता है कि एक चीज आपको करने की जरूरत है और कुछ नहीं। यह एसओएल का एसओएलआईडी का पालन कर रहा है, इसका केवल एक ही कारण है कि इसे बदल दिया जाए / प्रभावित किया जाए और जब आपको कुछ और करने के लिए उस क्वेरी की आवश्यकता हो। बाकी का संक्षिप्त नाम (OLID) यहां लागू नहीं होता है (AFAIK में कोई निर्भरता इंजेक्शन, इंटरफेस या SQL में निर्भरता नहीं है) आप जिस SQL ​​का उपयोग कर रहे हैं उसके आधार पर आप उन्हें लपेटकर कुछ प्रश्नों का विस्तार करने में सक्षम हो सकते हैं। एक संग्रहीत कार्यविधि / टेबल फ़ंक्शन में या उप-प्रश्नों के रूप में उनका उपयोग करते हुए, मैं कहता हूं कि खुले-बंद सिद्धांत अभी भी एक तरह से लागू होंगे। लेकिन मैं पीछे हटा।

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

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

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

आशा है कि ये आपकी मदद करेगा।


6

मैं आपके उदाहरण में "उपश्रेणियों" पर ध्यान केंद्रित करने जा रहा हूं।

उनका उपयोग अक्सर क्यों किया जाता है? क्योंकि वे एक व्यक्ति के सोचने के प्राकृतिक तरीके का उपयोग करते हैं: मेरे पास डेटा का यह सेट है, और इसके सबसेट पर एक कार्रवाई करना चाहते हैं और अन्य डेटा के सबसेट के साथ शामिल होते हैं। 10 में से 9 बार जो मैं एक सबक्वेरी देखता हूं, वह गलत उपयोग किया जाता है। सबक्वेरीज़ के बारे में मेरा मज़ाक उड़ाना है: जो लोग जॉइन से डरते हैं वे सबक्वेरीज़ का इस्तेमाल करते हैं।

यदि आप इस तरह की उपश्रेणियों को देखते हैं तो यह अक्सर गैर-इष्टतम डेटाबेस डिज़ाइन का संकेत भी होता है।

आपका डेटाबेस जितना अधिक सामान्यीकृत होता है, उतना ही आप जुड़ते हैं, जितना अधिक आपका डेटाबेस एक बड़ी एक्सेल-शीट की तरह दिखता है, उतने ही अधिक उप-खंड आपको मिलते हैं।

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

तो आप इतने विशाल अखंड गैर-रिफलेक्टेड प्रश्नों को क्यों देखते हैं?

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

(मेरे लिए, जितना अधिक अनुभव मुझे एसक्यूएल के साथ मिलता है, उतना ही कम मेरे प्रश्नों को मिलता है, एसक्यूएल के पास सभी कौशल स्तरों के लोगों के लिए अपने काम को प्राप्त करने के लिए कोई रास्ता नहीं है।


6
"सबक्वेरीज़" ठीक से सामान्यीकृत डीबी के कुछ एकत्रीकरण होने की संभावना है क्योंकि वे एक गैर-सामान्यीकृत डीबी के तदर्थ सामान्यीकरण हैं
केलथ

@ कैलेथ इतना सच है।
पीटर बी

5
यहां तक ​​कि अच्छी तरह से सामान्यीकृत डेटाबेसों में भी अक्सर तालिकाओं के साथ सीधे जुड़ने के बजाय, उपश्रेणियों के साथ जुड़ना आवश्यक होता है। जैसे अगर आपको समूहीकृत डेटा के साथ जुड़ने की आवश्यकता है।
बरमार

1
@ बरम जरूर, इसलिए मेरी 10 में से 9 टिप्पणी। उप-प्रश्नों का अपना स्थान है, लेकिन मैं उन्हें अनुभवहीन लोगों द्वारा अति प्रयोग में देखता हूं।
पीटर बी

मुझे डेटाबेस सामान्यीकरण (या इसके अभाव) के संकेत के रूप में "उप-संख्याओं की संख्या" का आपका मीट्रिक पसंद है।
जेसन

2

कर्तव्यों का अलगाव

SQL स्पिरिट में, डेटाबेस एक साझा परिसंपत्ति है जिसमें कंपनी का डेटा होता है, और इसे संरक्षित करना महत्वपूर्ण महत्व का है। DBA को मंदिर के संरक्षक के रूप में शामिल करता है।

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

यह सब बताता है कि डीबीए उन विचारों को जोड़ना क्यों पसंद नहीं करता है जो केवल कुछ व्यक्तिगत एप्लिकेशन के कोड के लिए हैं।

एसक्यूएल डिजाइन

यदि आप अपनी अच्छी जटिल क्वेरी में से किसी एक का विघटन करते हैं, तो आपको पता चल सकता है कि उपश्रेणियों को अक्सर एक पैरामीटर की आवश्यकता होती है जो किसी अन्य उपश्रेणी पर निर्भर करता है।

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

दुर्भाग्य से, ऐसा करने में, आप कभी-कभी एक निरंतर क्वेरी की तुलना में अधिक डेटा और कम प्रभावी रूप से एक्सेस करने के लिए बाध्य करते हैं।

मालिकाना एक्सटेंशन

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

लेकिन आखिर समस्या क्या है?

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

तो एक सफल refactoring प्राप्त करने के लिए:

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

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

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


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

1

अंक 1 और 3: दृश्य एकमात्र रास्ता नहीं हैं। RDBMS के आधार पर अस्थायी टेबल, मौसा, टेबल चर, एकत्रित कॉलम, CTE, फ़ंक्शंस, संग्रहीत कार्यविधियाँ और संभवतः अन्य निर्माण भी हैं।

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

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

LINQ जैसी तकनीक के साथ क्वेरीज़ क्लाइंट साइड करने का भी चलन है जो आप बिंदु 2 में उठाते हैं।

हालांकि मैं मानता हूं कि एसक्यूएल को संशोधित करने के लिए चुनौतीपूर्ण हो सकता है, महान प्रगति की गई है, हालांकि क्लाइंट साइड कोड और एसक्यूएल के बीच हमेशा एक द्वंद्व होगा - हालांकि 4 जीएल ने लाइनों को कुछ हद तक धुंधला कर दिया है।

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


1
मैं एक "मार्ट" निर्माण के बारे में कभी नहीं सुना है। वो क्या है?
बिशप

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

1
असमंजस में था कि ऐसा क्यों किया गया। सीधे सवाल का जवाब नहीं देता है, लेकिन "विकल्प 3: का एक स्पष्ट स्पष्ट रूप से स्पष्ट जवाब देता है: इसे संभालने के कई तरीके हैं, जो व्यापक रूप से व्यापक हैं"।
डेवी मॉर्गन

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