क्या एक प्राथमिक कुंजी अपरिवर्तनीय होनी चाहिए?


26

स्टैकओवरफ़्लो पर एक हालिया प्रश्न ने प्राथमिक कुंजियों की अपरिहार्यता के बारे में चर्चा को उकसाया। मैंने सोचा था कि यह एक तरह का नियम था कि प्राथमिक कुंजी अपरिवर्तनीय होनी चाहिए। यदि कोई मौका है कि किसी दिन एक प्राथमिक कुंजी अपडेट की जाएगी, तो मैंने सोचा कि आपको सरोगेट कुंजी का उपयोग करना चाहिए। हालाँकि यह SQL मानक में नहीं है और कुछ RDBMS का "कैस्केड अपडेट" फीचर प्राथमिक कुंजी को बदलने की अनुमति देता है।

तो मेरा सवाल यह है: क्या यह अभी भी एक प्राथमिक कुंजी है जो बदल सकती है एक बुरा अभ्यास है? यदि कोई परिवर्तनशील प्राथमिक कुंजी है, तो विपक्ष क्या है?

जवाबों:


25

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

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


7
यदि आपको " विदेशी कुंजी से जुड़ा हुआ है " तो आपको प्राथमिक कुंजी को अपरिवर्तनीय बनाने की आवश्यकता क्यों है ? जैसा कि ओपी ने उल्लेख किया है, अधिकांश आरडीबीएमएस में "कैस्केड" अपडेट सुविधा है।
थानाटोस

1
@ थानाटोस सबसे (वास्तव में मैंने सभी का सामना किया है) rdbms की म्यूटेबल प्राथमिक कुंजी को अभी तक कैस्केडिंग अपडेट की अनुमति नहीं देगा। एक प्राथमिक कुंजी, आम तौर पर स्वीकृत डीबीए ज्ञान में, कोई जानकारी नहीं होनी चाहिए, केवल एक अद्वितीय रिकॉर्ड पहचानकर्ता होना चाहिए (इसलिए टाइमस्टैम्प भी नहीं है, रिकॉर्ड रेंज इससे अलग है, आदि)।
jwenting

5
@jwenting: क्या हम एक ही चीज़ के बारे में बात कर रहे हैं? "अधिकांश rdbms की उत्परिवर्तित प्राथमिक कुंजी की अनुमति नहीं होगी" क्या शामिल हैं? MySQL और PostgreSQL दोनों ही परस्पर प्राथमिक कुंजी की अनुमति देते हैं, और कैस्केडिंग अपडेट का सम्मान करते हैं ... जैसा कि मुझे लगता है कि मानक एसक्यूएल कहता है कि उन्हें चाहिए। इसके अलावा, "आम तौर पर स्वीकृत dba ज्ञान"? मैं डीबीए से बहुत से मिला हूं जो सरोगेट कुंजी के खिलाफ बहस करते हैं, और बहुत से जो प्राकृतिक कुंजी के खिलाफ बहस करते हैं।
थानाटोस

2
@ थानाटोस के तर्क "सभी तालिकाओं में सरोगेट होना चाहिए" के संदर्भ ग्रंथियों की कमी है, वे "आमतौर पर स्वीकार किए जाते हैं डीबीए ज्ञान" का हवाला देते हैं, लेकिन वे कभी एक किताब का हवाला नहीं देते हैं। कैनोनिकल पुस्तकों का कहना है कि आपको सरोगेट का उपयोग करना चाहिए यदि: कोई प्राकृतिक कुंजी मौजूद नहीं है, बी। बहुरंगी कुंजी 3 कॉलम है, या, सी। आप हर समय कुंजी बदलते रहेंगे। इसलिए: जब वे फिट होते हैं, तो प्राकृतिक जब सर्पिल फिट नहीं होंगे, तो सरोगेट करता है।
ट्यूलेंस कोर्डोवा

4
@ user61852: क्या?
गुफा

15

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

जब हम कार्यान्वयन के दायरे में आते हैं, तो सबसे सुरक्षित बात यह है कि सरोगेट कुंजी का उपयोग करें।


15

हां, मेरी राय में एक प्राथमिक कुंजी अपरिवर्तनीय होनी चाहिए।

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


डेटा-प्रविष्टि त्रुटियों के बारे में अच्छी बात
टिम गुडमैन

richeym, ऐसा लगता है जैसे आप मामला बना रहे हैं कि चाबियाँ अपरिवर्तनीय क्यों नहीं होनी चाहिए: उपयोगकर्ता उन्हें बदलना चाह सकते हैं।
nvogel

4
@dportas - मेरी बात यह है कि मुझे पीके पसंद है इसलिए हमेशा सरोगेट कीज का उपयोग करें, भले ही मुझे लगता है कि एक स्पष्ट कुंजी है जिसे टेबल डेटा (जैसे ईमेल, उपयोगकर्ता नाम) से प्राप्त किया जा सकता है।
8

2

डेटाबेस और उपयोगकर्ता के बीच कैशिंग तंत्र प्रभावशीलता खो देंगे यदि प्राथमिक कुंजी बदल जाती है।


2

क्यों नहीं? क्योंकि आप एक कॉलम को खत्म करना चाहते हैं?

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

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

कंप्यूटर को कुंजी के लिए किसी भी अर्थ की आवश्यकता नहीं होती है; IMHO, चाबियाँ कंप्यूटर के लिए हैं, लोगों को बाकी डेटा को खराब करने दें।


1
"चाबियाँ कंप्यूटर के लिए हैं, लोगों को बाकी डेटा को खराब करने दें।" +1, अच्छा।

2

यह महत्वपूर्ण नहीं है कि जिसकी कुंजी बदल सकती है।

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

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

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


3
ISBN निश्चित चौड़ाई है, सिवाय इसके कि वह कब नहीं है (ISBN-10 बनाम ISBN-13 देखें)।
बजे एक CVn

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

1

सब कुछ जो संभवतः अपरिवर्तनीय हो सकता है। यह शुद्धता सुनिश्चित करने में मदद करता है और मदद करता है जब आप अपने आवेदन को मल्टीथ्रेडेड बनाना चाहते हैं।


1

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


0

जैसा कि कुछ टिप्पणियों ने पहले ही कहा था, एक समाधान एक नई प्राथमिक कुंजी का उपयोग करना है

उदाहरण के लिए (@onedaywhen के उदाहरण के बाद), मान लें कि तालिका में ऐसी पुस्तकें मौजूद हैं जो पुस्तकों की एक सूची संग्रहीत करती हैं और हम प्राथमिक कुंजी के रूप में आईएसबीएन निर्धारित करने के लिए "उपयोग" करते हैं। हालाँकि, कुछ लेखकों ने गलत आईएसबीएन टाइप करने की गलती की है, इसलिए उन्होंने आईएसबीएन को बदलने के लिए कहा, इसमें अगले कार्य शामिल थे:

  • तालिका पुस्तकों में एक नई रजिस्ट्री बनाएँ
  • पुराने आईएसबीएन से नए आईएसबीएन के सभी संदर्भों को इंगित करें। (*)
  • और अंत में, टेबल बुक से पुरानी रजिस्ट्री को हटा दें।

(*) यह एक डेटाबेस मॉडल के लिए सभी संदर्भों को खोजने के लिए तुच्छ हो सकता है जो विदेशी कुंजी का उपयोग करता है लेकिन कुछ मॉडलों में इसका अभाव है।

Table Books
ISBN  is the primary key
NAME is a simple field.
etc.

हम इसे बदलते हैं

Table Books
InternalBookId as the primary key
ISBN as a simple field or an indexed field.
NAME is a simple field.
etc.

कहाँ नई InternalBookId भी एक autonumeric मूल्य किया गया हो सकता है।

इसके बारे में विपक्ष:

  • यह एक नया क्षेत्र जोड़ता है जो अधिक स्थान / संसाधन का उपयोग करता है।

  • इसके लिए पूरे मॉडल को फिर से लिखना पड़ सकता है।

  • नया मॉडल कम आत्म समझाया जा सकता है।

पेशेवर

  • "प्राथमिक कुंजी" को म्यूट करने की अनुमति देता है।
  • उदाहरण के लिए, "प्राथमिक कुंजी" को छोड़ना या फिर से तैयार करना भी अनुमति देता है, पुस्तकों को आईएसबीएन -13 में बदलना इतना आसान है जितना कि पुराने कॉलम को छोड़ना और एक नया बनाना

नई तालिका:

Table Books
InternalBookId as the primary key
ISBN13 is a new field.
NAME is a simple field.
etc.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.