database - रबन - संबंधपरक डेटाबेस प्रबंधन प्रणाली




क्या डेटाबेस कुंजी में विदेशी कुंजी वास्तव में आवश्यक हैं? (16)

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

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

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

प्रोग्रामर प्राणघातक और गिरने योग्य हैं। एफके घोषणात्मक हैं जो उन्हें खराब करने में कठोर बनाता है।

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

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

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

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


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

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

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

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


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

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

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

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


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

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


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

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

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

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


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


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

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

यह डेटाबेस सामान्यीकरण के समान है - आपको पता होना चाहिए कि आप क्या कर रहे हैं और इसके परिणाम क्या हैं (मुख्य रूप से प्रदर्शन)।

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

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

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


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

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

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

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


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

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

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

प्रश्न:

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

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


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

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

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


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


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


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

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


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


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

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

लेन-देन में लिपटे माइग्रेशन समेत RedHill में अन्य महान प्लग-इन देखें।


हाँ।

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




foreign-keys