26

संबंधों को संभालने वाले एमवीसी ढांचे के साथ काम करते समय विदेशी कुंजी को परिभाषित करने का क्या फायदा है?विदेशी कुंजी को परिभाषित करने के क्या फायदे हैं

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

क्या विदेशी कुंजी का उपयोग करने के लिए कोई फायदा है जिसे मैं पूरी तरह से उपयोग छोड़कर जा रहा हूं?

+1

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

+1

अत्यधिक संबंधित: [विदेशी कुंजी अभ्यास में सिद्धांत की तुलना में अधिक उपयोग क्यों कर रहे हैं?] (http://stackoverflow.com/questions/1876013/why-are-foreign -कर्स-अधिक-प्रयोग-इन-थ्योरी-इन-प्रैक्टिस) –

+1

हमारे पास एक ऐसी जगह थी जहां मैं काम करता था: एक ऐप की कोई विदेशी कुंजी नहीं थी क्योंकि ओआरएम ने ऐसे सभी मामलों को संभाला था। एक दिन बहुत महत्वपूर्ण ग्राहक ने महत्वपूर्ण डेटा हानि की खोज की जो अंततः ओआरएम में एक बग पर वापस आ गया। रिश्ते को बहुत हानिकारक, ओआरएम डेवलपर को दोषी ठहराते हुए मदद नहीं करता है। विदेशी कुंजी बहुत जल्द बाद में जोड़ा गया था! – onedaywhen

उत्तर

31

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

+3

एक और लाभ DELETE को कैस्केड कर रहा है। उदाहरण के लिए मान लें कि आपके पास 'उपयोगकर्ता' तालिका है, और' कक्षा 'तालिका है। 'कक्षा' में सभी उपयोगकर्ता के डेटा को फिर से लिखने के बजाय, आप बस उपयोगकर्ता की आईडी का संदर्भ लें। लेकिन क्या होगा यदि वह उपयोगकर्ता हटा दिया गया है? यदि आपके पास कैस्केडिंग डिलीट चालू नहीं है, तो क्लास टेबल में पंक्ति एक गैर-मौजूदा उपयोगकर्ता को इंगित करती है। क्या होगा यदि उस उपयोगकर्ता आईडी को पूरी तरह से अलग उपयोगकर्ता द्वारा प्रतिस्थापित किया गया हो? वह तब होता है जब सामान वास्तव में खराब हो जाता है। कैस्केडिंग हटाएं उस उपयोगकर्ता से जुड़े किसी भी रिकॉर्ड को हटा देगा। यह महत्वपूर्ण प्रतीत नहीं हो सकता है, लेकिन यदि 'उपयोगकर्ता' बहुत सारी तालिकाओं से जुड़ा हुआ है, तो इससे बहुत मदद मिलती है। –

+0

क्या हमारे पास कोई कीमत है? – Ahmad

13

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

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

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

डेटाबेस संरचना अभी भी प्रवाह में है, जबकि एफके को अक्षम करने में मददगार हो सकता है, लेकिन स्कीमा अधिक स्थिर होने पर वे सुरक्षित हैं।

11

एक विदेशी कुंजी एक मेल खाने वाले रिकॉर्ड की गारंटी देता है जो एक विदेशी तालिका में मौजूद है। Books नामक एक तालिका की कल्पना करें जिसमें Authors नामक तालिका पर एक एफके बाधा है। प्रत्येक पुस्तक की Author होने की गारंटी है।

SELECT B.Title, A.Name FROM Books B 
INNER JOIN Authors A ON B.AuthorId = A.AuthorId; 
FK बाधा के बिना

, एक लापता Author पंक्ति में पूरी Book पंक्ति का कारण होता है गिरा दिया जाना, अपने डेटासेट में पुस्तकों की याद आ रही है, जिसके परिणामस्वरूप:

अब, आप एक क्वेरी जैसे कि कर सकते हैं।

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

2

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

5

जबकि विकास/परीक्षण डेटा में हेरफेर करते समय वे दर्द हो सकते हैं, उन्होंने मुझे उत्पादन में बहुत परेशानी बचाई है।

उनके बारे में डेटा अखंडता को बनाए रखने के तरीके के रूप में सोचें, खासकर अनाथ रिकॉर्ड के खिलाफ सुरक्षा के रूप में।

उदाहरण के लिए, यदि आप एक Person के लिए कई PhoneNumber रिकॉर्ड से संबंधित एक डेटाबेस था, क्या PhoneNumber रिकॉर्ड करने के लिए जब Person रिकॉर्ड भी कारण से हटा दिया जाता है क्या होता है? वे अभी भी डेटाबेस में मौजूद होंगे, लेकिन Person की आईडी वे संबंधित Person तालिका में मौजूद नहीं रहेंगी और आपके पास अनाथ रिकॉर्ड हैं।

हाँ, आप PhoneNumber जब भी कोई Person हटा दिया जाता है को नष्ट करने के लिए एक ट्रिगर लिख सकता है, लेकिन यह गंदा हो सकता है अगर आप गलती से एक Person हटा सकते हैं और रोलबैक की जरूरत है।

हां, आपको PhoneNumber रिकॉर्ड्स मैन्युअल रूप से रिकॉर्ड्स से छुटकारा मिल सकता है, लेकिन अन्य डेवलपर्स या विधियों के बारे में क्या आप लाइन के नीचे 9 महीने लिखते हैं?

कोई विदेशी कुंजी बनाकर जो PhoneNumber किसी मौजूदा Person से संबंधित है, तो आप दोनों इस रिश्ते को नष्ट करने और इच्छित डेटा संरचना के रूप में 'सुराग' जोड़ने के लिए बीमा करते हैं।

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