दो टेबल हैं:
- उपयोगकर्ता
- पता
उपयोगकर्ता में पते का संदर्भ होता है।
पता में कॉलम CreatedBy और ModifiedBy शामिल हैं, जो उपयोगकर्ता के लिए संदर्भ है।
चक्रीय निर्भरता से बचने के लिए मैं इस डेटाबेस को कैसे डिजाइन करूं?
दो टेबल हैं:
उपयोगकर्ता में पते का संदर्भ होता है।
पता में कॉलम CreatedBy और ModifiedBy शामिल हैं, जो उपयोगकर्ता के लिए संदर्भ है।
चक्रीय निर्भरता से बचने के लिए मैं इस डेटाबेस को कैसे डिजाइन करूं?
जवाबों:
टिप्स और ट्रिक्स (शामिल बाधाओं में कमी) के लिए खोज करने के बजाय, मैं सुझाव दूंगा कि आप बस इस "रेफरेंस लॉक" से अपना रास्ता डिज़ाइन करें - इसलिए कुछ इस तरह आज़माएँ:
तथ्य
(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
तार्किक
जहां तक अनिवार्य पते का संबंध है, आवेदन परत पर सत्यापित करें और लोडिंग स्टेटमेंट को लेनदेन में लपेटें - इस तरह से आपको सभी या कुछ भी नहीं मिलेगा।
आपके पास नीचे के रूप में 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 भी लागू कर सकते हैं।