2010-02-02 4 views
48

मैं एक तालिका में प्राथमिक कुंजी के रूप में स्वत: वृद्धिशील पूर्णांक जोड़ने या नहीं करने का निर्णय लेने के लिए "सर्वोत्तम प्रथाओं" को समझने की कोशिश कर रहा हूं।ऑटो-वृद्धि वाली प्राथमिक कुंजी का उपयोग कब करें और कब नहीं?

मान लें कि मेरे पास रासायनिक तत्वों के बारे में डेटा युक्त एक सारणी है। प्रत्येक तत्व की परमाणु संख्या अद्वितीय है और कभी नहीं बदलेगी। इसलिए प्रत्येक कॉलम के लिए ऑटो-इंक्रिमेंटिंग इंटीजर का उपयोग करने के बजाय, यह संभवतः परमाणु संख्या का उपयोग करने के लिए और अधिक समझ में आएगा, सही?

यदि मेरे पास किताबों की एक तालिका थी तो क्या यह सच होगा? क्या मुझे प्राथमिक कुंजी के लिए आईएसबीएन या ऑटो-इंक्रिमेंटिंग इंटीजर का उपयोग करना चाहिए? या प्रत्येक व्यक्ति के एसएसएन वाले कर्मचारियों की एक तालिका?

+1

+1 मैं लोगों को क्या कहते हैं देखने के लिए इस –

+1

इस सवाल के बारे में, विभिन्न रूपों में रुचि है, कुछ हद तक बारहमासी है ... http://stackoverflow.com/questions/532363/native-primary-key-or देखना उदाहरण के लिए एक-उत्पन्न-एक। – mjv

+0

यह वास्तव में एक उत्तर के लायक नहीं है लेकिन मेरी राय है: यदि आप पूरी तरह से सुनिश्चित हैं कि आपके पास एक ही आईएसबीएन या दो एसएसएन वाले दो व्यक्तियों के साथ दो पुस्तकें नहीं होंगी, तो मैं उन मानों को प्राथमिक कुंजी के रूप में उपयोग करने में संकोच नहीं करूंगा । लेकिन यह मुझे लगता है कि केवल एक आदत है। Django के मॉडल जैसे कुछ ओआरएम सिस्टम इसे करने के लिए कड़ी मेहनत करते हैं और हमेशा संख्यात्मक वृद्धिशील आईडी होने पर जोर देते हैं। दूसरी ओर, यदि आप PostgreSQL पर हैं, तो आप * दोहरी प्राथमिक कुंजी * जैसी चीजें भी कर सकते हैं। जब भी मैं कर सकता हूं मैं उनका उपयोग करना पसंद करता हूं। –

उत्तर

13

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

शब्द जो आप खोज रहे हैं: surrogated keys

उम्मीद है कि यह मदद करता है।

+0

आह। धन्यवाद। मैं थोड़ा सा खोज करता हूं लेकिन यह पता नहीं लगा सकता कि कीवर्ड को सही ढंग से कैसे वाक्यांशित किया जाए। – jamieb

+0

बहुत बढ़िया। मदद करने में खुशी। –

4

आपको वहां सही विचार है।

स्वत: वृद्धि का उपयोग एक अद्वितीय कुंजी के रूप में किया जाना चाहिए जब आपके द्वारा मॉडलिंग की जा रही वस्तुओं के बारे में कोई अनूठी कुंजी पहले से मौजूद नहीं है। इसलिए तत्वों के लिए आप परमाणु संख्या या पुस्तकें आईएसबीएन संख्या का उपयोग कर सकते हैं।

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

यह जहां संभव हो प्राकृतिक कुंजी का उपयोग करने के लिए, बस प्राथमिक कुंजी के रूप क्षेत्र बनाने के लिए और सुनिश्चित करें कि यह प्रदर्शन

+1

"ऑटो-वृद्धि का उपयोग अनन्य कुंजी के रूप में किया जाना चाहिए जब कोई अनूठी कुंजी पहले से मौजूद न हो" - मैं और असहमत नहीं हो सका। – onedaywhen

2

मैं तय करने के लिए "सर्वोत्तम प्रथाओं" यह पता लगाने की कोशिश कर रहा हूँ लिए सूचीबद्ध किया गया याद मतलब एक तालिका में प्राथमिक कुंजी के रूप में एक ऑटो-incrementing पूर्णांक जोड़ने या नहीं।

इसे डेटासेट के साथ एक अद्वितीय पहचानकर्ता के रूप में उपयोग करें जहां PKey उपयोगकर्ता प्रबंधित डेटा का हिस्सा नहीं है।

मान लें कि मेरे पास रासायनिक तत्वों के बारे में डेटा युक्त एक सारणी है। प्रत्येक तत्व की परमाणु संख्या अद्वितीय है और कभी नहीं बदलेगी। इसलिए प्रत्येक कॉलम के लिए ऑटो-इंक्रिमेंटिंग इंटीजर का उपयोग करने के बजाय, यह संभवतः परमाणु संख्या का उपयोग करने के लिए और अधिक समझ में आएगा, सही?

हां।

यदि मेरे पास किताबों की एक तालिका थी तो क्या यह सच होगा? क्या मुझे प्राथमिक कुंजी के लिए आईएसबीएन या ऑटो-इंक्रिमेंटिंग इंटीजर का उपयोग करना चाहिए? या प्रत्येक व्यक्ति के एसएसएन वाले कर्मचारियों की एक तालिका?

ISBN के/एस एस # रों तृतीय-पक्षों द्वारा और उनके बड़े भंडारण आकार की वजह से आवंटित कर रहे हैं एक अत्यधिक अक्षम तरीका विशिष्ट एक पंक्ति की पहचान करने के लिए होगा। याद रखें, जब आप टेबल में शामिल होते हैं तो PKeys उपयोगी होते हैं। एक आईएसबीएन जैसे बड़े डेटा प्रारूप का उपयोग क्यों करें जो अनन्य पहचानकर्ता के रूप में कई टेक्स्टुअल वर्ण होंगे जब इंटीजर जैसे छोटे और कॉम्पैक्ट प्रारूप उपलब्ध हों?

+0

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

+0

क्या यह सच है कि 'CHAR (13)' मान "बड़ा" और "अत्यधिक अक्षम" है? – onedaywhen

2

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

3

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

+0

"एक पूर्णांक की तुलना में अधिक जगह ले जाएगा और इस प्रकार डिस्क स्पेस का अपशिष्ट हो सकता है" - वर्ष 2012 से शुभकामनाएँ (ठीक है, लगभग!): मैं आपको यह बताने के लिए यहां हूं कि डिस्क स्पेस अब उतनी सस्ता है जितनी चिप्स :) – onedaywhen

+1

@onedaywhen प्रदर्शन में शामिल होने के बावजूद वर्ष 2012 में विचार करना अभी भी कुछ है :-P –

9

यह एक अत्यधिक बहस सवाल है, दोनों पक्षों पर भावना की बहुत सारी के साथ है।

मेरी विनम्र राय में, वहाँ एक अच्छा, useable प्राकृतिक उपलब्ध कुंजी है अगर - एक ISBN की तरह - मैं इसे का उपयोग करें। मैं इसे डेटाबेस पर वैसे भी स्टोर करने जा रहा हूं। हां, एक प्राकृतिक कुंजी आमतौर पर एक पूर्णांक ऑटो-वृद्धि कुंजी से बड़ी होती है, लेकिन मुझे लगता है कि यह समस्या अधिक है। डिस्क स्थान आज सस्ता है। मैं प्रक्रिया के लिए अधिक समय ले रहा है इसके बारे में और अधिक चिंता करेंगे। यदि आप प्राथमिक कुंजी के रूप में 80 बाइट टेक्स्ट फ़ील्ड के बारे में बात कर रहे थे, तो मैं नहीं कहूंगा। लेकिन अगर आप 8-बाइट बड़े पूर्णांक के बजाय 10-बाइट आईएसबीएन का उपयोग करने की सोच रहे हैं, तो मैं कल्पना नहीं कर सकता कि प्रदर्शन प्रदर्शन में काफी अधिक आती है।

कभी-कभी प्राकृतिक कुंजी के लिए एक प्रदर्शन लाभ है। मान लीजिए, उदाहरण के लिए, मैं यह जानना चाहता हूं कि किसी दिए गए पुस्तक की कितनी प्रतियां बेची गई हैं। मुझे पुस्तक मास्टर रिकॉर्ड से किसी भी डेटा की परवाह नहीं है। यदि प्राथमिक कुंजी आईएसबीएन है, तो मैं बस "चयन गिनती (*) बिक्री से कहां लिख सकता हूं जहां isbn = '143573338X'" है। अगर मैं एक autoincrement कुंजी इस्तेमाल किया, मैं एक isbn को देखने के लिए शामिल होने के क्या करना है, और क्वेरी, "चयन गिनती (*) की तरह की किताब से उपयोग करते हुए बिक्री में शामिल होने के और अधिक जटिल और धीमी हो जाता है (bookid) जहां isbn = '143573338X' "। (और मैं आपको विश्वास दिलाता कर सकते हैं कि के रूप में इस विशेष ISBN मेरी किताब के लिए है, बिक्री के रिकॉर्ड की संख्या बहुत कम है, इसलिए शामिल हो कर और एक अतिरिक्त रिकॉर्ड एक बड़ा अंतर का प्रतिशत पढ़ रही है!)

प्राकृतिक का एक और लाभ कुंजी यह है कि जब आपको डेटाबेस पर काम करना होता है और आप उन रिकॉर्ड्स को देखते हैं जो इस तालिका को कुंजी द्वारा वापस संदर्भित करते हैं, तो यह देखना आसान है कि वे किस रिकॉर्ड का जिक्र कर रहे हैं।

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

0

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

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

, यह एक किराए के कूदने से पहले प्राकृतिक पीकेएस के लिए सभी संभावनाओं निकास के लिए सबसे अच्छा है। लोग आम तौर पर आलसी होते हैं।

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