क्या डेटाबेस डिज़ाइन में विदेशी कुंजी वास्तव में आवश्यक हैं?


109

जहाँ तक मुझे पता है, प्रोग्रामर को सही तरीके से डेटा में हेरफेर करने में मदद करने के लिए विदेशी कुंजी (FK) का उपयोग किया जाता है। मान लीजिए कि एक प्रोग्रामर वास्तव में पहले से ही सही तरीके से ऐसा कर रहा है, तो क्या हमें वास्तव में विदेशी कुंजी की अवधारणा की आवश्यकता है?

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


2
यह अक्सर यहाँ के आसपास आता है। मैं जोएल स्पॉलस्की को दोषी ठहराता हूं :-)। यहाँ कई अच्छे उत्तर हैं; मेरे
प्रतिशोध के

70
"मान लीजिए कि एक प्रोग्रामर वास्तव में पहले से ही सही तरीके से ऐसा कर रहा है" - मैं इस तरह के परिदृश्य की कल्पना भी नहीं कर सकता।
पुनरावर्ती

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

5
@lubos और cdeszaq दरअसल, यह एक संबंधपरक नियम है ... यह कोडड के "ट्वेल्वे कमांड" के नियम 10 का एक सबसेट है ... "इंटीग्रिटी इंडिपेंडेंस", जो मूल रूप से कहता है कि RDBMS के संबंधपरक अखंडता को किसी भी एप्लिकेशन से स्वतंत्र रूप से बनाए रखा जाना चाहिए जो इसे एक्सेस करता है, जो यह वही है जो मैं एक आसान तरीके से समझा रहा था। यह नियम, अन्य महत्वपूर्ण बातों, विदेशी महत्वपूर्ण बाधाओं के बीच लागू किया गया है। तो हाँ, एक विदेशी कुंजी का विचार "एक" संबंधपरक नियम है।
२३:०१ पर त्रिकोको

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

जवाबों:


102

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


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

7
यह एक भयानक जवाब है FKs genaerally अतिरिक्त ओवरहेड जोड़ सकता है प्रदर्शन में सुधार नहीं।
एजिले जेडी

SQL- सर्वर में, वे रेफरी या रेफ़रर पर डिफ़ॉल्ट रूप से अनुक्रमित नहीं होते हैं। sqlskills.com/blogs/kimberly/…
user420667

1
न ही ओरेकल में; आपको स्वयं (FK कॉलम पर) अनुक्रमणिका बनानी होगी।
लिटिलफूट

58

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


3
@Greg Hewgill यह लगातार समस्याओं का कारण बन सकता है। आपको DELETE CASCADE जैसे विचारों से बहुत सावधान रहना चाहिए, क्योंकि कई मामलों में, आप उपयोगकर्ता को हटाते समय उपयोगकर्ता द्वारा बनाए गए आदेशों को रखना चाहेंगे।
कबिबी

8
यद्यपि इसे संभवतः व्यावसायिक तर्क परत में संभाला जाना चाहिए। संबंधित बाल रिकॉर्ड रखने या न रखने का निर्णय लेना, यह सुनिश्चित करने के लिए बिल्कुल समान नहीं है कि कोई भी मूल्य विदेशी कुंजी संबंधों का उल्लंघन नहीं करता है।
कोडवर्ड

5
दूसरा मुद्दा ऑडिटिंग का है, अगर ऑडिटिंग डीबी लेवल पर नहीं की जाती है, तो कैस्केडिंग अपडेट या डिलीट करना आपके ऑडिट डिसिल को अमान्य कर देगा।
si618

@ कोडवर्ड: व्यावसायिक तर्क डीबी में हो सकते हैं।
19

44

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

उन्हें कड़ाई से बोलने की आवश्यकता नहीं है , लेकिन लाभ बहुत बड़ा है।

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


43
जोएल: "अब तक हमें कभी कोई समस्या नहीं हुई।" अब तक, मैंने कभी भी लैंप-पोस्ट में कदम नहीं रखा है। लेकिन मुझे अभी भी लगता है कि सीट बेल्ट पहनना एक अच्छा विचार है ;-)
टोनी एंड्रयूज

2
हो सकता है कि आपको कभी समस्या न हो, लेकिन यह हो सकता है ... अधिकांश डेटाबेस एक कन्वेंशन का उपयोग करते हैं जैसे id_xxx जो बिल्कुल वैसा ही है जैसे कि ixXXX
FerranB

1
@Joel: नियमों के प्रवर्तन के स्थान पर नामकरण परंपराएं? जब आप इस पर हों, तब भी आप टाइप कर सकते हैं।
जौलम

8
@ एरिक: आप यहां फॉग क्रीक को सॉफ्टवेयर डेवलपमेंट के अवतार के रूप में रख रहे हैं। अगर आपने कहा "न्यूयॉर्क शहर की एक कंपनी के पास उनके db में विदेशी चाबियां नहीं हैं ..." हम सब कहेंगे "और?"
जुल्फिकार

3
एरिक: फोगबुग विदेशी कुंजी के लिए एक नामकरण सम्मेलन का उपयोग करता है। उदाहरण के लिए ixBug को टेबल बग की प्राथमिक कुंजी में एक इंडेक्स समझा जाता है। अब तक हमें कभी कोई समस्या नहीं हुई। - जोएल स्पॉल्स्की
सैम भगवा

40

एफके बाधाओं के बिना एक डेटाबेस स्कीमा सीट बेल्ट के बिना ड्राइविंग के समान है।

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

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

आपको क्यों लगता है कि इसे आधुनिक भाषाओं के भीतर भी कठिन और अस्वीकार्य बना दिया गया है ?


2
एन्कैप्सुलेशन और एफके / पीके संबंधों के बीच एक अच्छा सादृश्य के लिए +1।
जुल्म

21

हाँ।

  1. वे आपको ईमानदार रखते हैं
  2. वे नए डेवलपर्स को ईमानदार रखते हैं
  3. तुम कर सकते हो ON DELETE CASCADE
  4. वे आपको उन अच्छे आरेखों को उत्पन्न करने में मदद करते हैं जो स्वयं तालिकाओं के बीच के लिंक की व्याख्या करते हैं

1
ईमानदारी से आपका क्या मतलब है?
dspacejs

मुझे लगता है कि गर्भाधान के साथ ईमानदार। यह आपको त्वरित और लंगड़ा प्रोग्रामिंग करके डेटा के साथ धोखा करने से रोकता है।
ऑर्स्टे विरों

13

मान लीजिए कि एक प्रोग्रामर वास्तव में पहले से ही सही तरीके से ऐसा कर रहा है

ऐसा तर्क देना मुझे एक बहुत बुरा विचार लगता है; सामान्य सॉफ्टवेयर में अभूतपूर्व रूप से छोटी गाड़ी है।

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

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


2
अच्छी बात है, "ओन [रिलेशनशिप]" या कुछ अन्य कीवर्ड के साथ दो तालिकाओं को जोड़ना अच्छा होगा और डीबी को यह बताना होगा कि कॉलम क्या शामिल हैं। बहुत उचित लगता है।
जुल्म

13

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

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

@ जॉन - अन्य डेटाबेस विदेशी कुंजी के लिए स्वचालित रूप से अनुक्रमित बना सकते हैं, लेकिन SQL सर्वर नहीं करता है। SQL सर्वर में, विदेशी कुंजी संबंध केवल बाधाएँ हैं। आपको अपनी अनुक्रमणिका को विदेशी कुंजियों पर अलग से परिभाषित करना चाहिए (जो लाभ की हो सकती है।)

संपादित करें: मैं यह जोड़ना चाहूंगा कि IMO, ON DELETE या ON UPDATE CASCADE के समर्थन में विदेशी कुंजी का उपयोग जरूरी नहीं है। व्यवहार में, मैंने पाया है कि डेटा के संबंध के आधार पर डिलीट पर कैस्केड को सावधानी से माना जाना चाहिए - जैसे कि आपके पास एक प्राकृतिक अभिभावक-बच्चा है जहां यह ठीक हो सकता है या संबंधित तालिका लुकअप मानों का एक सेट है। कैस्केड अद्यतनों का उपयोग करने का अर्थ है कि आप एक तालिका की प्राथमिक कुंजी को संशोधित करने की अनुमति दे रहे हैं। उस मामले में, मेरे पास एक सामान्य दार्शनिक असहमति है कि एक मेज की प्राथमिक कुंजी को बदलना नहीं चाहिए। कुंजी स्वाभाविक रूप से स्थिर होनी चाहिए।


9

एक विदेशी कुंजी के बिना आप कैसे बताते हैं कि विभिन्न तालिकाओं में दो रिकॉर्ड संबंधित हैं?

मुझे लगता है कि आप जो संदर्भित कर रहे हैं वह संदर्भात्मक अखंडता है, जहां बच्चे के रिकॉर्ड को मौजूदा मूल रिकॉर्ड आदि के बिना बनाने की अनुमति नहीं है। इन्हें अक्सर विदेशी कुंजी बाधाओं के रूप में जाना जाता है - लेकिन विदेशी कुंजी के अस्तित्व के साथ भ्रमित नहीं होना चाहिए प्रथम स्थान।


8

क्या विदेशी चाबियां नहीं होने का कोई फायदा है? जब तक आप एक भद्दा डेटाबेस का उपयोग कर रहे हैं, तब तक FKs सेट करने के लिए कठिन नहीं हैं। तो उनसे बचने की आपकी नीति क्यों होगी? एक नामकरण सम्मेलन होना एक बात है जो कहता है कि एक कॉलम दूसरे का संदर्भ देता है, यह जानना एक और है कि डेटाबेस वास्तव में आपके लिए उस रिश्ते को सत्यापित कर रहा है।


8

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

मान लीजिए कि एक प्रोग्रामर वास्तव में पहले से ही सही तरीके से ऐसा कर रहा है, तो क्या हमें वास्तव में विदेशी कुंजी की अवधारणा की आवश्यकता है?

सैद्धांतिक रूप से, नहीं। हालांकि, बग के बिना सॉफ़्टवेयर का एक टुकड़ा कभी नहीं रहा है।

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

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

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

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

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


7

एफके बहुत महत्वपूर्ण हैं और हमेशा आपके स्कीमा में मौजूद होना चाहिए, जब तक कि आप ईबे नहीं हैं


2
यह लिंक वास्तव में बेहद आकर्षक है ... मैं वास्तव में अधिक जानकारी जानना चाहता हूं और मुझे अब ईबे का उपयोग करने से कुछ डर लग रहा है। अन्य लोगों के लिए: 4 वें प्रश्न पर क्लिक करके देखें कि वह अपने db संरचना के बारे में क्या कहता है। हालांकि पूरा साक्षात्कार देखने लायक है। यह भी ...unibrow
gloomy.penguin

6

मुझे लगता है कि कुछ एक ही बात है वैध बिंदुओं को सुनिश्चित करने के लिए कुछ बिंदु पर जिम्मेदार होनी चाहिए।

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

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

उस बिंदु पर, विदेशी कुंजियाँ वास्तव में निरर्थक हैं, क्योंकि वे आपको जिम्मेदारी को फिर से एक बिंदु पर ले जाने की अनुमति देते हैं।


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

5

विदेशी चाबियाँ किसी ऐसे व्यक्ति को अनुमति देती हैं जिसने आपके डेटाबेस को तालिकाओं के बीच संबंध निर्धारित करने से पहले नहीं देखा है।

अब सब कुछ ठीक हो सकता है, लेकिन सोचिए जब आपका प्रोग्रामर चलेगा और किसी और को लेना होगा तो क्या होगा।

विदेशी कुंजी उन्हें कोड की हजार लाइनों के माध्यम से फँसाने के बिना डेटाबेस संरचना को समझने की अनुमति देगा।


5

जहां तक ​​मुझे पता है, प्रोग्रामर को सही तरीके से डेटा में हेरफेर करने में मदद करने के लिए विदेशी कुंजियों का उपयोग किया जाता है।

जब प्रोग्रामर ऐसा करने में विफल हो जाता है, और कभी-कभी प्रोग्रामर की गड़गड़ाहट से बचाने के लिए FKs DBA को उपयोगकर्ताओं की फ़ुंबलिंग से डेटा अखंडता की रक्षा करने की अनुमति देता है ।

मान लीजिए कि एक प्रोग्रामर वास्तव में पहले से ही सही तरीके से ऐसा कर रहा है, तो क्या हमें वास्तव में विदेशी कुंजी की अवधारणा की आवश्यकता है?

प्रोग्रामर नश्वर और पतनशील होते हैं। एफके घोषणात्मक हैं जो उन्हें पेंच करना कठिन बनाता है।

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

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


यह एक बेहतरीन जवाब है।
दान लूग

4

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

यह एक FK बाधा त्रुटि डिबग करने के लिए इतना अच्छा है की तुलना में एक को हटाना है कि आपके आवेदन को तोड़ दिया है।


4

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


3

मैं इसके बारे में लागत / लाभ के बारे में सोचता हूं ... MySQL में , एक बाधा जोड़ना DDL की एक अतिरिक्त पंक्ति है । यह महत्वपूर्ण शब्दों का एक मुट्ठी भर और विचार के कुछ सेकंड है। मेरी राय में यही एकमात्र "लागत" है ...

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

थोड़ा समय लगता है कि आपके सिर में पहले से ही क्या है, जब आप चीजों को एक साथ रख रहे हैं तो आप या किसी और को दु: ख के महीनों या वर्षों तक सड़क पर नीचे रख सकते हैं।

प्रश्न:

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

यह थोड़ा भरा हुआ है। "विदेशी कुंजी" के स्थान पर टिप्पणी, इंडेंटेशन या वैरिएबल नाम डालें ... यदि आप पहले से ही प्रश्न को पूरी तरह से समझते हैं, तो यह आपके लिए "कोई फायदा नहीं है"।


2

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

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

मुझे लगता है कि यह विकास की गति में व्यापार के लायक है। ज़रूर, आप उनके साथ जल्दी कोड कर सकते हैं और शायद यही कारण है कि कुछ लोग उनका उपयोग नहीं करते हैं। व्यक्तिगत रूप से मैंने NHibernate और कुछ विदेशी कुंजी बाधा के साथ कई घंटे मारे हैं जो कुछ ऑपरेशन करने पर क्रोधित हो जाते हैं। फिर भी, मुझे पता है कि समस्या क्या है इसलिए यह किसी समस्या से कम नहीं है। मैं सामान्य साधनों का उपयोग कर रहा हूं और इसके आसपास काम करने के लिए संसाधन हैं, संभवतः लोगों की मदद करने के लिए भी!

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


1

आप विदेशी चाबियों को एक बाधा के रूप में देख सकते हैं,

  • डेटा अखंडता बनाए रखने में मदद करें
  • दिखाएँ कि डेटा एक-दूसरे से कैसे संबंधित है (जो व्यावसायिक तर्क और नियमों को लागू करने में मदद कर सकता है)
  • यदि सही तरीके से उपयोग किया जाता है, तो उस दक्षता को बढ़ाने में मदद कर सकता है जिसके साथ डेटा तालिकाओं से प्राप्त किया जाता है।

1

वर्तमान में हम विदेशी कुंजियों का उपयोग नहीं करते हैं। और अधिकांश भाग के लिए हमें इसका पछतावा नहीं है।

कहा कि - हम कई कारणों से निकट भविष्य में उनका उपयोग शुरू करने की संभावना रखते हैं, दोनों समान कारणों से:

  1. आरेखण। किसी डेटाबेस के आरेख का उत्पादन करना बहुत आसान है यदि विदेशी कुंजी संबंध सही तरीके से उपयोग किए जाते हैं।

  2. उपकरण का समर्थन। विज़ुअल स्टूडियो 2008 का उपयोग करके डेटा मॉडल का निर्माण करना बहुत आसान है जो कि LINQ से SQL के लिए उपयोग किया जा सकता है अगर उचित विदेशी कुंजी संबंध हैं।

तो मुझे लगता है कि मेरी बात यह है कि हमने पाया है कि यदि हम बहुत सारे SQL काम कर रहे हैं (निर्माण क्वेरी, रन क्वेरी, blahblahblah) विदेशी कुंजी आवश्यक नहीं हैं। एक बार जब आप उपकरण का उपयोग करना शुरू कर देते हैं, हालांकि, वे बहुत अधिक उपयोगी हो जाते हैं।


1
मैं उन प्रणालियों पर काम करता हूं जो उनका उपयोग नहीं करते हैं। और मुझे इसका नियमित रूप से पछतावा है। मैंने और अधिक उदाहरण देखे हैं कि मैं गैर-संवेदी डेटा की गिनती कर सकता हूं जिसे उचित बाधाओं द्वारा रोका जा सकता था।
पुनरावर्ती

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

1

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

कोड में, हम आम तौर पर सिर्फ एक अपवाद कहीं फेंक देंगे - लेकिन SQL में , हम आम तौर पर "गलत" उत्तर प्राप्त करेंगे।

सिद्धांत रूप में, SQL सर्वर एक क्वेरी योजना के हिस्से के रूप में बाधाओं का उपयोग कर सकता है - लेकिन विभाजन के लिए चेक बाधाओं को छोड़कर, मैं यह नहीं कह सकता कि मैंने वास्तव में कभी देखा है।


विशिष्टता की कमी उच्च कार्डिनैलिटी का संकेत देती है जिसका उपयोग ऑप्टिमाइज़र द्वारा एक सम्मिलित तंत्र के चयन में किया जाता है।
पीटर

1

विदेशी कुंजियों को कभी भी स्पष्ट नहीं किया गया था (परियोजनाओं (व्यावसायिक अनुप्रयोगों और सामाजिक नेटवर्किंग वेबसाइटों) में घोषित (प्रमुख कुंजी सारणी (स्तंभ)) जो मैंने काम किया था।

लेकिन हमेशा एक तरह के नामकरण स्तंभों का अधिवेशन होता था जो विदेशी कुंजी होते थे।

यह डेटाबेस के सामान्यीकरण के साथ जैसा है - आपको यह जानना होगा कि आप क्या कर रहे हैं और उसके परिणाम क्या हैं (मुख्य रूप से प्रदर्शन)।

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

इसके अलावा विभिन्न डेटाबेस इंजन विदेशी कुंजी को एक अलग तरीके से सेवा दे सकते हैं, जिससे प्रवास के दौरान सूक्ष्म कीड़े हो सकते हैं।

डिलीट क्लाइंट के सभी ऑर्डर और इनवॉइस को डिलीट ऑन कैसटैड के साथ हटा देना अच्छा दिखने का सही उदाहरण है, लेकिन गलत डिज़ाइन किया गया, डेटाबेस स्कीमा।


0

हाँ। DELETE [RESTRICT | CASCADE] डेवलपर्स को डेटा को साफ रखते हुए, डेटा को फंसे रखने से रोकता है। मैं हाल ही में रेल डेवलपर्स की एक टीम में शामिल हुआ, जिन्होंने विदेशी बाधाओं जैसे डेटाबेस बाधाओं पर ध्यान केंद्रित नहीं किया।

सौभाग्य से, मुझे ये मिले: http://www.redhillonrails.org/foreign_key_associations.html - रेल्स पर रूबी पर रेडहिल प्लग-इन कॉन्फ़िगरेशन शैली पर कन्वेंशन का उपयोग करके विदेशी कुंजी उत्पन्न करते हैं। Product_id के साथ एक प्रवासन उत्पाद तालिका में आईडी के लिए एक विदेशी कुंजी बनाएगा ।

रेडहिल पर अन्य महान प्लग-इन की जांच करें , जिसमें लेनदेन में लिप्त माइग्रेशन शामिल हैं।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.