2009-03-01 11 views
18

संभव डुप्लिकेट:
What’s wrong with foreign keys?क्या मुझे विदेशी कुंजी का उपयोग करना चाहिए?

मैं एक बड़ी डेटाबेस के बारे में 4 जीबी डेटा के साथ एमएस Sql सर्वर का उपयोग करें।

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

क्या मुझे विदेशी कुंजी का उपयोग करना चाहिए? क्या मुझे विदेशी कुंजी के साथ और भी अधिक प्रदर्शन मिलेगा?

उत्तर

5

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

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

मैं आपके डिजाइन के अनुकूलन के बारे में आपकी प्रसन्नता के बारे में थोड़ा संदिग्ध होगा, हालांकि, अगर आपके पास इस अवधारणा को पहले से ही नहीं मिला है।

समझ के लक्ष्य क्या वे ईमानदारी लागू करने के लिए करते हैं के साथ विदेश कुंजी के लिए दस्तावेज़ पढ़ें (यह किसी भी मामले में के बारे में जानने लायक है।) इसके बाद अगर वह अपने प्रश्न अधिक पूरी तरह से उत्तर नहीं मिलता है देखते हैं।

+1

साथ निष्क्रिय कर सकते हैं "निष्पादन की गति से संबंधित नहीं" नहीं आवेषण के लिए पूरी तरह से सही है (मैं तुम्हें पता है लेकिन तुआन नहीं हो सकता है) – SquareCog

+0

Thx - मैं बाहर जवाब एक सा भरा है, एक फैशन में जो एक ही स्थान को समाप्त करना चाहिए। – dkretz

+0

सम्मिलित करने के बारे में अच्छा तर्क। मेरे पास संरचना का अच्छा विचार है। जैसा कि मैंने कहा कि अभिन्नता कोई समस्या नहीं है। मुझे कच्ची गति चाहिए। –

13

विदेशी कुंजी है, वास्तव में वे सभी पर एक छोटे से निष्पादन दंड देना वास्तव में प्रदर्शन में सुधार नहीं करते संचालन लिखते हैं, यह सुनिश्चित करें कि बाधा पीछा किया जाता है।

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

1

विदेशी कुंजी डेटा अखंडता बेहतर, प्रदर्शन, कुछ हद तक धीमी जब हटाने/डालने/अपडेट करना सुनिश्चित करें।
मेरी आखिरी कंपनी में हमने बीएल में अखंडता/कनेक्शन रखने का फैसला किया, क्योंकि यह बीएल में सरल बनाता है (लाखों रिकॉर्ड याद करता है)। यदि आपके पास एक छोटा ऐप है, तो मुझे कोई कारण नहीं दिखता है कि डेटा लेयर (डीबी)

+0

बीएल के लिए क्या खड़ा है? – usefulBee

+1

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

+0

कहकर, "हमने बीएल में अखंडता/कनेक्शन रखने का फैसला किया है," क्या आप कोड फर्स्ट दृष्टिकोण का जिक्र कर रहे हैं या और क्या? – usefulBee

4

पुराने प्रश्न में क्या उल्लेख नहीं किया गया था कि स्क्वायरकॉग पहले से जुड़ा हुआ था - हाँ, विदेशी कुंजी बाधाएं दर्द हो सकती हैं डेटा क्लीनअप, बैच अपडेट, टेस्ट डेटा पीढ़ी, या किसी भी प्रकार के ऑपरेशन करना जहां आप चीजों के सामान्य अनुक्रम को बाईपास करते हैं। लेकिन - ऐसा करने से पहले आप हमेशा अपनी विदेशी कुंजी बाधाओं को छोड़ सकते हैं, और फिर बाद में उन्हें फिर से बना सकते हैं (यदि आपके डेटाबेस ऑब्जेक्ट्स सही तरीके से लिखे गए हैं, तो यह शायद ही कोई अतिरिक्त काम है)।

मैं आलसी था, लेकिन विदेशी कुंजी बाधाओं के आधार पर चारों ओर आ गया था। ऐसी स्थितियां अभी भी हैं जहां आप उन्हें नहीं प्राप्त कर सकते हैं - जैसे क्रॉस-डेटाबेस संबंधों में।

3

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

यदि आपके पास कोड का एक निकाय है, जो काम करता है और "तेजी से और ढीला खेलता है", प्रतिबद्ध/लेनदेन के साथ। फिर आप स्कीमा में एफके के साथ काम करने वाली चीज़ों को प्राप्त करने के लिए कुछ उपचार के लिए हो सकते हैं।

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

+0

द्वारा कोड कोड पहला दृष्टिकोण प्रस्तुत किया गया है, जिनमें से दोनों मेरे द्वारा पोस्ट किए गए लिंक में उल्लिखित हैं, लेकिन मैं वैसे भी आपके लिए वोट दूंगा। "प्रतिबद्ध/लेनदेन तर्क" को आधिकारिक तौर पर एसीआईडी ​​गारंटी के रूप में जाना जाता है (लेनदेन समाप्त होने के बाद, "सी" संगत के लिए होता है, डेटा घोषित बाधाओं के अनुरूप होता है)। – SquareCog

1

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

9

ईमानदारी आज कोई समस्या नहीं हो सकती है, लेकिन यह सही दृष्टिकोण है जो कल से या दो सप्ताह में समस्या बना देता है।

4

MySQL में आप विदेशी कुंजी के SET FOREIGN_KEY_CHECKS=0

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