मुझे नहीं लगता कि आपको रिश्तों में कोई समस्या है। मुझे लगता है कि इसके बजाय समस्या यह है कि प्रत्येक तालिका के लिए सरोगेट कुंजी (यानी Ids) का उपयोग करके परिणामस्वरूप डेटाबेस उन श्रमिकों को सम्मिलित करने से रोकने में असमर्थ है जिनके विभाग एक कंपनी के हैं जबकि वर्गीकरण दूसरे का है और इसके विपरीत। इसे समझने का एक अच्छा तरीका ईआर डायग्रामिंग टूल का उपयोग करके स्कीमा की कल्पना करना है। मैं Oracle डेटा मॉडलर टूल का उपयोग करूंगा जो एक मुफ्त डाउनलोड है।
ईआर डायग्राम
जैसा कि यह खड़ा है, आपके पास 2 कंपनियां हो सकती हैं - कहते हैं IBM
और Microsoft
। IBM
एक Software Development
विभाग हो सकता है , और Microsoft का एक Desktop Software
विभाग हो सकता है । IBM का Software Engineer
वर्गीकरण हो सकता है, और Microsoft का Software Developer
वर्गीकरण हो सकता है। अब, क्योंकि आपके पास सरोगेट कुंजी है Department
और Classification
तथ्य यह Software Development
है कि एक IBM
विभाग है और भविष्य के बाल संबंधों के लिए Desktop Software
एक Microsoft
विभाग खो गया है। यही हाल इनका भी है Classification
। इसलिए गलती से असाइन करना आसान है Harlan Mills
, जो विभाग IBM
में एक कर्मचारी Software Development
है, Software Developer
जिसका एक वर्गीकरण एक हैMicrosoft
वर्गीकरण! इसी तरह, कार्यकर्ता को सही वर्गीकरण और गलत विभाग दिया जा सकता है! यहाँ एक आरेख है जो पहला उदाहरण दिखा रहा है:
1 Ids प्रतिनिधित्व करते हैं IBM
, और 2 Ids प्रतिनिधित्व करते हैं Microsoft
। मैं लाल परिदृश्य में प्रकाश डाला गया है जहां Harlan Mills
और Bill Gates
गलत विभागों, जो 10 विभाग 200 वर्गीकरण ईद और इसके विपरीत करने के लिए जुड़े ईद द्वारा कल्पना है को सौंपा है।
हल करने के लिए विकल्प
तो उसे होने से रोकने के लिए क्या विकल्प हैं? दो तात्कालिक विकल्प हैं। सबसे पहले यह महसूस करना है कि प्रत्येक तालिका के लिए एक सरोगेट कुंजी का उपयोग करके यह समस्या मौजूद है और इसे सत्यापित करने के लिए अतिरिक्त प्रोग्रामिंग पेश नहीं करता है। यह आवेदन में किया जा सकता है, लेकिन यदि आवेषण और अद्यतन आवेदन के बाहर हो सकते हैं तो गलत संघटन अभी भी हो सकते हैं। एक बेहतर तरीका एक ट्रिगर बनाना होगा जो इंसर्ट पर आग लगाता है और कर्मचारी को यह सुनिश्चित करने के लिए अपडेट करता है कि असाइन किया गया डिपार्टमेंट उसी कंपनी का है जिसे असाइन किया गया वर्गीकरण है, और अगर इन्सर्ट या अपडेट फेल नहीं हुआ है।
दूसरा विकल्प है कि हर टेबल के लिए सरोगेट कीज का इस्तेमाल न किया जाए । इसके बजाय, केवल के लिए किराए की कुंजी का उपयोग Company
तालिका, जो मौलिक है और कोई माता-पिता है, और फिर बनाने की पहचान करने के लिए रिश्तों को Department
और Classification
बच्चे टेबल। Department
और Classification
तालिकाओं अब की एक पी है Company Id
के साथ साथ एक अनुक्रम संख्या या नाम उन्हें अलग करने के लिए। फिर, से रिश्ते Department
और Classification
करने के लिए Worker
भी हो जाते हैं identifying
और इस तरह के पी Worker
हो जाता है Company Id
, के साथ साथ Department Number
(मैं इस उदाहरण में एक क्रम संख्या का उपयोग कर रहा), के साथ साथ Classification Number
। परिणाम वहाँ केवल है one
Company Id
में Worker
मेज। अब ए को असाइन करना असंभव हैWorker
एक करने के लिए Department
एक में Company
और एक को Classification
दूसरे में Company
।
यह असंभव क्यों है? यह असंभव है क्योंकि स्कीमा Worker
और के बीच संदर्भात्मक अखंडता को लागू करता है Department
और Classification
। एक प्रयास एक डालने के लिए किया जाता है Worker
एक के लिए Department
एक में Company
और एक और Classification
एक और की, संयोजन है कि इसी माता पिता तालिका में मौजूद नहीं है एक रेफेरेंन्शिअल सत्यनिष्ठा उल्लंघन को गति प्रदान और डालने से काम नहीं चलेगा होगा।
यहाँ दूसरे विकल्प के कार्यान्वयन का एक अद्यतन आरेख है:
पसंदीदा विकल्प
दो विकल्पों में से, मैं बिल्कुल दूसरे को पसंद करता हूं - पहचानने वाले संबंधों और कैस्केडिंग कुंजी का उपयोग करते हुए - दो कारणों से। सबसे पहले, यह विकल्प बिना किसी अतिरिक्त प्रोग्रामिंग के वांछित नियम को प्राप्त करता है। ट्रिगर विकसित करना तुच्छ नहीं है। इसे कोडित, परीक्षण और रखरखाव किया जाना चाहिए। ट्रिगर को सुनिश्चित करना इष्टतम है, ताकि प्रदर्शन प्रभावित न हो, यह भी तुच्छ नहीं है। पुस्तक अनुप्रयुक्त गणित डेटाबेस पेशेवरों के लिए इस तरह के एक समाधान की जटिलता पर विस्तार का एक बहुत प्रदान करता है। दूसरा, नियम का अर्थ है कि एक विभाग और एक वर्गीकरण के संदर्भ के बाहर मौजूद नहीं हो सकता है Company
, और इसलिए स्कीमा अब अधिक सटीक रूप से वास्तविक दुनिया को दर्शाता है।
यह एक महान प्रश्न है क्योंकि यह बिल्कुल दिखाता है कि क्यों हर तालिका को संभालने के लिए एक सरोगेट कुंजी की आवश्यकता होती है एक बुरा विचार है। फैबियन पास्कल के पास इस विषय पर एक उत्कृष्ट ब्लॉग पोस्ट है जिसमें दिखाया गया है कि न केवल एक सरोगेट कुंजी डेटा अखंडता के दृष्टिकोण से एक बुरा विचार हो सकती है, इसके परिणामस्वरूप कुछ पुनर्प्राप्ति धीमी हो सकती है।शारीरिक स्तर पर ठीक-ठाक होने के कारण जॉइन की आवश्यकता होती है, चाबी ठीक से कैस्केड की गई थी, अनावश्यक होगी। एक और दिलचस्प विषय यह प्रश्न बताता है कि एक डेटाबेस यह सुनिश्चित नहीं कर सकता है कि इसमें डाला गया सभी डेटा वास्तविक दुनिया के संबंध में सटीक है। इसके बजाय, यह केवल यह सुनिश्चित कर सकता है कि इसमें डाला गया डेटा उसके द्वारा घोषित नियमों के अनुरूप है। इस मामले में हम यह सुनिश्चित करने के लिए कैस्केडिंग कुंजी दृष्टिकोण का उपयोग करके सबसे अच्छा संभव कर सकते हैं कि डीबीएमएस उस नियम के संबंध में डेटा को सुसंगत रख सकता है जिसे किसी Worker
दिए गए की Company
जरूरत है Classification
और Department
उसी को सौंपा जाना चाहिए Company
। लेकिन, अगर वास्तविक दुनिया Microsoft
में एक विभाग कहा जाता है, Desktop Software
लेकिन डेटाबेस का उपयोगकर्ता विभाग के बजाय जोर देता हैSoftware Development
DBMS कुछ भी नहीं कर सकता है, लेकिन मान लें कि यह एक सही तथ्य दिया गया है।