क्यों उपसर्ग कॉलम नाम बुरा व्यवहार माना जाता है?


25

एक लोकप्रिय एसओ पोस्ट के अनुसार यह उपसर्ग तालिका नामों के लिए एक बुरा अभ्यास माना जाता है। मेरी कंपनी में हर स्तंभ एक तालिका नाम से उपसर्ग है। मेरे लिए पढ़ना मुश्किल है। मुझे इस पर यकीन नहीं है, लेकिन यह नामकरण वास्तव में कंपनी का मानक है। मैं नामकरण सम्मेलन नहीं कर सकता, लेकिन मेरे पास अपने तर्क का समर्थन करने के लिए कोई दस्तावेज नहीं है।

मुझे बस इतना पता है कि एडवेंचरवर्क्स पढ़ना ज्यादा सरल है। में इस हमारी कंपनी डीबी आप एक तालिका देखेंगे, व्यक्ति और यह स्तंभ नाम हो सकता है:

Person_First_Name
या शायद
Person_Person_First_Name (मुझसे यह न पूछें कि आप व्यक्ति 2x क्यों देखते हैं)

स्तंभ नामों को पूर्व-ठीक करने के लिए इसे एक बुरा अभ्यास क्यों माना जाता है? क्या अंडरस्कोर को SQL में भी बुराई माना जाता है?


नोट: मैं प्रो SQL सर्वर 2008 का मालिक हूं - रिलेशन डेटाबेस डिजाइन और कार्यान्वयन। उस पुस्तक का संदर्भ स्वागत योग्य है।


2
ऐसा लगता है कि इन नियमों को बनाने वाले को अलियासिंग फ़ंक्शन के बारे में पता नहीं था।
ba__friend

@ डैनियल प्राइडेन - मैंने खराब शब्दों का इस्तेमाल किया। प्रश्न अपडेट किया गया।
पी। ब्रायन। मैके

इसी तरह की एक पोस्ट यहाँ stackoverflow.com/questions/465136/…

@ba__friend - क्या आप मुझे उस टिप्पणी पर कुछ विस्तार दे सकते हैं?
पी। ब्रायन। मैके

1
आपके द्वारा उपयोग किया जाने वाला आवश्यक शब्द मानक है। यदि आप एक मानक अभ्यास बदलते हैं, तो आपके पास असंगतता है। क्या आप ईमानदारी से महसूस करते हैं कि इस मानक अभ्यास से कोई भी परिवर्तन, परिणामी असंगति के लायक है? क्या वास्तव में यथास्थिति इससे भी बदतर है?

जवाबों:


44

अंडरस्कोर टाइप करने के लिए सिर्फ मुश्किल नहीं है। क्या बुरा है सभी मौजूदा वस्तुओं को ठीक किए बिना मानकों को बदल रहा है। अब आपके पास personId, Person_id आदि हैं और यह याद नहीं रख सकते कि कौन सी तालिका अंडरस्कोर का उपयोग करती है या नहीं। नामकरण में संगति (भले ही आप व्यक्तिगत रूप से नामों को पसंद न करें) कोड को आसान बनाने में मदद करता है।

व्यक्तिगत रूप से एकमात्र स्थान मुझे लगता है कि एक कॉलम में टैबलेन का उपयोग करने की आवश्यकता आईडी कॉलम पर है (बस आईडी का उपयोग डेटाबेस डिजाइन में एक एंटीपैटर्न है क्योंकि किसी ने जो व्यापक रिपोर्टिंग प्रश्न किए हैं वह आपको बता सकता है। यह नाम बदलने के लिए बहुत मजेदार है। हर बार जब आप एक रिपोर्ट लिखते हैं तो आपकी क्वेरी में 12 कॉलम।) इससे एफके को अन्य तालिकाओं में तुरंत जानने में भी आसानी होती है क्योंकि उनका नाम समान है।

हालाँकि, एक परिपक्व डेटाबेस में, यह एक मौजूदा मानक को बदलने के लायक होने की तुलना में अधिक काम है। बस स्वीकार करें कि यह मानक है और आगे बढ़ना है, और भी महत्वपूर्ण चीजें हैं जिन्हें पहले तय करने की आवश्यकता है।


4
यह सच है, लेकिन लगातार नामकरण मानक वाला डेटाबेस एक खराब मानक वाले क्वेरी की तुलना में कठिन है जो लगातार लागू होता है।
एचएलजीईएम

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

3
@ हसन, आप जितना सोचते हैं उससे ज्यादा तोड़ सकते हैं। डेटाबेस अक्सर कई चीजों से एक्सेस होते हैं, जिनके बारे में एप्लिकेशन प्रोग्रामर को जानकारी नहीं होती है। क्लाइंट या अन्य डेब से डेटा आयात और क्लाइंट और डेटावेयर, अन्य एप्लिकेशन, रिपोर्ट आदि के लिए निर्यात जैसी चीजें, आप घंटों के मामले में किसी भी मानक को पढ़ने के लिए उपयोग कर सकते हैं, और एक समझौते के बिना अनुमोदित कंपनी मानक से दूर रिफैक्टिंग कर सकते हैं। एक नए मानक पर जाने के लिए आपको ज्यादातर स्थानों पर निकाल दिया जाएगा। ईमानदारी से, जब तक कि डेटाबेस अपनी प्रारंभिक अवस्था में नहीं है, तब तक मौजूदा मानक का उपयोग करना बेहतर है, चाहे आप इसे पसंद करें या न करें।
HLGEM

7
@ हसन, मैं एक डेटाबेस व्यक्ति हूं, हमें व्यापक रूप से रोमांच की कोई भावना नहीं है!
एचएलजीईएम

2
पूरी तरह से TableName के साथ सहमत हूँ। मैं एक एंटीपार्टन होने के नाते। उस पैटर्न के भीतर और बिना लंबे समय तक काम किया है कि मैं आत्मविश्वास से कह सकता हूं कि गलतियाँ / भ्रम भ्रम के साथ होता है TableName.Id कि TableName.TableNameId के साथ नहीं होता है
हारूनएलएस

16

स्तंभ तालिका के लिए एक उपसर्ग का तर्क बहु-तालिकाओं में शामिल होने पर नाम "टकराव" को रोकना होगा और जब क्वेरी निर्माता उपनाम का उपयोग नहीं करेगा।

SELECT person.name, company.name FROM person JOIN company ON ...

SELECT * FROM person JOIN company ON ...

दोनों प्रश्नों में दो "नाम" कॉलम ( name_1, name_2 ) होंगे जो "बताए बिना" किस इकाई के हैं। और आप कभी भी उत्पन्न कॉलम नामों के बारे में सुनिश्चित नहीं हो सकते हैं (क्या यह name_2 या name_3 या ... होगा)। आप तालिका नाम लगाकर उपयोग करते हैं, स्तंभ नाम होगा PERSON_NAME , company_name ताकि आप प्रत्येक नाम जो संस्था के लिए यह अंतर्गत आता है पता है, प्लस आप जानते हैं कि स्तंभ नाम स्थिर रहेंगे (यदि आप उन्हें जावा में हो रही है, उदाहरण के लिए JDBC का उपयोग कर )।

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

तालिका और स्तंभ नामों में अंडरस्कोर के लिए, मैं इसे बड़े पैमाने पर उपयोग करता हूं क्योंकि मैं केवल नाम के लोअरकेस का उपयोग करता हूं साथ ही एक विभाजक के रूप में अंडरस्कोर का उपयोग करता हूं। केवल लोअरकेस का उपयोग करने से एसक्यूएल कीवर्ड्स (जो मैं सभी बड़े अक्षरों में टाइप करता है) से पहचान करने में मदद करता है:

SELECT person_name, COUNT(bought_product) FROM bought_products WHERE person_name LIKE 'A%'

6
मुझे अच्छा लगा होगा कि अगर अलग-अलग टेबलों में एक ही जानकारी वाले सभी कॉलम का एक ही नाम होता और जब भी आप अधिक उपयोग करते हैं तो 1 टेबल एलिसिंग लागू मानक होगा। किस तालिका को याद करते हुए, रोगी, pat_id, id_pat या ptatient_id मानचित्रों को याद करते हुए बहुत थकान हो रही है।
पीटर बी

1
मैं कभी भी सभी कॉलमों को अलग किए बिना प्रोडक्शन क्वेरी नहीं लिखता। यह मेनटेन को इतना आसान बना देता है। बेशक मैं 10-20 जोड़ और 30-50 कॉलम के साथ जटिल रिपोर्टिंग / निर्यात प्रकार क्वेरी लिखता हूं और छह महीने बाद यह याद रखना मुश्किल है कि वह कॉलम किस तालिका से आया था।
HLGEM

8

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


4

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

एक और सबसे अच्छा अभ्यास हमेशा आपके प्रश्नों में कॉलम और ऑब्जेक्ट को योग्य बनाना है। तो कॉलम उपसर्ग मूट हो जाते हैं और आपके कोड को अव्यवस्थित करते हैं।

इनकी तुलना करें: जो आंख पर सबसे आसान है?

SELECT P.name, P.Salary FROM dbo.Person P

SELECT Person.Name, Person.Salary FROM dbo.Person Person

SELECT dbo.Person.name, dbo.Person.Salary FROM dbo.Person

SELECT Person.Person_name, Person.Person_Salary FROM dbo.Person Person

3
निश्चित रूप से पहला एक ... :)
एरिक

3
किस बारे में SELECT name, salary FROM dbo.Person? : P
cHao

1
@ कोको: उस पर SCHEMABINDING के साथ एक दृश्य बनाने की कोशिश ...
gbn

@ पेट: मेरे लिए ठीक काम करता है। CREATE VIEW [dbo].[vwMeritPercentage] with schemabinding AS SELECT [Performance Score] as dblMinScore, ISNULL(( SELECT TOP 1 [Performance Score] FROM dbo.Budget b WHERE b.[Performance Score] > budget.[Performance Score] ORDER BY [Performance Score] ), 100.00) as dblMaxScore, [Merit Minimum] as dblMinPercentage, [Merit Midpoint] as dblBudgetPercentage, [Merit Maximum] as dblMaxPercentage FROM dbo.Budget;
cHao

1
प्रासंगिक दस्तावेज़ीकरण ( msdn.microsoft.com/en-us/library/ms187956(v=SQL.105).aspx ): "जब आप SCHEMABINDING का उपयोग करते हैं, तो select_statement में दो-भाग नाम (schema.object) तालिकाओं को शामिल करना चाहिए। विचार, या उपयोगकर्ता-परिभाषित कार्य जो संदर्भित हैं। " ध्यान दें कि स्तंभों को बिंदीदार नामों की आवश्यकता नहीं है (जब तक कि उन्हें क्वेरी में अस्पष्टता को हल करने के लिए अन्यथा आवश्यक नहीं है) ... केवल तालिकाएं, दृश्य और फ़ंक्शन।
cHao

3

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

कहा कि, स्तंभों के उपसर्ग नाम ओवरकिल लगते हैं। आप पहले से ही जानते हैं कि आप किस तालिका के साथ काम कर रहे हैं, और एक ही नाम वाले विभिन्न तालिकाओं से दो स्तंभों वाली स्थिति को आसानी से तालिका या स्तंभ उपनामों का उपयोग करके हल किया जा सकता है।


2

TSQL में आप TableName.FieldName के रूप में फ़ील्ड्स को संदर्भित कर सकते हैं यदि आप अस्पष्टता से बचना चाहते हैं, तो फ़ील्ड नामों में फ़ील्ड नामों को जोड़ने से वास्तव में पठनीयता से दूर हो जाता है, जिससे यह TableName.TableName_FieldName या समान हो जाता है। मुझे लगता है कि अंडरस्कोर का उपयोग करना या न करना एक व्यक्तिगत पसंद है। मैं CamelCase पसंद करता हूं और मैं _ का उपयोग करता हूं जब मैं एक प्रत्यय या इसी तरह के उदाहरण को जोड़ना चाहता हूं TableName_Temp, लेकिन यह सिर्फ मेरे लिए है।


2

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


1

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

जहां तक ​​एक टेबल के नाम में अंडरस्कोर का उपयोग करने की बात है, तो यह एक धार्मिक तर्क है। अंत में अगर दृश्यता बढ़ जाती है और चीजें आसान हो जाती हैं तो इसके लिए जाएं। मेरे पास आमतौर पर कॉलम या टेबल के नाम में रिक्त स्थान या टेबल नहीं होंगे। हालाँकि, मैं उन तालिकाओं या दृश्यों के लिए एक अपवाद बना सकता हूं जो केवल एक रिपोर्टिंग पैकेज द्वारा उपयोग किए गए थे, या एक सीएसवी फ़ाइल को निर्यात किए गए थे।


1

कई डेटाबेस में कॉलम नाम (यानी ओरेकल) के पात्रों की संख्या पर सख्त सीमा होती है।

यदि आप एक ऐसे डेटाबेस के साथ काम कर रहे हैं जो लंबे कॉलम नामों की अनुमति देता है, लेकिन आप बाद में यह तय करते हैं कि आप उस संरचना को किसी अन्य डेटाबेस सिस्टम पर माइग्रेट करना चाहते हैं, तो उपसर्गों की संभावना बढ़ जाएगी कि आपके कॉलम के नाम अमान्य होंगे।

यद्यपि आप अभी SQL सर्वर के साथ काम कर रहे हैं, कोई भी भविष्य की भविष्यवाणी नहीं कर सकता है, और यह संभव है कि आपके सॉफ़्टवेयर को भविष्य में कई डेटाबेस पर काम करना पड़ सकता है।


0

एक डेटा शब्दकोश (या "रजिस्ट्री") लिखने पर विचार करें। उसके द्वारा मेरा मतलब है कि आपके मॉडल में सभी डेटा तत्वों से युक्त एक दस्तावेज: नाम, विवरण, आदि। यह मॉडल के कार्यान्वयन से स्वतंत्र होना चाहिए जैसे कि तालिका के नामों का उल्लेख नहीं करना चाहिए। आप 'आईडी', 'टाइप' और 'कोड' जैसे नामों की उपेक्षा कैसे करेंगे?

एक दृष्टिकोण अंतरराष्ट्रीय मानक आईएसओ / आईईसी 11179 के दिशानिर्देशों का पालन करना है - आखिरकार, पहिया को क्यों मजबूत करना है ? मूल संरचना है:

[Object] [Qualifier] Property RepresentationTerm

तत्वों के बीच सीमांकक के साथ: SQL कॉलम नामों में रिक्त स्थान के साथ अच्छा नहीं खेलता है और अंडरस्कोर नेत्रहीन रूप से अच्छी तरह से काम करता है।

मुझे इस बात का अहसास है कि आपके संगठन का कोई व्यक्ति इन दिशानिर्देशों का पालन करने की कोशिश कर रहा था, जैसे कि वे तत्व नाम के साथ आए थे Person_Person_First_Name

मुझे जो उदाहरण दिखाना है वह यूके नेशन हेल्थ सर्विस (एनएचएस) डेटा डिक्शनरी है

इसलिए मुझे नहीं लगता कि नामकरण सम्मेलन में आपको बहुत बुरा लगता है।

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

आपको स्तंभ के नामों में सीमांकक के रूप में अंडरस्कोर पसंद करने के साक्ष्य सहित, जो सेल्को की प्रोग्रामिंग शैली में आईएसओ 11179 का अच्छा सारांश मिलेगा ।


0

कुछ को यह पता करना कोड में आसान लगता है कि डेटा किस तालिका से आया है, हालांकि, यदि आप ऑब्जेक्ट ओरिएंटेड सिस्टम के बारे में बात कर रहे हैं, तो आपको यह जानने के लिए नाम के संदर्भ का उपयोग करना चाहिए कि यह कहाँ से आया है, इस मामले में तालिका का नाम।

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

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