2009-08-07 9 views
5

मैं अब कुछ वर्षों से MySQL डीबी के साथ कोडिंग कर रहा हूं और मैंने कभी भी विदेशी कुंजी का उपयोग नहीं किया है। अब, मैं समझता हूं कि एक विदेशी कुंजी एक टेबल पर एक आईडी की तरह है जो किसी अन्य तालिका की प्राथमिक कुंजी से मेल खाती है। मेरे पास मेरी साइट पर एक उपयोगकर्ता तालिका है और शायद लगभग 10 अन्य टेबल हैं जो सभी मेरी उपयोगकर्ता तालिका की प्राथमिक कुंजी से मेल खाते हैं - हालांकि वे विदेशी कुंजी के रूप में सेट नहीं हैं।MySQL में एक विदेशी कुंजी का उपयोग करने के लिए या नहीं?

इन 10 अन्य तालिकाओं के पास विदेशी कुंजी होने के कारण मुझे क्या याद आ रही है? मेरा मतलब है, जहां तक ​​मैं कह सकता हूं कि वे मूल रूप से एक विदेशी कुंजी हैं, सिवाय इसके कि उनके पास डीबी में सहेजा गया/असाइन किया गया मान नहीं है।

क्या यहां कोई अन्य लाभ है कि मुझे अभी पता नहीं है?

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

+4

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

उत्तर

3

एक FOREIGN KEY दो उद्देश्यों में कार्य करता है:

  • यह सुनिश्चित करता है कि आप रिश्तों को हमेशा कुछ जाँच भूमि के ऊपर
  • यह (disputably) सोपानी अपडेट सरल करता है और हटाता की कीमत पर संगत कर रहे हैं।

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

+1

यहां असहमत हैं। फिर आप मानते हैं कि डीबी पर हमेशा अतिरिक्त परत होगी जो डीबी के उद्देश्यों की पूर्ति कर रही है। मैं देखता हूं कि यह काफी आधुनिक दृष्टिकोण बन गया है लेकिन फिर भी यह काफी बुरा मानता है। –

+0

@ जेन: सामान्य रूप से उस परत के लिए उपयोग की जाने वाली परत को संग्रहीत प्रक्रिया कहा जाता है, और यह 'डीबी' पर "ओवर" नहीं होता है। विदेशी कुंजी का मुख्य नुकसान उनकी पंक्ति-दर-पंक्ति कार्यान्वयन है जो एक प्रदर्शन हत्यारा है यदि आपको कम या ज्यादा नियमित आधार पर बड़े पैमाने पर अपडेट करने की आवश्यकता है। – Quassnoi

+0

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

0

जो आप खो रहे हैं वह लागू रेफरेंसियल अखंडता है (यानी यदि आपकी अन्य तालिका में user_id 27 है, तो उपयोगकर्ता तालिका में आईडी 27 होना चाहिए) और स्वचालित कैस्केड अपडेट और डिलीट करने की क्षमता (यानी यदि आप उपयोगकर्ता 27 को हटाएं, दूसरी तालिका में संबंधित पंक्तियां स्वचालित रूप से हटा दी जाती हैं, आदि)।

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

+1

वर्तमान में जब कोई उपयोगकर्ता खाता हटा देता है तो मेरे पास अन्य 10+ तालिकाओं से मेरा कोड हटा दिया जाता है, आप कह रहे हैं कि यह सब स्वचालित हो सकता है? मैं अपडेट का जिक्र करने के बारे में अधिक उत्सुक हूं, – JasonDavis

+8

@chaos क्या करेगा: मुझे यकीन है कि आपका कोड हमेशा संदर्भित अखंडता के प्रवर्तन में निर्दोष है, लेकिन * अन्य * लोगों के कोड के बारे में क्या है जो समान डेटाबेस तक पहुंचता है? या एक प्रश्न उपकरण में विज्ञापन पूछताछ? डेटाबेस-लागू आरआई का मुद्दा यह है कि यह तब भी सुसंगत है जब ग्राहक नहीं है। –

1
विदेशी कुंजी के साथ

आप

  • सुनिश्चित करें कि केवल वैध user_id के पर उन क्षेत्रों के लिए रखा जाता है
  • उपयोग cascades बना सकते हैं नष्ट आसान
  • मैन्युअल उन पर अनुक्रमणिका परिभाषित करने के लिए की जरूरत नहीं है नहीं है क्षेत्र (InnoDB)
0

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

+0

MySQL में एक विदेशी कुंजी को परिभाषित करना मूल रूप से 1) एक इंडेक्स 2 स्थापित करने के लिए उपनाम है) एक बाधा (वास्तविक फकी), तो हाँ, आपको मिलता है इसके बाहर एक सूचकांक। – chaos

6

विदेशी कुंजी जोड़ना हमेशा एक अच्छा विचार है - कम से कम मैंने कभी भी इसका उपयोग न करने के लिए एक अनिवार्य कारण कभी नहीं देखा है।

  • रेफेरेंन्शिअल सत्यनिष्ठा को लागू करता है (, एक माता पिता को नहीं हटा सकते, तो एक बच्चे मौजूद अनाथ सम्मिलित नहीं कर सकते, या गलत पैरेंट आईडी के साथ एक बच्चे) एक सूचकांक के रूप में
  • काम करता है
  • विदेशी कुंजी के साथ
  • , कोई फर्क नहीं पड़ता कि डेटा कैसे पहुंचा जा सकता है, चाहे किसी ऐप के माध्यम से, एक स्वचालित प्रक्रिया, या टर्मिनल पर कैफीन के बिना कोई नियम नियमों को समान रूप से लागू किया जाता है।
+0

विदेशी कुंजी का उपयोग करते समय कड़ी मेहनत करें – Pegasus

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