क्या कोई TSQL के लिए कोडिंग मानकों की सिफारिश कर सकता है?


9

हमारे पास .Net कोड के लिए लंबे समय से कोडिंग मानक हैं, और उन विचारों के लिए कई सम्मानित स्रोत हैं कि उन्हें कैसे लागू किया जाए जो समय के साथ विकसित होते हैं।

मैं एसक्यूएल के लिए कुछ मानकों को एक साथ रखने में सक्षम होना चाहता हूं जो हमारे उत्पादों द्वारा उपयोग के लिए लिखे गए हैं, लेकिन सर्वसम्मति से लिखे गए एसक्यूएल को निर्धारित करने के लिए आम सहमति पर कोई संसाधन नहीं हैं?


1
Pinal Dave की साइट पर कोडिंग मानकों की एक सूची है । वे मानकों के एक सेट के लिए एक उचित आधार की तरह दिखते हैं।
एक


1
@ पता लगाएं कि केवल पहचान शामिल है; नामकरण के बारे में कुछ भी नहीं, कर्सर का उपयोग / संग्रहीत प्रक्रियाओं / डेटाटाइप के विकल्प या कुछ भी जो वास्तव में कोड की गुणवत्ता को प्रभावित करता है ...
रोलैंड शॉ

1
ठीक है, इसलिए मैंने कहा कि यह "संबंधित" था, "डुप्लिकेट" नहीं।
स्कॉट व्हिटलॉक

जवाबों:


6

अपने अनुभव में मैं जिन मुख्य चीजों की तलाश करूंगा, वे हैं:

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

  • सभी बनाता है एक ड्रॉप (मौजूदा वस्तु पर सशर्त) उनकी फ़ाइल के हिस्से के रूप में शामिल होना चाहिए। आप अपने लिए अनुदान अनुमति भी शामिल कर सकते हैं।

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

  • ऑब्जेक्ट प्रकारों के लिए उपसर्ग विशेष रूप से जहां वे भ्रमित हो सकते हैं (इसलिए सबसे महत्वपूर्ण होने के लिए वी देखें)। सुनिश्चित नहीं है कि यह अभी भी लागू होता है, लेकिन यह sp_ शुरू करने के लिए सिस्टम प्रक्रियाओं के अलावा संग्रहीत प्रक्रियाओं के लिए अक्षम हुआ करता था। शायद सबसे अच्छा अभ्यास उन्हें अलग करने के लिए वैसे भी us__ वही था जो मैंने हाल ही में उपयोग किया है।

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

  • SQL सर्वर या स्कीमा के पूर्व संस्करणों में वस्तुओं के स्वामित्व के लिए मानक यह 2005 और बाद में मौजूद होना चाहिए। यह आपकी कॉल है कि यह क्या है, लेकिन आपको कभी भी यह अनुमान नहीं लगाना चाहिए कि कोई ऐसा व्यक्ति है / जहाँ वह रहता है) और जहाँ संभव हो स्कीमा / मालिक को इसे गलत तरीके से बनाए जाने की संभावना को कम करने के लिए क्रिएट स्क्रिप्ट में शामिल किया जाना चाहिए।

  • एक संकेतक जो SELECT * का उपयोग कर रहा है, वह अपने स्वयं के मूत्र का एक पिंट पीने के लिए बनाया जाएगा।

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

मुझे यकीन है कि मैंने कुछ याद किया है, लेकिन मेरे लिए वे वही हैं जो वास्तव में स्थितियों की एक सभ्य संख्या में वास्तविक लाभ प्रदान करते हैं।

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

संपादित करें: दो सुधार - स्वामित्व अनुभाग में स्कीमा सहित, गणना (*) के बारे में एक गलत टिप को हटाने से - नीचे टिप्पणी देखें।


1
कुछ अजीब विकल्प ... "SELECT COUNT (*)" खराब है? कभी स्कीमा के बारे में सुना है (जो मालिक के समान नहीं है)? आपके अन्य लोग अच्छे हैं
gbn

1
@ जौन हॉपकिंस - मुझे पता है कि इसका चयन * का उपयोग करने के लिए क्यों बुरा है। यह बहुत अच्छा होगा यदि आप कह सकते हैं कि SELECT COUNT (*) का उपयोग करना बुरा क्यों है।
k25

1
@gb @ k25 - कुछ साल पहले (2002?) मेरे पास एक डीबीए था जो गिनती (*) पर बहुत गर्म था लेकिन आपके सवालों के जवाब में गोग्लिंग ऐसा लगता है कि यह अब पुराना हो गया है (यदि यह कभी सच था)। sqlservercentral.com/articles/Performance+Tuning/adviceoncount/… (पंजीकरण आवश्यक)। वह मुख्य रूप से एक ओरेकल डीबीए था, इसलिए यह वहां एक वास्तविक मुद्दा हो सकता है जिसे उसने मान लिया था कि यह एसक्यूएल ऑप्टिमाइज़र के लिए भी एक मुद्दा था।
जॉन हॉपकिंस

1
@ मेरे - हां मेरे पास है, हालांकि मैं अपेक्षाकृत हाथों से दूर रहा हूं क्योंकि उन्हें पेश किया गया था इसलिए मेरी स्वचालित प्रतिक्रिया उपयोगकर्ताओं की थी। मैं स्कीमा कवर करने के लिए उत्तर को अपडेट करूंगा।
जॉन हॉपकिंस

1
@gb, @ k25 - गिनती (*) पर अधिक खुदाई। जाहिरा तौर पर यह ओरेकल 7 और इससे पहले, 8i और उससे परे में तय किया गया एक मुद्दा था। यह स्पष्ट नहीं है कि यह एसक्यूएल सर्वर में कभी एक मुद्दा था, लेकिन निश्चित रूप से कोई और नहीं है। मेरा डीबीए ऐसा लगता है कि यह तारीख से बाहर था।
जॉन हॉपकिंस

3

वहाँ कोई संसाधन नहीं लगता है कि सर्वसम्मति पर वहाँ क्या लिखा SQL के लिए निर्धारित करता है

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

उस ने कहा, एक कोडिंग मानक अभी भी एक अच्छी बात है, और एक मानक जिसे टीम के सभी लोग समझते हैं और इससे सहमत हैं, एक बेहतर बात है, क्योंकि उस मानक का पालन करने की संभावना अधिक होगी।


1
+1। मुझे लगता है कि सबसे महत्वपूर्ण बात यह है कि आपको अपनी टीम के बीच निरंतरता मिली है।
डीन हार्डिंग

1
ब्याज से अलग आप क्या करेंगे? क्या वे बड़े पैमाने पर स्वाद (लेआउट और इतने पर) के मामले हैं या कोई "कठिन" त्रुटियां हैं?
जॉन हॉपकिंस

1
@Jon: कोई हार्ड एरर नहीं, सिर्फ सब्जेक्टिव चीजें जैसे सिंग्युलर टेबल नेम, ट्रिगर्स से नफरत, आदि। BTW, "SELECT *" एक "EXISTS ()" के अंदर ठीक है।
लैरी कोलमैन

1
उचित उदाहरण (और मैं इसका उपयोग EXISTS के साथ करता हूं और खुद को पेशाब पीने के लिए मजबूर नहीं करता)।
जॉन हॉपकिंस

1

जॉन हॉपकिंस के जवाब के अलावा ...

  • आंतरिक बनाम बाहरी वस्तुओं को अलग करें

    • IX, UQ, TRG, CK आदि बाधाओं और अनुक्रमणिका आदि के लिए
    • लोअर केस या क्लाइंट के लिए कैप्सकैस का सामना करना पड़ रहा है जैसे कि uspThing_Add
  • आंतरिक वस्तुओं के लिए, उन्हें स्पष्ट करें यदि "गैर डिफ़ॉल्ट"

    • यूक्यू = अद्वितीय बाधा
    • यूक्यूसी = अद्वितीय गुच्छेदार बाधा
    • पीके = प्राथमिक कुंजी
    • पीकेएन = गैर-प्राथमिक प्राथमिक कुंजी
    • IX = सूचकांक
    • IXU = अद्वितीय सूचकांक
    • IXC = क्लस्टर इंडेक्स
    • IXCU या IXUC = अद्वितीय क्लस्टर इंडेक्स
  • नामकरण + अनुमतियों को सरल बनाने के लिए स्कीमा का उपयोग करें। उदाहरण:

    • आंतरिक procs के लिए Helper.xxx
    • Udfs के लिए HelperFn.xxx
    • कुछ सामना करने वाले कोड के लिए WebGUI.xxx
    • डेटा और / या इतिहास और / या तालिकाओं के लिए मंचन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.