sql - एक पारस्परिक निर्भरता के साथ क्या गलत है?




database database-design (4)

3 एनएफ व्यक्त करने का एक तरीका है:

सभी विशेषताओं को कुंजी, पूरी कुंजी और कुंजी के अलावा कुछ भी नहीं होना चाहिए।

पारगमन निर्भरता एक्स-> वाई-> जेड उस सिद्धांत का उल्लंघन करता है, जिससे डेटा अनावश्यकता और संभावित संशोधन विसंगतियों का कारण बनता है।

आइए इसे तोड़ दें:

  1. परिभाषा के अनुसार , एक कार्यात्मक निर्भरता एक्स-> वाई-> जेड भी संक्रमणीय होने के लिए , एक्स <-Y को पकड़ना नहीं चाहिए।
  2. यदि वाई एक कुंजी था, एक्स <-Y पकड़ लेगा, तो वाई एक कुंजी नहीं हो सकता है। (Footnote1)
  3. चूंकि वाई कुंजी नहीं है, इसलिए किसी भी दिए गए वाई को कई पंक्तियों में दोहराया जा सकता है।
  4. वाई-> जेड का तात्पर्य है कि एक ही वाई को पकड़ने वाली सभी पंक्तियों में भी वही ज़ेड होना चाहिए। (FOOTNOTE2)
  5. कई पंक्तियों में वही (वाई, जेड) टुपल दोहराए जाने से सिस्टम को कोई उपयोगी जानकारी नहीं मिलती है। यह अनावश्यक है

संक्षेप में, चूंकि वाई एक कुंजी नहीं है और वाई-> जेड, हमने 3 एनएफ का उल्लंघन किया है।

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

दूसरी ओर, यदि एक्स <-Y पकड़ता है (यानी एक्स-> वाई-> जेड संक्रमणीय नहीं है), तो हम एक ही टेबल को बनाए रख सकते हैं, जहां एक्स और वाई दोनों कुंजी हैं। इस परिदृश्य में ज़ेड को अनावश्यक रूप से दोहराया नहीं जाएगा।

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

(FOOTNOTE2) परिभाषा के अनुसार , वाई-> जेड अगर, और केवल तभी, प्रत्येक वाई मान ठीक एक जेड मान से जुड़ा हुआ है।

उदाहरण:

मानते हैं कि प्रत्येक संदेश में बिल्कुल एक लेखक होता है और प्रत्येक लेखक के पास एक प्राथमिक ई-मेल होता है, उसी तालिका में संदेशों और उपयोगकर्ताओं का प्रतिनिधित्व करने का प्रयास करने से ई-मेल दोहराए जाते हैं:

MESSAGE                         USER    EMAIL
-------                         ----    -----
Hello.                          Jon     [email protected]
Hi, how are you?                Rob     [email protected]
Doing fine, thanks for asking.  Jon     [email protected]

(हकीकत में, यह MESSAGE_ID होगा, लेकिन हम यहां चीजों को सरल रखें।)

अब, क्या होता है यदि जॉन अपने ई-मेल को बदलने का फैसला करता है, "[email protected]" कहें? हमें दोनों जॉन की पंक्तियों को अपडेट करने की आवश्यकता होगी। अगर हम केवल एक अपडेट करते हैं, तो हमारे पास निम्न स्थिति है ...

MESSAGE                         USER    EMAIL
-------                         ----    -----
Hello.                          Jon     [email protected]
Hi, how are you?                Rob     [email protected]
Doing fine, thanks for asking.  Jon     [email protected]

... और हम अब नहीं जानते कि जॉन के कौन से ई-मेल सही हैं। हमने अनिवार्य रूप से डेटा खो दिया है!

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

हालांकि, अगर आप टेबल को विभाजित करते हैं ...

MESSAGE                         USER
-------                         ----
Hello.                          Jon 
Hi, how are you?                Rob 
Doing fine, thanks for asking.  Jon 

USER    EMAIL
----    -----
Jon     [email protected]
Rob     [email protected]

... अब केवल एक पंक्ति है जो जॉन के ई-मेल के बारे में जानता है, इसलिए अस्पष्टता असंभव है।

बीटीडब्ल्यू, यह सब डीआरवाई सिद्धांत की एक और अभिव्यक्ति के रूप में देखा जा सकता है।

मेरे डेटाबेस डिज़ाइन में कुछ ट्रांजिटिव निर्भरताएं हैं I मुझे अपने वरिष्ठ अधिकारियों ने बताया है कि ये बग का कारण बन सकते हैं। मुझे संसाधनों को ढूंढना मुश्किल लगता है जो मुझे बताएंगे कि इन निर्भरताओं के कारण बग का कारण बन जाएगा। वे किस तरह की समस्याएं पैदा करेंगे?

मैं इस तथ्य पर विवाद नहीं कर रहा हूं, सिर्फ यह जानने के लिए उत्सुक हूं कि वे किस प्रकार की समस्याएं पैदा कर सकते हैं।

अधिक जानकारी के लिए संपादित करें:

विकिपीडिया से:

पारस्परिक निर्भरता
एक संक्रमणीय निर्भरता एक अप्रत्यक्ष कार्यात्मक निर्भरता है, जिसमें से एक एक्स → जेड केवल एक्स → वाई और वाई → जेड के आधार पर।


इस लिंक पर एक नज़र डालें:

http://en.wikipedia.org/wiki/Transitive_dependency

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

किताबों से शीर्ष 1 लेखक_राष्ट्रीयता चुनें जहां लेखक = 'जुल्स वर्ने'

डेटाबेस शीर्ष 1 का चयन करने के तरीके के आधार पर मुझे एक अलग उत्तर मिल सकता है।


मैंने बस एक पोस्ट एक साथ रखा है जो बताता है कि क्यों पारस्परिक निर्भरता आम तौर पर एक बुरा विचार है: http://www.essentialsql.com/get-ready-to-learn-sql-11-database-third-normal-form-explained-in-simple-english/ डेटा- तीसरा- सामान्य-form- http://www.essentialsql.com/get-ready-to-learn-sql-11-database-third-normal-form-explained-in-simple-english/


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





transitive-dependency