2009-11-13 12 views
7

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

क्या आप समझा सकते हैं कि इस परिदृश्य में एक सूचकांक क्या होगा और यह विदेशी कुंजी से अलग कैसे है और यह मेरे डेटाबेस डिज़ाइन को कैसे प्रभावित करता है?

उत्तर

12

किसी तालिका पर एक अनुक्रमणिका है एक डेटा संरचना जो पंक्तियों को यादृच्छिक पहुंच को तेज़ और कुशल बनाती है। यह एक मेज के आंतरिक संगठन को अनुकूलित करने में भी मदद करता है।

एक विदेशी कुंजी केवल एक अन्य तालिका में संबंधित कॉलम के लिए एक सूचक है जो दो तालिकाओं के बीच एक रेफरेंसियल बाधा बनाती है।

4

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

इंडेक्स एक अनावश्यक डेटा संरचना है जो कुछ प्रश्नों को गति देती है। व्यावहारिक मामलों के लिए विदेशी कुंजी, यह सुनिश्चित करने का एक तरीका है कि आपके टेबल में पंक्तियों के बीच कोई अमान्य पॉइंटर्स नहीं हैं (आपके मामले में, रिलेशनशिप टेबल से पोस्ट और टैग तक)

+0

विदेशी कुंजी एक पूर्ण नियम लागू नहीं करती है। एक विदेशी कुंजी कॉलम के मूल्यों पर बाधा उत्पन्न करती है। – jabbie

+0

वह एक पूर्ण मूल्य लागू करने के बारे में बात नहीं कर रहा है, वह यह सुनिश्चित करने के बारे में बात कर रहा है कि मेरे पास बाल तालिका में कोई आईडी नहीं है जो मूल तालिका में मौजूद नहीं है। –

+0

बिल्कुल। धन्यवाद, गैब्रियल, समझाओ। – Dmitry

1

mysql में विदेशी कुंजी का उपयोग करने के लिए, आपको दोनों तालिकाओं पर अनुक्रमणिका बनाना होगा। उदाहरण के लिए, यदि आप a_id तालिका b पर id तालिका a पर फ़ील्ड पर संदर्भित करने के लिए फ़ील्ड a_id चाहते हैं, तो आपको संदर्भ बनाने से पहले a.id और b.a_id दोनों पर इंडेक्स बनाना होगा।

अद्यतन: यहाँ आप इसके बारे में और अधिक पढ़ सकते हैं: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

+0

जो लिंक आप देते हैं वह केवल MySQL में InnoDB डेटाबेस पर लागू होता है। एक बेहतर लिंक "http://dev.mysql.com/doc/refman/5.1/en/example-foreign-keys.html" पर पाया जा सकता है। –

+0

मुझे लगता है कि MySQL स्वचालित रूप से प्राथमिक कुंजी पर सूचकांक बनाता है और कॉलम संदर्भित करता है – Dmitry

2

आप एक बहुत ही आम डेटाबेस निर्माण का वर्णन; इसे "कई से कई संबंध" कहा जाता है।

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

3

एक सूचकांक के रूप में एक तेजी से तालिका में डेटा के लिए ऊपर देखो जोड़ा जाता है:

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

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

+0

बाधा (विशेष रूप से अद्वितीय), मूल रूप से, एक कॉलम की एक संपत्ति है, सूचकांक नहीं – Dmitry

3

प्रश्न: क्या आप समझा सकते हैं कि इस परिदृश्य में एक सूचकांक क्या होगा और यह विदेशी कुंजी से अलग कैसे है और यह मेरे डेटाबेस डिज़ाइन को कैसे प्रभावित करता है?

इस मामले में आपकी विदेशी कुंजी आपकी पोस्ट_Tags तालिका में दो कॉलम हैं। एक विदेशी कुंजी के साथ, प्रत्येक विदेशी कुंजी कॉलम में संदर्भित मुख्य तालिका से एक मान होना चाहिए।इस मामले में, पोस्ट और टैग टेबल।

Posts_Tags-> postid चाहिए Posts- में निहित> एक मूल्य postid

हो

Posts_Tags-> TagID एक मूल्य Tags- में समाहित किया जाना चाहिए> TagID

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

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

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