मुझे नहीं लगता कि आपको रिश्तों में कोई समस्या है। मुझे लगता है कि इसके बजाय समस्या यह है कि प्रत्येक तालिका के लिए सरोगेट कुंजी (यानी 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 कुछ भी नहीं कर सकता है, लेकिन मान लें कि यह एक सही तथ्य दिया गया है।