दिलचस्प पोस्ट
UIWebView में उपयोगकर्ता एजेंट बदलें (iPhone SDK) पायथन: क्रॉस-मॉड्यूल वेरिएबल कैसे करें? पांडा + डेटाफ्रेम – आंशिक स्ट्रिंग द्वारा चयन करें SQLite स्कीमा सूचना मेटाडेटा onBitmapLoaded लक्ष्य ऑब्जेक्ट पहले लोड पर नहीं बुलाया कोड साइनिंग प्रमाणपत्र की समय सीमा समाप्त होने पर क्या होता है? आर में प्रत्येक पंक्ति के लिए संचयी राशि की गणना UITextView को UITextView के अंदर से कैसे बनाऊं, जो कि यूआईटीक्स्टव्यू के आधार पर गतिशील रूप से अपनी ऊंचाई समायोजित करता है? एकाधिक कार्यपत्रकों के साथ एक्सेल में रिपोर्टिंग सेवाएं निर्यात समांतर में कई सरणीएं java.lang.ClassNotFoundException: HttpServletRequest त्रुटि कोड: 2013. क्वेरी के दौरान MySQL सर्वर से कनेक्शन खो गया कमांड प्रॉम्प्ट में सी # स्रोत फ़ाइल को संकलित करना / निष्पादित करना क्या एसक्यूएल आउटपुट क्लॉज को कॉलम वापस नहीं किया जा सकता है? एंड्रॉइड: ब्लूटूथ यूयूआईडी कैसे काम करते हैं?

विदेशी कुंजी के साथ क्या गलत है?

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

क्या लोगों को कुछ ठोस कारण बताएं कि (स्टैक अतिप्रवाह सिद्धांतों के साथ लाइनों में चर्चा से बचने के लिए) क्या है?

संपादित करें: "मेरे पास अभी तक एक विदेशी कुंजी बनाने का एक कारण है, इसलिए यह वास्तव में एक सेट करने का मेरा पहला कारण हो सकता है।"

Solutions Collecting From Web of "विदेशी कुंजी के साथ क्या गलत है?"

विदेशी कुंजी का उपयोग करने के कारण:

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

विदेशी कुंजी का उपयोग नहीं करने के कारण:

  • आप प्रत्येक सीआरयूडी ऑपरेशन पर डीबी काम अतिरिक्त बना रहे हैं क्योंकि उसे एफके निरंतरता की जांच करना है। यदि आपके पास काफी मंथन है तो यह एक बड़ी लागत हो सकती है
  • रिश्तों को लागू करने से, एफके एक आदेश निर्दिष्ट करता है जिसमें आपको चीजों को जोड़ने / हटाने की आवश्यकता होती है, जो डीबी द्वारा आपके लिए क्या करना चाहते हैं, इनकार कर सकते हैं। (दीक्षित, ऐसे मामलों में, आप जो करने की कोशिश कर रहे हैं वह एक अनाथ रो बना है, और यह आमतौर पर अच्छी बात नहीं है)। यह विशेष रूप से दर्दनाक होता है जब आप बड़े बैच अपडेट कर रहे हैं, और आप दूसरे तालिका से पहले एक तालिका लोड करते हैं, दूसरे तालिका को लगातार राज्य बनाने के साथ (लेकिन क्या आपको ऐसा कुछ करना चाहिए यदि कोई संभावना है कि दूसरा लोड विफल हो और आपका डेटाबेस अब असंगत है?)
  • कभी-कभी आप पहले से जानते हैं कि आपका डेटा गंदे होने वाला है, आप इसे स्वीकार करते हैं, और आप चाहते हैं कि डीबी उसे स्वीकार करें
  • आप बस आलसी जा रहे हैं 🙂

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

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

अगर, हालांकि, आपने अपने अतीत में RDBMS- संबंधित प्रयासों के साथ इस तरह का एक संपूर्ण या सकारात्मक अनुभव नहीं लिया है, तो संभवतः आपको इस तरह की जानकारी का सामना नहीं किया गया है। या शायद आपके अतीत में एक ऐसे वातावरण में विसर्जन शामिल होता है जो बेहोशी विरोधी डेटाबेस था (जैसे, "उन डीबीए बेवकूफ हैं – हम कुछ, हमने कुछ जावा / सी # कोड स्लिंगर चुना है, दिन को बचाएगा"), इस मामले में आप का जोरदार विरोध किया जा सकता है कुछ ड्वेब के रहस्यमय बबिलरों को बताते हुए कि एफके (और बाधाओं का मतलब ये हो सकता है) वास्तव में महत्वपूर्ण हैं यदि आप सुनते हैं

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

जो सेल्को का हवाला देते हुए,

"आकार 26 पेटी जैसा, सिर्फ इसलिए कि आप इसका मतलब यह नहीं कर सकते कि आप चाहिए!"

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

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

किसी भी संबंधपरक डेटाबेस मॉडल के लिए विदेशी कुंजी आवश्यक हैं

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

यह भी तथ्य है कि कई सिस्टम को आम तौर पर डेटाबेस के साथ सीधे इंटरफेस करना पड़ता है – अन्य सिस्टम से जो डेटा को सम्मिलित करने वाले सिस्टम को डेटा (क्रिस्टल रिपोर्ट) को पढ़ते हैं (जरूरी नहीं कि एपीआई मैंने तैयार किया है, यह एक सुस्त विद्वान प्रबंधक जो सिर्फ VBScript की खोज की है और एसक्यूएल बॉक्स के लिए एसए पासवर्ड है)। यदि डाटाबेस बेवकूफ-सबूत के रूप में नहीं है, क्योंकि यह संभवत: ठीक है, अलविदा अल डेटाबेस

यदि आपका डेटा महत्वपूर्ण है, तो हाँ, विदेशी कुंजी का उपयोग करें, डेटा के साथ इंटरैक्ट करने के लिए संग्रहीत कार्यविधियों का एक सूट बनाएं, और सबसे कठिन डीबी बना सकते हैं। यदि आपका डेटा महत्वपूर्ण नहीं है, तो आप एक डेटाबेस बनाने के साथ क्यों शुरू कर रहे हैं?

विदेशी चाबियाँ स्वचालित परीक्षण को जटिल करती हैं

मान लीजिए कि आप विदेशी कुंजी का उपयोग कर रहे हैं आप एक स्वचालित परीक्षण लिख रहे हैं जो कहते हैं, "जब मैं एक वित्तीय खाता अपडेट करता हूं, तो उसे लेनदेन का रिकॉर्ड बचा जाना चाहिए।" इस परीक्षा में, आप केवल दो तालिकाओं से संबंधित हैं: accounts और transactions

हालांकि, accounts contracts लिए एक विदेशी कुंजी है, और contracts में clients लिए एक एफके clients , और clients पास cities एफके है, और cities में states लिए एफके है

अब डेटाबेस आपको चार टेबल्स में डेटा सेट किए बिना अपना परीक्षण चलाने की अनुमति नहीं देगा जो आपके परीक्षण से संबंधित नहीं हैं

इस पर कम से कम दो संभव दृष्टिकोण हैं:

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

परीक्षण चलते समय अस्थायी रूप से विदेशी कुंजी जांच को बंद करना संभव हो सकता है MySQL, कम से कम, इस का समर्थन करता है


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

@ इफेसिंग – यह वास्तव में मानसिकता का प्रकार है जो रखरखाव दुःस्वप्न का कारण बनता है

ओह, आप क्यों, "सॉफ़्टवेयर प्रवर्तन" के पक्ष में, सबसे अच्छा में एक कमजोर निवारक उपाय है, के आधार पर, जहां पर डेटा को कम से कम सुसंगत होने की गारंटी दी जा सकती है, घोषणात्मक संदर्भित अखंडता को अनदेखा क्यों करते हैं?

इनका उपयोग करने के लिए कोई अच्छा कारण नहीं है … जब तक कि अनाथ की पंक्तियाँ आपके लिए बड़ा सौदा नहीं हैं, मुझे लगता है

"वे रिकॉर्ड को और अधिक बोझिल बना सकते हैं – आप" मास्टर "रिकॉर्ड को नहीं हटा सकते हैं, जहां अन्य तालिकाओं में रिकॉर्ड होते हैं जहां विदेशी कुंजी इस बाधा का उल्लंघन करती है।"

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

  • डिलीट प्रतिबंध पर – अन्य तालिका में किसी भी पंक्ति को रोकता है जिसमें इस कॉलम में हटाए जाने की कुंजी होती है। यह वही है जो केन रे ने ऊपर वर्णित किया है।
  • DELETE CASCADE पर – यदि अन्य तालिका में एक पंक्ति नष्ट हो जाती है, तो इस तालिका में किसी भी पंक्तियों को हटा दें जो इसका संदर्भ देता है।
  • DELETE SET DEFAULT पर – यदि अन्य तालिका में एक पंक्ति नष्ट हो जाती है, तो किसी भी विदेशी कुंजी को कॉलम के डिफ़ॉल्ट में संदर्भित करें
  • हटाए गए SET NULL पर – यदि अन्य तालिका में एक पंक्ति नष्ट हो जाती है, तो इस तालिका में किसी भी विदेशी कुंजी को संदर्भित करने के लिए उसे रिक्त करें।
  • हटाने पर कोई कार्रवाई नहीं – यह विदेशी कुंजी केवल यह मानती है कि यह एक विदेशी कुंजी है; अर्थात् या मैपर्स में उपयोग के लिए

ये वही कार्य भी अपडेट पर लागू होते हैं

डिफ़ॉल्ट पर निर्भर करता है कि आप किस SQL ​​सर्वर का उपयोग कर रहे हैं

उनका उपयोग करने के लिए एक अच्छा कारण नहीं है: यदि आप उनकी भूमिका या उनके इस्तेमाल के बारे में नहीं समझते हैं

गलत परिस्थितियों में, विदेशी कुंजी बाधाओं से दुर्घटनाओं के झरने की प्रतिकृति हो सकती है। अगर कोई गलत रिकॉर्ड को निकालता है, तो वह एक विशाल कार्य बन सकता है।

इसके अलावा, इसके विपरीत, जब आपको कुछ निकालने की ज़रूरत होती है, यदि खराब रूप से डिजाइन किया गया है, तो बाधाएं सभी तरह के ताले पैदा कर सकती हैं जो आपको रोकते हैं।

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

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

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

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

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

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

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

विदेशी कुंजी का उपयोग नहीं करने के अतिरिक्त कारण: – आप पुनः उपयोग को कम करके एक ग्राहक को अपने उपकरण में लॉक-इन करने का प्रयास कर रहे हैं।

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

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

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

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

विदेशी कुंजी आवश्यक हैं, जैसे प्राथमिक कुंजी यह कहने की तरह है: क्या होगा यदि हम प्राथमिक कुंजी को निकालते हैं? ठीक है, कुल अराजकता होने जा रही है। यही तो। आप प्रोग्रामिंग स्तर पर प्राथमिक या विदेशी कुंजी जिम्मेदारी नहीं ले सकते, यह डेटा स्तर पर होना चाहिए।

कमियां? हाँ बिल्कुल ! क्योंकि डालने पर, बहुत अधिक चेक होने जा रहे हैं। लेकिन, अगर डेटा अखंडता प्रदर्शन के मुकाबले अधिक महत्वपूर्ण है, तो यह एक नो ब्रेनर है ओरेकल पर प्रदर्शन के साथ समस्या अनुक्रमित से अधिक संबंधित है, जो पीके और एफके के साथ आती है।

वे रिकॉर्ड को और अधिक कठिन बना सकते हैं – आप "मास्टर" रिकॉर्ड को नहीं हटा सकते हैं, जहां अन्य तालिकाओं में रिकॉर्ड हैं जहां विदेशी कुंजी इस बाधा का उल्लंघन करती हैं आप कैसीडेंड हटाए जाने के लिए ट्रिगर का उपयोग कर सकते हैं।

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

मेरा मानना ​​है कि फायरइन कुंजियों के इस्तेमाल के फायदों में किसी भी तरह के नुकसान का मतलब होता है।

विदेशी कुंजी बाधाओं को सत्यापित करने में कुछ CPU का समय लगता है, इसलिए कुछ लोग कुछ अतिरिक्त प्रदर्शन प्राप्त करने के लिए विदेशी कुंजी को छोड़ देते हैं।

स्पष्टीकरण डेटाबेस व्यावसायिक डाटाबेस का एक उदाहरण है जिसमें कोई प्राथमिक या विदेशी कुंजी नहीं है।

http://www.geekinterview.com/question_details/18869

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

दूसरे शब्दों में, वे स्पष्ट घोषणाओं (डीआरआई) के साथ तालिकाओं में शामिल हो सकते थे , लेकिन उन्होंने यह नहीं चुना

नतीजतन, स्पष्टीकरण डेटाबेस असंगतता से भरा है और यह कम प्रदर्शन कर रहा है।

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

और मुझे लगता है कि, रिलेशनल डेटाबेस में विदेशी कुंजी बाधाओं के होने का मुख्य लाभ नहीं है। यह इसे विकसित करना आसान बनाता है, कम से कम यह एक शैतान-मई-देखभाल दृष्टिकोण से हो सकता है

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

मैंने सुना तर्क यह है कि सामने के अंत में इन व्यावसायिक नियम होने चाहिए। विदेशी कुंजी "अनावश्यक ओवरहेड जोड़ें" जब आपको किसी भी सम्मिलन की अनुमति नहीं दी जानी चाहिए जो आपकी बाधाओं को पहली जगह में तोड़ देते हैं क्या मैं इस से सहमत हूं? नहीं, लेकिन यही मैंने हमेशा सुना है।

संपादित करें: मेरा अनुमान है कि वह विदेशी कुंजी बाधाओं का संदर्भ दे रहा है, एक अवधारणा के रूप में विदेशी कुंजी नहीं।

मेरे लिए, यदि आप एसिड मानकों से जाना चाहते हैं, तो संदर्भ कुंजी को सुनिश्चित करने के लिए विदेशी कुंजी रखना महत्वपूर्ण है

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

मुझे लगता है कि मेरी सारी परियोजनाओं में से 99% में मुझे डेटा की अखंडता को लागू करने के लिए एफके होगा, हालांकि, ऐसे दुर्लभ अवसर हैं जहां मेरे पास ग्राहक हैं, जो अपने पुराने डेटा को बनाए रखना चाहिए, भले ही यह कितना बुरा है …. लेकिन फिर मैं बहुत सारे समय लिखने वाला कोड लिखता हूं जो वैसे भी वैध डेटा प्राप्त करता है, इसलिए यह व्यर्थ हो जाता है।

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

मुझे यह भी लगता है कि अधिकांश डेटाबेस में विदेशी कुंजी एक आवश्यकता होती है एकमात्र दोष (कार्यात्मक हिट के अलावा जो लागू संगतता के साथ आता है) यह है कि एक विदेशी कुंजी होने से लोगों को कोड लिखा जा सकता है जो मानता है कि एक कार्यात्मक विदेशी कुंजी है यह कभी भी अनुमति नहीं दी जानी चाहिए

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

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

यदि उन सुविधाओं को चालू किया जाता है, तो आपका कोड उन्हें किसी भी तरह का अनुकरण करेगा और आप थोड़ा प्रदर्शन खो देंगे

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

मैं दिमित्री द्वारा जवाब गूंज – बहुत अच्छी तरह से डाल दिया

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

मैं आमतौर पर अपने डेटा मार्ट स्कीमा में कुछ टेबल पर इस रणनीति का उपयोग करता हूं, लेकिन मेरे एकीकृत स्टेजिंग स्कीमा में नहीं। मुझे यकीन है कि मैं जो तालिकाओं से डेटा की नकल कर रहा हूं, वही पहले से ही लागू की गई बाध्यता है, या ईटीएल की रूटीन बाध्यता को लागू करती है।

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

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

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

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

लेकिन यहां एक और बहुत अच्छा वास्तविक जीवन कारण है जो कि विदेशी कुंजी का उपयोग नहीं करता है:

आप एक उत्पाद विकसित कर रहे हैं, जिसे अलग डेटाबेस सिस्टम का समर्थन करना चाहिए।

यदि आप इकाई फ़्रेमवर्क के साथ काम कर रहे हैं, जो कई अलग-अलग डेटाबेस सिस्टम से कनेक्ट करने में सक्षम है, तो आप "ओपन सोर्स-फ्री-ऑफ-चार्ज" सर्वरहीन डेटाबेस का समर्थन भी कर सकते हैं। इन सभी डेटाबेस आपके विदेशी कुंजी नियमों का समर्थन नहीं कर सकते (इन्हें अद्यतन करना, पंक्तियों को हटा देना …)।

इससे भिन्न समस्याएं हो सकती हैं:

1.) आप त्रुटियों में चल सकते हैं, जब डेटाबेस संरचना बनाया या अद्यतन किया जाता है। हो सकता है कि केवल चुप त्रुटियां ही हों, क्योंकि आपकी विदेशी कुंजी को डेटाबेस सिस्टम द्वारा सिर्फ अनदेखा कर दिया गया है।

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

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

कोई भी नहीं जानता, कैसे ये सभी डीबी सिस्टम व्यवहार करते हैं, लेकिन आपके व्यावसायिक तर्क, अखंडता जांच के साथ, हमेशा एक ही रहता है।

मैंने हमेशा सोचा कि आलसी उन का उपयोग न करें। मुझे सिखाया गया था कि यह हमेशा किया जाना चाहिए। लेकिन फिर, मैंने जोएल की चर्चा नहीं सुनाई। उसके पास एक अच्छा कारण हो सकता है, मुझे नहीं पता।

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

मैं दिमित्री ने जो कहा था गूंज दूँगा, लेकिन एक बिंदु पर जोड़ने

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

सम्मिलित करने से पहले, हम विदेशी कुंजी बाधाओं को अक्षम करते हैं ताकि ओरेकल हमेशा सम्मिलित करने के लिए नहीं लेता डालने सफल होने के बाद, हम बाधाओं को पुनः सक्षम करते हैं।

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

कई चीजों की तरह, यह एक ट्रेडऑफ है। यह एक प्रश्न है कि आप डेटा अखंडता को सत्यापित करने के लिए कहां काम करना चाहते हैं:

(1) एक विदेशी कुंजी (एक मेज के लिए कॉन्फ़िगर करने के लिए एक एकल बिंदु का उपयोग करें, फीचर पहले ही लागू किया गया है, परीक्षण किया गया है, काम करने के लिए सिद्ध है)

(2) इसे डेटाबेस के उपयोगकर्ताओं को छोड़ दें (संभावित एकाधिक उपयोगकर्ता / एप्लिकेशन एक ही तालिका (अपडेट्स) को अपडेट कर रहे हैं जिसका मतलब है कि विफलता के अधिक संभावित बिंदु और परीक्षण में बढ़ी जटिलता)

यह डाटाबेस के लिए अधिक कुशल है (2), बनाए रखने में आसान और (1) के साथ कम जोखिम।