2012-06-11 13 views
50

मेरे पास टेबल "उपयोगकर्ता" (उपयोगकर्ता नाम, पासवर्ड) और तालिका "प्रोफ़ाइल" है (प्रोफ़ाइल आईडी, लिंग, डेटफॉर्थ, ...)। वर्तमान में मैं इस दृष्टिकोण का उपयोग कर रहा हूं: प्रत्येक प्रोफाइल रिकॉर्ड में "userId" नाम का एक फ़ील्ड है जो विदेशी कुंजी के रूप में होता है जो उपयोगकर्ता तालिका से लिंक होता है। जब कोई उपयोगकर्ता पंजीकृत होता है, तो उसका प्रोफाइल रिकॉर्ड स्वचालित रूप से बनाया जाता है। मैं अपने मित्र सुझाव के साथ उलझन में हूं: "userId" फ़ील्ड को विदेशी और प्राथमिक कुंजी के रूप में रखने और "प्रोफ़ाइल आईडी" फ़ील्ड को हटाएं। कौन सा दृष्टिकोण बेहतर है?क्या प्राथमिक कुंजी के रूप में विदेशी कुंजी होना ठीक है?

+2

इकाई फ्रेमवर्क शून्य (एक और) एक से एक संबंध के लिए (पहले कोड के साथ) उत्पन्न करता है। तो ... यह संभव है। क्या यह सबसे अच्छा तरीका है ... यह एक और सवाल है। लेकिन यह मान्य है। मैंने अपने डेटाबेस बनाने के दौरान कभी ऐसा नहीं किया (लेकिन मैंने कभी ऐसा नहीं सोचा)। –

उत्तर

66

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

इसके बजाय, उस फ़ील्ड को खोजें जो तालिका में प्रत्येक रिकॉर्ड को विशिष्ट रूप से पहचानता है, या प्राथमिक कुंजी के रूप में कार्य करने के लिए एक नया फ़ील्ड (या तो एक ऑटो-वृद्धिशील पूर्णांक या GUID) जोड़ें।

इसका एकमात्र अपवाद एक-से-एक संबंध के साथ तालिकाओं है, जहां लिंक की गई तालिका की विदेशी कुंजी और प्राथमिक कुंजी एक और समान है।

+25

एक समग्र प्राथमिक कुंजी जिसमें दो विदेशी कुंजी होते हैं, कई से अधिक रिश्तों को लागू करने के लिए भी बिल्कुल ठीक है। – rightfold

+0

@ राइटफोल्ड, आप दिन बचा सकते हैं, धन्यवाद। – Yahya

1

मैं ऐसा नहीं करूँगा। मैं profileID तालिका Profile

के रूप में प्राथमिक कुंजी रखेंगे एक विदेशी कुंजी दो तालिकाओं

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

http://www.aisintl.com/case/primary_and_foreign_key.html

+0

हो सकता है - यदि आपके पास User.UserID और Profile.UserID के बीच FK बाधा है, तो प्रोफाइल की पुष्टि करने के लिए दृढ़ता से अनुशंसा की जाएगी। उपयोगकर्ता आईडी। तालिका प्रोफाइल पर प्राथमिक क्लस्टर इंडेक्स क्यों नहीं बनाते, दूसरी इंडेक्स को सहेजते हैं और डेटाबेस इंजन के लिए अनावश्यक काम करते हैं? – DaveBoltman

21

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

1

यह व्यापार और प्रणाली पर निर्भर करता है।

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

4

इसे आम तौर पर एक से एक रिश्ते के लिए बुरी आदत माना जाता है। ऐसा इसलिए है क्योंकि आप केवल एक तालिका में प्रदर्शित डेटा प्राप्त कर सकते हैं और एक ही परिणाम प्राप्त कर सकते हैं।

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

मैं वर्तमान में ऐसे सिस्टम पर काम कर रहा हूं जहां उपयोगकर्ता लॉग इन कर सकते हैं और ऐप के साथ उपयोग करने के लिए पंजीकरण कोड उत्पन्न कर सकते हैं। कारणों से मैं नहीं जाऊंगा मैं उपयोगकर्ताओं की तालिका में आवश्यक कॉलम जोड़ने में असमर्थ हूं। इसलिए मैं कोड तालिका के साथ एक से एक मार्ग पर जा रहा हूं।

+2

मैं आपसे अधिकतर सहमत हूं कि अतिरिक्त कॉलम के समान तालिका में सभी डेटा रखने के कई फायदे हैं। हालांकि w.r.t यह .. "आप केवल एक तालिका में प्रदर्शित डेटा प्राप्त कर सकते हैं और एक ही परिणाम प्राप्त कर सकते हैं" ..: एक अलग तालिका होने के लिए उपयोगी हो सकता है, उदाहरण के लिए यदि प्रोफ़ाइल तालिका प्रविष्टि वैकल्पिक है। उदाहरण के लिए, प्रत्येक बैंक ग्राहक के पास इंटरनेट बैंकिंग पंजीकरण नहीं हो सकता है। उस स्थिति में आईबी पंजीकरण तालिका का उपयोग अन्य तालिकाओं को और बच्चे के रिकॉर्ड होने से प्रतिबंधित करने के लिए किया जा सकता है। फिर, यहां आईबी पंजीकरण तालिका के लिए इसे एक नए पीके के साथ भी किया जा सकता है। – Teddy

+1

@ टेडी इसी प्रकार मैं ज्यादातर जो आपने कहा उससे सहमत हूं। हालांकि, मूल प्रश्न में वे कहते हैं "... उसका प्रोफाइल रिकॉर्ड स्वचालित रूप से बनाया गया है ..." जिसका अर्थ यह है कि प्रोफ़ाइल तालिका वैकल्पिक नहीं है। ऐसी स्थिति में जहां प्रोफ़ाइल तालिका वैकल्पिक थी, तो हाँ इसे एक अलग तालिका के रूप में करने योग्य है। लेकिन फिर फिर, वे एक ही टेबल में केवल शून्य कॉलम का उपयोग कर सकते थे। – Tshsmith

+1

एक अलग दूसरी तालिका का उपयोग करके, हम एक तीसरी तालिका में प्रवेश को रोक सकते हैं, जिसे केवल दूसरी तालिका में प्रवेश करने वाले लोगों के लिए अनुमति दी जाती है। – Teddy

0

हाँ, एक विदेशी कुंजी उन तालिकाओं

1

हाँ, यह एक प्राथमिक कुंजी एक विदेशी कुंजी किया जा रहा है करने के लिए कानूनी है के बीच एक रिश्ता करने के लिए एक के मामले में एक प्राथमिक कुंजी हो सकता है। यह एक दुर्लभ निर्माण है, लेकिन यह इसके लिए लागू होता है:

  • 1: 1 संबंध। अलग-अलग अनुमतियों और विशेषाधिकारों के कारण केवल दो टेबलों को विलय नहीं किया जा सकता है, केवल तालिका स्तर पर लागू होते हैं (2017 तक, ऐसा डेटाबेस अजीब होगा)।

  • 1: 0..1 संबंध। उपयोगकर्ता प्रकार के आधार पर प्रोफ़ाइल मौजूद हो सकती है या नहीं भी हो सकती है।

  • प्रदर्शन एक मुद्दा है, और डिज़ाइन एक विभाजन के रूप में कार्य करता है: प्रोफ़ाइल तालिका को शायद ही कभी एक्सेस किया जाता है, अलग डिस्क पर होस्ट किया जाता है या उपयोगकर्ता तालिका की तुलना में एक अलग sharding नीति है। यदि अंडरलाइनिंग स्टोरेज कॉलमर है तो समझ में नहीं आता है।

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