चक्रीय निर्भरता से बचने के लिए इस डेटाबेस को कैसे डिज़ाइन करें?


12

दो टेबल हैं:

  1. उपयोगकर्ता
  2. पता

उपयोगकर्ता में पते का संदर्भ होता है।

पता में कॉलम CreatedBy और ModifiedBy शामिल हैं, जो उपयोगकर्ता के लिए संदर्भ है।

चक्रीय निर्भरता से बचने के लिए मैं इस डेटाबेस को कैसे डिजाइन करूं?


4
क्या आप सुनिश्चित हैं कि ModifiedBy डेटाबेस उपयोगकर्ता के लिए एक संदर्भ नहीं है जिसने एप्लिकेशन उपयोगकर्ता (जो उपयोगकर्ता तालिका में निवास करेगा) के बजाय परिवर्तन किया है? किसी भी तरह से, यह वास्तव में कोई फर्क नहीं पड़ता। मैं नहीं देखता कि वास्तविक समस्या क्यों है?
फिलो

कौन सा पहले बनाएंगे। जैसा कि CreatedBy ANd Modifiedby एक डेटा है। और उपयोगकर्ता तालिका में शून्य .. चिकन-अंडा समस्या के रूप में पता नहीं होना चाहिए। जैसा कि मैंने इसे एक नई तालिका UserAddress बनाकर हल किया है जिसमें उपयोगकर्ता और पते के लिए संदर्भ शामिल है
शशि

2
यदि आपका DBMS उनका समर्थन करता है, तो आप हमेशा स्थगित बाधाओं का उपयोग कर सकते हैं।
कॉलिन टी हार्ट

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

जवाबों:


7

टिप्स और ट्रिक्स (शामिल बाधाओं में कमी) के लिए खोज करने के बजाय, मैं सुझाव दूंगा कि आप बस इस "रेफरेंस लॉक" से अपना रास्ता डिज़ाइन करें - इसलिए कुछ इस तरह आज़माएँ:


तथ्य

  • उपयोगकर्ता(UserID) मौजूद है।
  • पता उपयोगकर्ता(AddressID) द्वारा बनाया गया था ।(UserID)
  • दिनांक(AddressID) पर पता बनाया गया था ।(DateCreated)
  • पता(AddressID) अंतिम बार उपयोगकर्ता द्वारा दिनांक(UserID) पर संशोधित किया गया था ।(ModifiedOn)
  • उपयोगकर्ता दिनांक के बाद (UserID)से पते पर रहता है ।(AddressID)(ValidFrom)

प्रतिबन्ध

  • Each पता exactly one उपयोगकर्ता द्वारा बनाया गया था । It is possible that more than one पता the same उपयोगकर्ता द्वारा बनाया गया था ।

  • Each exactly one दिनांक पर पता बनाया गया था । दिनांक पर It is possible that more than one पता बनाया गया था ।the same

  • For each पता and दिनांक , that पता at most one उपयोगकर्ता द्वारा that दिनांक पर संशोधित किया गया था ।

  • For each उपयोगकर्ता and दिनांक , that उपयोगकर्ता दिनांक के बाद से at most one पते का निवास करता है ।that


तार्किक

यहाँ छवि विवरण दर्ज करें


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


5

आपके पास नीचे के रूप में 2 कार्यों में चक्रीय निर्भरता बनाने के अलावा कोई विकल्प नहीं है क्योंकि जब आप पहली बार बनाते हैं तो एक तालिका मौजूद नहीं होती है।

CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));

ALTER TABLE A ADD B_FK INT;

यदि आप चक्रीय निर्भरता से बचना चाहते हैं। फिर आपको एक संदर्भ बाधा दूर करने की आवश्यकता है या आप एक तरह से DELETE और UPDATE CASCADE संदर्भ जोड़ सकते हैं। यदि आपका तर्क कुछ जटिल है, तो आप TRIGGER भी लागू कर सकते हैं।


1
बाधाओं को हटाने से परिभाषा से चक्रीय निर्भरता को हटा दिया जाता है, लेकिन डिजाइन नहीं। आप पिछली बार बनाए गए या संशोधित किए गए उपयोगकर्ता आईडी और एड्रेसआईडी को रिकॉर्ड करने के लिए एक इवेंट टेबल जोड़ सकते हैं, लेकिन यह निर्भरता को केवल एक कदम दूर ले जाता है। यदि उपयोगकर्ता तालिका में CreatedBy और ModifiedBy कॉलम हैं, तो दूसरे तरीके से जा रहे हैं, चक्रीय निर्भरता एक तालिका में मौजूद होगी। यह एक पर्यवेक्षक स्तंभ के साथ एक कर्मचारी तालिका के समान है जहां पर्यवेक्षक भी एक कर्मचारी है। जैसा कि फिल ने संकेत दिया - समस्या नहीं है।
लीघ रिफ़ेल

@LeighRiffel मैं सहमत हूँ। लेकिन आपके द्वारा प्रस्तावित घटना तालिका वास्तव में सभी चक्रीय निर्भरता को हटा देती है।
ypercube y

@ypercube वास्तव में यह करता है; यकीन नहीं होता कि मैं कैसे उस तार को पार कर गया। यह स्पष्ट करने के लिए कि आपको चक्रीय निर्भरता को दूर करने के बावजूद भी शायद एक इवेंट टेबल नहीं बनाना चाहिए।
लीघ रिफ़ेल

वैसे भी, मुझे नहीं लगता कि यह जवाब समस्या को संबोधित करता है। सवाल (मुझे लगता है) यह है कि चक्रीय पथ से कैसे बचा जाए, न कि पहली जगह में चक्रीय पथ के साथ एफके कैसे बनाएं।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.