लुकिंग टेबल की प्राथमिक कुंजी के रूप में एक इंट का उपयोग क्यों करें?


30

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

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

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

इंट प्राइमरी की (विशेष रूप से लुकअप टेबल के लिए) का उपयोग करने के क्या फायदे हैं, इसके अलावा यह "मानक बात करने के लिए" है?


4
आप इन 2 पिछले प्रश्नों में अच्छी जानकारी और शायद आपके आवश्यक उत्तर भी पा सकते हैं: क्या प्राथमिक कुंजी का कोई लाभ है जिसमें तालिका के सभी कॉलम शामिल हैं? और चरित्र बनाम पूर्णांक प्राथमिक कुंजी
मैरिएन

जवाबों:


23

आपके प्रश्न का उत्तर तार्किक है, भौतिक नहीं - आप जिस मूल्य को देखते हैं वह व्यावसायिक कारणों से बदल सकता है। उदाहरण के लिए, यदि आप अपने ग्राहकों को ईमेल पते से अनुक्रमित करते हैं, तो ईमेल पता बदलने पर क्या होता है? जाहिर है कि यह आपके सभी लुकअप टेबलों पर लागू नहीं होगा, लेकिन पूरे एप्लिकेशन में इसे उसी तरह से करने का लाभ यह है कि यह आपके कंप्यूटर को सरल बनाता है। यदि सब कुछ पूर्णांक है → पूर्णांक संबंध आंतरिक रूप से, तो आप कवर हैं।

सिर्फ सैंडी को अपनी टिप्पणी पढ़ें - शायद इस मामले में आप वास्तव में क्या चाहते हैं एक चेक बाधा है , न कि एक विदेशी कुंजी / लुकअप, जैसे:

create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go

इसे चलाएं और आप प्राप्त करें:

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.

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


@ गयूस- अच्छा उदाहरण ... मैं इस प्रकार के परिदृश्य के लिए चेक कंस्ट्रक्शन का उपयोग नहीं करना पसंद करता हूं; मुख्य कारण यह है कि यह रखरखाव योग्य नहीं होगा (आपने इसे नुकसान के रूप में इंगित किया है)।
कोडरवाक

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

7

"लुकअप मान का सीधे उपयोग करना" - लुकअप टेबल के वास्तविक उद्देश्य के साथ इसका थोड़ा विरोधाभासी। आप ऐसी टेबल क्यों रख रहे हैं? यदि यह एक लुकअप नहीं है।
हो सकता है कि मैं आपके सवाल को गलत समझूं। यहाँ msdn से एक लुकअप टेबल परिभाषा दी गई है

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

क्या आप अपने लुकअप टेबल के उद्देश्य को स्पष्ट कर सकते हैं? इसका उपयोग निम्नलिखित जैसे कुछ स्थिर डेटा को संग्रहीत करने के लिए किया जाता है और ये रिकॉर्ड अन्य तालिकाओं के रिकॉर्ड का इनपुट नहीं हैं?

स्वाद की मेज

Orange  
Pista  
Mango

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


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

@ जैको बैरियर - गयूस का जवाब देखें ... चेक
कांस्टेंट का

7

चूंकि आपने अपने प्रश्न को 'विशेष रूप से एक लुकअप टेबल के लिए,' उत्तर दिया है, इसलिए इसका उत्तर संभवतः नीचे दिया गया है 'अंतरिक्ष बचाता है।'

मुझे लगता है कि यदि आप उस क्वालिफायर को हटा देते हैं, तो आपका प्रश्न 'प्राकृतिक कुंजियों पर सरोगेट कुंजी का उपयोग क्यों करें?' मैंने सरोगेट कुंजी के समर्थन में निम्नलिखित लिखा है:

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

यह काफी हद तक यही है कि यह "करने के लिए मानक बात बन गई है।" दुर्भाग्यपूर्ण द्वि-उत्पाद यह है कि लोग सरोगेट कुंजी पर फेंक देते हैं और यह नहीं सोचते कि उम्मीदवार कुंजी क्या है ... लेकिन अब हम आपके प्रश्न से बाहर हो रहे हैं :)


3

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

एक नंबर प्राथमिक कुंजी के साथ लुकअप टेबल को केवल लुकअप टेबल में मूल्य को बदलना होगा।

मूल्यों का उपयोग करते हुए लुकअप तालिका को उनकी प्राथमिक कुंजी के रूप में देखने की मेज में और मुख्य तालिका में हर रिकॉर्ड में बदलना होगा जहां इसका उपयोग किया गया था।


2

जब आप आईडी परिभाषित करते हैं, तो आप विशिष्टता की गारंटी भी दे सकते हैं। लेकिन जब आप लेते हैं, उदाहरण के लिए, ई-मेल, विशिष्ट पहचानकर्ता के रूप में, आप 3 जी पक्ष के लिए विशिष्टता की जिम्मेदारी लेते हैं।

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