27

मेरे पास प्राथमिक कुंजी user_id और तालिका 2 के साथ तालिका 1 है जहां user_id एक विदेशी कुंजी है।MySQL - प्राथमिक कुंजी के रूप में विदेशी कुंजी का उपयोग भी

केवल 1 रिकॉर्ड प्रति user_id तालिका 2 में मौजूद हो सकता है, और इसके बिना कोई रिकॉर्ड मौजूद नहीं हो सकता है।

प्रश्न: तालिका 2 में user_id एक ही समय में विदेशी और प्राथमिक कुंजी दोनों हो सकता है, और यदि हां, तो यह एक अच्छा विचार है, पेशेवर/विपक्ष क्या हैं?

+0

इसी तरह का प्रश्न (लेकिन डुप्लिकेट नहीं): [विदेशी कुंजी कैसे बनाएं जो MySQL में प्राथमिक कुंजी भी है?] (Http://stackoverflow.com/questions/5575051/how-to-create-foreign-key -थैट-ए-ए-प्राथमिक-कुंजी-इन-माइस्क्ल) – naXa

उत्तर

32

हां, आप यह कर सकते हैं (और आपको डेटाबेस डिज़ाइन बिंदु दृश्य से) चाहिए।

हालांकि, इस बात पर विचार करें कि user_id तालिका 2 पर प्राथमिक कुंजी है। आप प्रभावी रूप से कह रहे हैं कि तालिका 2 में प्रत्येक पंक्ति किसी उपयोगकर्ता से मेल खाती है, लेकिन आपके पास पहले से एक सारणी है जहां प्रत्येक पंक्ति किसी उपयोगकर्ता से मेल खाती है: तालिका 1. यह सवाल उठाता है "फिर आप टेबल 2 के सभी डेटा को तालिका 1 में निरर्थक कॉलम में क्यों नहीं डालते?"। आखिरकार, दो टेबल होने का मतलब है कि आपको एक के बजाय इस डेटा को प्राप्त करने के लिए दो प्रश्न पूछना होगा।

अब वहाँ कुछ स्थितियों में, जहां इस अभ्यास में एक अच्छा विचार हो सकते हैं:

  • यदि आप उन के बहुत सारे लेकिन तालिका 2 में केवल कुछ ऐसी पंक्तियां है, शायद तालिका 2 पर क्वेरी केवल शायद ही कभी किया जाता हो जाएगा ; साथ ही, आप तालिका 1
  • पर संग्रहण स्थान और संशोधन गति प्राप्त करते हैं, भविष्य में तालिका 2 की प्राथमिक कुंजी बदलने के लिए भविष्य में संभव हो सकता है, जबकि विदेशी कुंजी बनी हुई है; यदि आप तालिका 1 में सभी डेटा डालते हैं, तो यह संशोधन आपके डेटाबेस मॉडल को

यह एक अच्छा विचार हो सकता है, लेकिन यह आपके आवेदन के विवरणों पर निर्भर करता है।

+2

धन्यवाद। मेरे मामले में यह आपके द्वारा वर्णित पहला परिदृश्य है, साथ ही तथ्य यह है कि तालिका 2 में बहुत सारे कॉलम हैं, और टेबल 3, 4 इत्यादि भी हैं जो तालिका 1 के समान संबंध में हैं, इसलिए सभी कॉलम डालना बहुत अधिक होगा। – CodeVirtuoso

+5

एक स्थिति जिसमें यह समझ में आता है कि यदि आप [क्लास टेबल विरासत] (http://stackoverflow.com/a/3579462/1709587) का उपयोग कर रहे हैं और तालिका 2 तालिका 1 के उप-वर्ग का प्रतिनिधित्व करता है। मुझे लगता है कि यह एक विशेष है आपके पहले बुलेट बिंदु का मामला। –

+0

ऐसा करने का एक अन्य कारण यह होगा कि यदि आपके पास दो अलग-अलग टेबल, टेबल ए और टेबल बी हैं, जो तालिका सी में कॉलम साझा करते हैं। उदाहरण के लिए आपके पास संपर्क नामक एक टेबल है, जिसे कर्मचारी कहा जाता है, और दूसरा जिसे लोग कहते हैं। लोगों का पहला नाम, अंतिम नाम, आदि और संपर्क और कर्मचारी दोनों प्रतिनिधित्व करते हैं। –