2010-08-08 15 views
7

मैं एक छोटा सा एप्लीकेशन बना रहा हूं और तालिकाओं के बीच विदेशी कुंजी संबंध स्थापित कर रहा हूं। हालांकि मैं उलझन में हूं कि मुझे वास्तव में इसकी आवश्यकता क्यों है? लाभ क्या है - क्या यह मेरी क्वेरी लिखते समय मेरी सहायता करता है कि मुझे कोई भी शामिल करने की ज़रूरत नहीं है?विदेशी कुंजी - वे मेरे लिए क्या करते हैं?

+-------------------+ 
| USERS    | 
+-------------------+ 
| user_id   | 
| username   | 
| create_date  | 
+-------------------+ 

+-------------------+ 
| PROJECTS   | 
+-------------------+ 
| project_id  | 
| creator   | 
| name    | 
| description  | 
+-------------------+ 

users के बीच एक महत्वपूर्ण संबंध है: यहाँ मेरी डेटाबेस का एक उदाहरण टुकड़ा है। user_id और projectscreator

क्या मैं ऐसा क्वेरी करने में सक्षम हूं?

SELECT * FROM PROJECTS WHERE USERS.username = "a real user";

MySQL के बाद से तालिकाओं के बीच संबंध पता होना चाहिए? यदि नहीं, तो डेटाबेस डिज़ाइन में विदेशी कुंजी का वास्तविक कार्य क्या है?

+0

क्या इसे http://dba.stackexchange.com/ पर माइग्रेट किया जाना चाहिए? – simgineer

+0

नहीं, शायद नहीं। उस साइट से पहले पूछा गया और उत्तर दिया गया। प्रवासन के लिए कोई वास्तविक लाभ नहीं है। –

उत्तर

16

विदेशी कुंजी रेफरेंसियल अखंडता प्रदान करती है। विदेशी कुंजी कॉलम में डेटा मान्य है - मान केवल वह हो सकता है जो तालिका में & कॉलम में पहले से मौजूद है। "खराब डेटा" को रोकने में यह बहुत प्रभावी है - कोई भी जो कुछ भी चाहे वह दर्ज नहीं कर सकता - संख्याएं, ASCII पाठ इत्यादि। इसका मतलब है कि डेटा सामान्यीकृत है - दोहराने वाले मूल्यों की पहचान की गई है और उनकी अपनी तालिका में अलग है, इसलिए कोई और चिंता नहीं है पाठ में केस संवेदनशीलता से निपटने के बारे में ... और मूल्य सुसंगत हैं। यह अगले भाग में जाता है - विदेशी कुंजी जो आप टेबल तालिकाओं में शामिल होने के लिए उपयोग करते हैं।

परियोजनाओं एक उपयोगकर्ता काम नहीं होता है के लिए आपकी क्वेरी - आप USERS मेज से एक स्तंभ को संदर्भित कर रहे हैं जब वहाँ क्वेरी में तालिका के लिए कोई संदर्भ है, और वहाँ कोई सबक्वेरी यह लिंक करने से पहले कि जानकारी पाने के लिए इस्तेमाल किया जा रहा है PROJECTS तालिका में। आप वास्तव में क्या उपयोग करेंगे:

SELECT p.* 
    FROM PROJECTS p 
    JOIN USERS u ON u.user_id = p.creator 
WHERE u.username = 'John Smith' 
+0

धन्यवाद - मुझे लगा कि मैं इसके साथ जुड़ने का एक तरीका प्राप्त कर सकता हूं - लेकिन आप उत्तर देने में मदद करता है कि यह वास्तव में क्या करता है। –

0

यदि प्रत्येक उपयोगकर्ता बिल्कुल एक प्रोजेक्ट से संबंधित है और प्रत्येक प्रोजेक्ट एक्स्टैक्टली एक उपयोगकर्ता से संबंधित है तो यह कहा जाता है कि तालिकाओं में एक से एक रिश्ते है और उपयोगकर्ताओं के बीच एक महत्वपूर्ण संबंध है .user_id और projects.project_id ठीक है (हालांकि शायद मानक नहीं)।

हालांकि, यदि कोई उपयोगकर्ता कई परियोजनाओं से संबंधित हो सकता है (या एक परियोजना में कई उपयोगकर्ता हो सकते हैं) तो आपके पास कई रिश्ते हैं और आपको एक विदेशी कुंजी की आवश्यकता है।

यदि परियोजनाओं में कई उपयोगकर्ता हो सकते हैं और उपयोगकर्ता कई परियोजनाओं से संबंधित हो सकते हैं तो आपके पास कई रिश्ते हैं और आपको एक अधिक परिष्कृत मॉडल की आवश्यकता है।

+0

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

+0

उपरोक्त अपने टेबल लेआउट को देखते हुए, आपके SQL स्टेटमेंट को उन सभी उपयोगकर्ताओं को प्राप्त करने के लिए क्या होगा जो project_id = 1 का हिस्सा हैं? – EddieC

+1

@ मार्को सेप्पी: जब आपने विदेशी कुंजी का उपयोग किए बिना रिश्तों का मॉडल किया है, तो उपयोगकर्ता को उस डेटा को दर्ज करने से रोकने के लिए कुछ भी नहीं है जो उस रिश्ते का प्रतिनिधित्व करने वाले कॉलम (ओं) से संबंधित नहीं है। –

4

असल में, वे आपको और अधिक कार्यक्षमता नहीं देंगे। वे आपके डेटा मॉडल की रेफरेंशियल अखंडता को तोड़ने वाले किसी भी आवेषण या अपडेट को रोकते हैं।

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

+2

मैं कहूंगा कि डेटा सत्यापन कार्यक्षमता है - एक विदेशी कुंजी बाधा स्टेरियोड पर एक जांच बाधा की तरह है। जांच बाधाएं केवल डेटा को मान्य करती हैं; विदेशी कुंजी का मतलब है कि आप उस संबंध में संबंधित जानकारी जोड़ सकते हैं - डेटा सत्यापन के अतिरिक्त। –

3

यदि आप कभी भी शामिल नहीं होते हैं, तो आपको विदेशी कुंजी की आवश्यकता नहीं है।

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

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


मेरी पिछली प्रतिक्रिया प्रश्न के पीछे असली प्रश्न को नोट करने में विफल रही। मेरे द्वारा उत्तर दिया गया प्रश्न "एसक्यूएल स्कीमा में विदेशी कुंजी क्यों हैं", और जवाब "जुड़ने के लिए" है। लेकिन सवाल को दोबारा पढ़ते हुए, मैं एक और अधिक सूक्ष्म सवाल समझ रहा हूं, जो कि "एसक्यूएल मेरे लिए जुड़ता नहीं है, अगर यह संबंधों को जानता है"। यह वास्तव में एक अच्छा सवाल है। यह उपर्युक्त से बेहतर जवाब देने योग्य है।

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

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

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

+0

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

2

एक विदेशी कुंजी बाधा का उपयोग करते हुए निम्नलिखित प्रदान कर सकते हैं:

  • रोकें डेटाबेस बेमेल कुंजी
  • रोकें डेटाबेस स्वचालित रूप से अनाथ पंक्तियों को हटाने (ON साथ DELETE CASCADE) द्वारा असंगत डेटा युक्त रोकने के द्वारा असंगत डेटा युक्त
  • भविष्य डेवलपर्स के लिए दस्तावेज़ के लिए जो स्तंभ एक विदेशी कुंजी यह मा नहीं है जो

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

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