12

डेटाबेस तालिका में प्राथमिक कुंजी डालने पर नकारात्मक आईडी या शून्य को खराब अभ्यास क्यों माना जाता है?नकारात्मक आईडी या शून्य को खराब अभ्यास क्यों माना जाता है?

मुझे लगता है कि यह कुछ मामलों में उपयोगी हो सकता है, लेकिन लोग कहते हैं कि इस बात के बावजूद कि वे कभी नहीं कहते/जानते हैं कि यह क्यों नहीं है।

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

+0

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

+1

तरफ, यह क्लाइंट पक्ष पर रिकॉर्ड बनाने के दौरान उपयोगी होता है जिसे बाद में सर्वर पर डालने की आवश्यकता होती है: http://msdn.microsoft.com/en-us/library/ms971502.aspx – Niklas

+0

मुझे लगता है कि यह लोकप्रिय है कि ऋणात्मक संख्याओं को 'बुरा व्यवहार' माना जाता है, कुछ 'बदसूरत' से 'बचें'। यही है ना लेकिन मैं वास्तव में नहीं देख सकता क्यों ... फिर, @Yuck, आपको लगता है कि यह पठनीयता की वजह से है? – falsarella

उत्तर

20

स्पष्ट होने के लिए, यह प्रश्न और उत्तर सरोगेट कुंजी के लिए नकारात्मक संख्याओं का उपयोग करने के बारे में हैं, प्राकृतिक कुंजी के लिए नहीं।

जहां तक ​​मुझे पता है, इसे खराब अभ्यास करने पर विचार करने के तीन कारण हैं।

  1. यह principle of least surprise का उल्लंघन करता है।
  2. कुछ लोग मानते हैं कि सभी आईडी नंबर गैर-ऋणात्मक हैं।
  3. कुछ लोग त्रुटियों को इंगित करने के लिए नकारात्मक संख्याओं का उपयोग करते हैं।

पहले व्यक्ति के पास इसकी कुछ वैधता है। आप SO पर SQL उदाहरण या उत्तर कभी नहीं देखते हैं जो नकारात्मक आईडी संख्याओं का उपयोग करते हैं। (मैं इसे बदलना चाहता हूं, आज से शुरू कर रहा हूं।)

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

नंबर 2 के लिए, एप्लिकेशन प्रोग्रामर कमरे की अनुमति नहीं देकर सूक्ष्म त्रुटियों का परिचय दे सकते हैं यूआई कोड में साइन, जो -123456 123456 की तरह दिख सकता है।

तीसरे को कोड कोड के साथ करना है जो आईडी नंबर देता है। कोड जो एक आईडी नंबर देता है -1 को एक त्रुटि कोड के रूप में वापस कर सकता है। लेकिन -1 ज्यादातर मामलों में एक मान्य आईडी संख्या है। (अधिकांश डेटाबेस आईडी संख्याओं को गैर-ऋणात्मक पूर्णांक की सीमा तक सीमित नहीं करते हैं।)

+0

आप इन कारणों को शून्य के लिए मानते हैं, या क्या कुछ अलग है? – falsarella

+0

शून्य के लिए, मुझे लगता है। कुछ स्थानों को 0 के लिए गैर-शून्य प्रतिस्थापन के रूप में उपयोग करते हैं। –

+0

तब कोई प्रतिबंध नहीं, धन्यवाद! समस्या कार्यान्वयन कोड होगा। लेकिन ... व्यवस्थापक उपयोगकर्ताओं या इस तरह के कुछ स्थिरांक के लिए -1 का उपयोग करने के बारे में क्या? आप कैसे संभालेंगे – falsarella

6

@ माइक शेरिल 'बिल्ली रिकॉल' का उत्तर IMHO गलत है।

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

शून्य: शून्य एक आईडी के रूप में कार्य कर सकता है। हालांकि इसकी अनुशंसा नहीं की जाती है क्योंकि यह अक्सर खाली क्षेत्र/शून्य मूल्य को दर्शाती है।

+0

अच्छा बिंदु। +1। क्या आपके पास इसके बारे में कोई स्रोत है? कभी भी प्रतिनिधित्व वास्तुकला के बारे में सोचा नहीं, लेकिन फिर भी शेष क्षेत्र के प्रकारों के लिए पोर्टेबिलिटी समस्या होगी, वैसे भी ... इसलिए, कम से कम आश्चर्य का सिद्धांत अभी भी एक और प्रासंगिक कारण प्रतीत होता है। – falsarella

+2

औपचारिक रूप से, एक पहचानकर्ता एक टोकन है (https://en.wikipedia.org/wiki/Identifier में एक अच्छा अवलोकन है), इसलिए एक नकारात्मक संख्या केवल टोकन माना जा सकता है यदि आप इसे वर्णों के अनुक्रम के रूप में मानते हैं, किस तरह की अपनी प्रकृति को "ऋणात्मक" मानती है। तो आपके प्रश्न के संदर्भ में, जहां आईडी एक * संख्या * है और एक स्ट्रिंग नहीं है, तो यह संख्या * नकारात्मक होने पर आईडी के रूप में कार्य नहीं करनी चाहिए। यह केवल "कम से कम आश्चर्य के सिद्धांत" मामले में एक सिफारिश नहीं है, यह है, आईएमएचओ एक नकारात्मक आईडी का उपयोग करने की गलती है। शायद आईडी के रूप में फ्लोट्स का उपयोग करने का अधिक चरम उदाहरण अधिक सहज है। – avnr

+0

मुझे लगता है कि बैकअप और डेटाबेस को पोर्ट करने के कई तरीके हैं। बाइनरी बैकअप/पोर्टेबिलिटी एक विकल्प है, लेकिन हम इसके लिए प्रतिबंधित नहीं हैं। वास्तविक गलती भौतिक वास्तुकला पर बैकअप या बंदरगाह के लिए भरोसा करेगी। जैसा कि मैंने उल्लेख किया है, यदि ऐसा हुआ, तो पोर्टेबिलिटी अभी भी किसी भी अन्य अप्राप्य कॉलम के लिए एक समस्या होगी। इसलिए पीके के लिए इसे हल करना वास्तव में कुछ भी हल नहीं करेगा। आपका कथन केवल पीके के लिए लागू नहीं होता है, यह किसी भी संख्या कॉलम पर लागू होता है, इसलिए ऋणात्मक अनुमति होने पर इसे कहीं भी इस्तेमाल करने की गलती होगी, जो वास्तव में गैर-समझ में है। – falsarella

2

इस समस्या पर चर्चा करने वाले 51 मिलियन से अधिक साइटें हैं।

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

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

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