क्या मुझे कई कॉलम प्राथमिक कुंजियों का उपयोग करना चाहिए या एक नया कॉलम जोड़ना चाहिए?


15

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

तो मैं इस दृष्टिकोण या कारणों में से कुछ नुकसान क्या हो सकता है जो मुझे एक एकल स्तंभ कुंजी चाहिए?


2
मुझे पता है, मुझे लगता है कि यह एसओ पर बेहतर होता।
FrustratedWithFormsDesigner

2
@FrustratedWithFormsDesigner यह एसओ के पास जा सकता है, लेकिन मुझे लगता है कि यह यहां भी काम करता है, क्योंकि सवाल का फोकस "कैसे मैं एक्स करता हूं?" के बजाय "इस दृष्टिकोण के पेशेवरों और विपक्ष" पर लगता है।
एडम लेअर

@ एना लियर ear: यह डिजाइन निर्णयों के बारे में एक "पेशेवरों और विपक्ष" है जो कोडिंग पर सीधा और निश्चित प्रभाव डालेंगे, इसलिए मुझे लगता है कि एसओ एक बेहतर स्थान होगा।
FrustratedWithFormsDesigner

जवाबों:


8

आमतौर पर जब आपके पास एक मल्टी-कॉलम प्राथमिक कुंजी के साथ एक तालिका होती है, तो यह एक जॉइन टेबल (कई-से-कई) का परिणाम है जो अपनी स्वयं की इकाई बनने के लिए ऊंचा हो गया है (और इस प्रकार यह स्वयं की प्राथमिक कुंजी है)। ऐसे कई लोग हैं जो तर्क देते हैं कि कोई भी तालिका तालिका डिफ़ॉल्ट रूप से एक इकाई होनी चाहिए, लेकिन यह एक और दिन के लिए चर्चा है।

आइए एक काल्पनिक से कई संबंधों को देखें:

छात्र * --- * कक्षा

(एक छात्र कई कक्षाओं में हो सकता है, एक कक्षा में कई छात्र हो सकते हैं)।

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

छात्र 1 --- * नामांकन * --- 1 कक्षा

(एक छात्र के पास कई नामांकन हो सकते हैं, प्रत्येक नामांकन एक कक्षा के लिए है (या विपरीत तरीके से एक कक्षा में कई नामांकन हो सकते हैं, प्रत्येक नामांकन एक छात्र के लिए है)।

अब आप चीजों को क्वेरी कर सकते हैं, जैसे कि पिछले वर्ष रसायन विज्ञान 101 कक्षा में कितने छात्रों का नामांकन हुआ था? या एक्मे विश्वविद्यालय में भाग लेने के दौरान छात्र जॉन डो ने किन कक्षाओं में दाखिला लिया था? यह अलग प्राथमिक कुंजी के बिना संभव था, लेकिन जब आपके पास नामांकन के लिए एक प्राथमिक कुंजी होगी तो एक आसान क्वेरी इन नामांकन (आईडी द्वारा) की होगी, कितने छात्रों को पासिंग ग्रेड प्राप्त हुआ?

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


1
तो आप इसे स्टूडेंटक्लास टेबल पर जोड़ देंगे। इस बिंदु पर, स्टूडेंटक्लास एक अनोखी इकाई बन गया है ... और इसे नाम देने के लिए एक नाम दिया जाना चाहिए, जैसे कि नामांकन। यह इतनी सरल बात है, लेकिन ऐसा करने में बहुत मूल्य है!
बॉटिस

8

यह एक अलग आईडी कॉलम होने का मतलब है। जब आप अपने डेटाबेस तालिका से कुछ प्राप्त करना चाहते हैं, तो यह करना आसान है:

SELECT whatever FROM table WHERE id=13

से अधिक का चयन करें जो कुछ भी है जहां से col1 = 'val1' और col2 = 'val2' और col3 = 'val3'

उदाहरण के लिए, एक वेब अनुप्रयोग में यह इस तरह दिखने वाले यूआरएल में बदल जाता है:

www.somewebsite.com/somepage.php?id=13

या इस तरह:

www.somewebsite.com/somepage.php?col1=val1&col2=val2&col3=val3

4
और जब आप कई स्तंभों के बजाय, किसी आईडी पर लिंक कर सकते हैं, तो संबंधित तालिका जोड़ना बहुत आसान है
CaffGeek

3
क्षमा करें, इस बिंदु पर मेरे पास -1 है, ए के रूप में ) यह काला और सफेद नहीं है। एक आईडी कॉलम जोड़ना नकारात्मकता के साथ आता है जैसे कि आप उस नई आईडी को कहां और कब उत्पन्न करते हैं। इसके अलावा, यह अतिरिक्त जॉइन या SELECTक्वेरी में परिणाम कर सकता है । और, बी) , मुझे नहीं पता कि यह वास्तव में किसी भी प्रकार की URL आवश्यकता का कारण कैसे बनता है (जब तक कि आप एक बुरे ढांचे के साथ काम नहीं कर रहे हैं)। मेरे URL ?id=13में उनके साथ कोई क्वेरी स्ट्रिंग नहीं है , अकेले रहने दें ?col1=val1&col2=val2&col3=val3
निकोल

2
@renesis: इस साइट में अद्वितीय प्रश्न और उपयोगकर्ता हैं, जो URL में हैं। हालांकि, यह कुछ हद तक एक विशेष मामला है, क्योंकि वह विशेष डेटा नहीं बदलता है।
माइकल के

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

@ मिसेल - मैंने यह नहीं कहा कि आईडी कभी भी यूआरएल में नहीं होती हैं। बेशक वे कर रहे हैं। यदि आपके पास ऐसे URL हैं जो डेटा की एक पंक्ति का प्रतिनिधित्व करते हैं, तो हाँ, उस डेटा में संभवतः एक अद्वितीय आईडी होनी चाहिए। जब तक कि URL का कुछ अन्य भाग पहले से ही बहु-कुंजी के अन्य भागों को प्रदान नहीं करता है। @GrandmasterB न तो मैंने (6 साल से अधिक) काम करने वाली पिछली दो कंपनियों में से, जो दोनों MySQL का उपयोग करते हैं (एक भी Oracle और SQL सर्वर का समर्थन करता है) ऑटो-इंक्रीमेंट का उपयोग करने में सक्षम थे, न ही एक बड़े यादृच्छिक हैश।
निकोल

8

मूल रूप से आप पूछ रहे हैं कि आपको सरोगेट या प्राकृतिक कुंजियों का उपयोग करना चाहिए (आपके मामले में यह समग्र प्राकृतिक कुंजियों की तरह लगता है )। यहाँ एक बढ़िया लेख है: http://www.agiledata.org/essays/keys.html

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

उदाहरण के लिए, मान लें कि आपके पास दो संस्थाएँ हैं: पता, और देश।

  • संबंध है: पता * ----- 1 देश
  • देश इकाई मूल रूप से एक महत्वपूर्ण है: मूल्य जोड़ी (जैसे अमेरिका: संयुक्त राज्य अमेरिका, सीए: कनाडा, एमएक्स: मैक्सिको, आदि ...)
  • अमेरिका में सभी पते के लिए इस संरचना को क्वेरी करने के लिए:

select * from Address where CountryCode = 'US'

  • सरोगेट कुंजी के साथ समान क्वेरी करने के लिए:

select Address.* from Address join Country on Address.CountryID = Country.ID where Country.Code = 'US'

मैं लुकिंग टेबल के लिए नेचुरल कीज़ को अनिवार्य कर रहा हूं और बाकी सभी चीज़ों के लिए सरोगेट कीज़ को सर कर दूंगा, अगर मुझे पूरा यकीन है कि नेचुरल कीज़ बहुत बार नहीं बदलती हैं, तो कभी भी।


5

यह इस बात पर निर्भर करता है कि आप डेटा का उपयोग कैसे करते हैं। यदि आप बहुत से आंशिक-कुंजी लुकअप करते हैं (जहां आप केवल दो तीन कुंजियों के आधार पर रिकॉर्ड का चयन करते हैं) तो आप बहु-भाग कुंजियाँ रखना चाहेंगे। OTOH, यदि आपके पास अन्य तालिकाओं के साथ बहुत सारे 1: 1 संबंध हैं, तो संभवतः सरोगेट कुंजी के लिए अधिक समझदारी है।


1

मैं हमेशा एक मेज के लिए एक सरोगेट प्राथमिक कुंजी रखना पसंद करता हूं। लेकिन इसे लागू करने के कई "कठिन" कारण नहीं हैं जो मैंने सुना है।

एक बार जब मेरे पास कभी मल्टी-कॉलम प्राकृतिक कुंजी होती है तो मुझे ओआरएम के साथ होता है। कभी-कभी मेरे पास Linq To Entities का उपयोग करके कई कॉलम प्राथमिक कुंजी के साथ समस्याएँ होती हैं।


1

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

अद्वितीय मानों को संभालने के लिए आप हमेशा एक और सूचकांक बना सकते हैं।

प्रदर्शन शायद ज्यादातर मामलों में नगण्य है, लेकिन आप अपने प्रश्नों का परीक्षण बिना और सरगेट कुंजी के कर सकते हैं।


0

मुझे एक अलग कुंजी को जनादेश देने के लिए एक अच्छे कारण के साथ आना मुश्किल है, लेकिन जैसे आपने कहा कि बहुत सारे लोगों ने इसे डाल दिया।

तथ्य (डिटेल टेबल) से निपटने पर मुझे यह मदद नहीं मिलती है (विशेषकर भंडारण के साथ)। मात्रा के साथ (ग्राहक_की, store_key, product_key) के साथ बिक्री के तथ्य का कैनन का उदाहरण एक रिकॉर्ड-स्तरीय कुंजी रखने के लिए बहुत मायने नहीं रखता है।


0

यदि आप पाते हैं कि वास्तविक में डुप्लिकेट आपके मुख्य कुंजी डुप्लिकेट हो सकते हैं, तो पीके होना एक ऑटोइंटरमेंट इंट में परेशानी को कम करता है।


0

आस्क टाम पर 2002 से एक अच्छी चर्चा चल रही है । यह ओरेकल-विशिष्ट है, लेकिन व्यापक चर्चा प्रासंगिक है जो भी डेटाबेस आप उपयोग कर रहे हैं।

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