विदेशी कुंजी - सरोगेट या प्राकृतिक कुंजी का उपयोग करके लिंक?


14

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

पूछने का मुख्य कारण यह है कि मेरे पास एक विरासत अनुप्रयोग है जो प्राकृतिक कुंजियों के साथ FK का उपयोग करता है, लेकिन devlopers से OR / M (हमारे मामले में NHibernate) पर जाने के लिए एक मजबूत धक्का है, और एक कांटा पहले से ही कुछ का उत्पादन किया है परिवर्तनों को तोड़ना, इसलिए मैं या तो उन्हें प्राकृतिक कुंजी का उपयोग करके ट्रैक पर वापस धकेलना चाह रहा हूं, या एफके के लिए सरोगेट कुंजी का उपयोग करने के लिए विरासत ऐप को स्थानांतरित करना चाहता हूं। मेरा पेट मूल FK को पुनर्स्थापित करने के लिए कहता है, लेकिन मुझे ईमानदारी से यकीन नहीं है कि यह वास्तव में पालन करने का सही रास्ता है।

हमारी मेज के अधिकांश हिस्से में पहले से ही एक सरोगेट और प्राकृतिक कुंजी है जो पहले से ही परिभाषित है (हालांकि अद्वितीय बाधा और पीके) इसलिए अतिरिक्त कॉलम जोड़ना हमारे लिए इस अपमान में एक गैर-मुद्दा है। हम SQL Server 2008 का उपयोग कर रहे हैं, लेकिन मुझे आशा है कि यह किसी भी DB के लिए पर्याप्त सामान्य है।

जवाबों:


15

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

परिभाषा के अनुसार, आपके लिए आवश्यक जानकारी हमेशा हर "लुकअप" तालिका की प्राकृतिक कुंजी में निहित होती है । (टर्म लुकिंग टेबल अनौपचारिक है। संबंधपरक मॉडल में, सभी टेबल सिर्फ टेबल हैं। यूएस पोस्टल कोड की एक तालिका में पंक्तियाँ हो सकती हैं जो इस तरह दिखती हैं: {AK, अलास्का}, {AL, अलबामा}, {AZ, एरिज़ोना} , आदि ज्यादातर लोग इसे लुकअप टेबल कहेंगे।)

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

जब आप एक सरोगेट कुंजी भी तालिकाओं में प्राकृतिक कुंजियों का संदर्भ देते हैं, तो आप दो समस्याओं में भाग लेंगे।

सबसे पहले, आप लोगों को आश्चर्यचकित करेंगे। हालांकि मैं आमतौर पर कम से कम आश्चर्य के सिद्धांत के लिए दृढ़ता से पैरवी करता हूं , यह एक ऐसी स्थिति है जहां मुझे आश्चर्यचकित लोगों का मन नहीं है। जब समस्या यह है कि डेवलपर्स विदेशी कुंजियों के तार्किक उपयोग से आश्चर्यचकित हैं, तो समाधान शिक्षा है, न कि नया स्वरूप।

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

मैंने एक डेटाबेस सिस्टम पर काम किया है, जो 30 वर्षों की अवधि में कम से कम दो दर्जन भाषाओं में लिखे सैकड़ों एप्लिकेशन प्रोग्राम को डेटा प्रदान करता है। वह डेटाबेस उद्यम का है, ORM का नहीं।

ब्रेकिंग परिवर्तनों का परिचय देने वाला कांटा एक शो-स्टॉपर होना चाहिए।

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

अन्य प्रासंगिक उत्तर: डेटाबेस स्कीमा कन्फ्यूजिंग में


5

मैं सरोगेट कुंजी का समर्थन करने का मुख्य कारण यह है कि प्राकृतिक कुंजी अक्सर परिवर्तन के अधीन होती है और इसका मतलब है कि सभी संबंधित तालिकाओं को अपडेट किया जाना चाहिए जो सर्वर पर काफी भार डाल सकते हैं।

आगे 30 वर्षों में मैं कई विषयों पर विभिन्न प्रकार के डेटाबेस का उपयोग कर रहा हूं, सही प्राकृतिक कुंजी अक्सर काफी दुर्लभ होती है। माना जाता है कि चीजें विशिष्ट हैं (SSN), ऐसी चीजें जो किसी विशेष समय में विशिष्ट हैं, बाद में गैर-विशिष्ट बन सकती हैं और ईमेल पते और फ़ोन नंबर जैसी कुछ चीज़ें अद्वितीय हो सकती हैं, लेकिन बाद में अलग-अलग लोगों के लिए उनका पुनः उपयोग किया जा सकता है दिनांक। बेशक कुछ चीजें बस लोगों और निगमों के नाम की तरह एक अच्छा अद्वितीय पहचानकर्ता नहीं है।

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

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


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

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

-4

यदि आप उत्तर नहीं जानते हैं, तो सरोगेट के साथ जाएं। यहाँ क्यों - यदि व्यावसायिक नियमों के बारे में धारणाएँ बनाई गई हैं, और वे धारणाएँ झूठी हैं या नियम बदल गए हैं, तो आपका डेटा कचरा है। यहाँ एक उदाहरण है:

व्यक्ति, भूमिका, व्यक्तित्व

वर्तमान व्यापार नियम बताता है कि एक व्यक्ति की एक भूमिका है। आप एक तालिका बनाते हैं, जिसमें व्यक्ति और भूमिका को जोड़ते हैं, जहाँ PersonRole (PersonName, PersonBirthDate, PersonMotherMaidenName, ..., RoleCode)

जब आप नेचुरल कीज़ की बात करते हैं तो आप एक सच्चे शुद्धतावादी होते हैं! लेकिन गंभीरता से, क्या होगा अगर ऑर्ग तय करता है कि एक व्यक्ति अब कई भूमिकाएं ग्रहण कर सकता है? व्यवसाय की जरूरतों में बदलाव का समर्थन करने के नकारात्मक प्रभाव क्या हैं?


2
और आपको सरोगेट कुंजी के साथ ये समस्याएं नहीं हैं? कृपया हमें दिखाओ कैसे।
कॉलिन के टी हार्ट

4
दिया गया उदाहरण चर्चा के लिए प्रासंगिक कुछ भी प्रदर्शित नहीं करता है।
mustaccio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.