SQL में एक शून्य या एक संबंध को लागू करना


11

हम कहते हैं कि मैं एक परिदृश्य के लिए एक डेटाबेस डिजाइन कर रहा हूं जहां एक-से-शून्य या एक (1-0..1) संबंध मौजूद है। उदाहरण के लिए:

  • उपयोगकर्ताओं का एक समूह है , और कुछ उपयोगकर्ता ग्राहक भी हो सकते हैं ।

इस प्रकार, मैंने दो समान तालिकाओं का निर्माण किया, usersऔर customers, लेकिन ...

… दिए गए SQL प्लेटफ़ॉर्म में इस स्थिति को दर्शाने और कार्यान्वित करने का सबसे अच्छा तरीका क्या है? मैंने दो संभावित समाधानों पर विचार किया है:

  1. में usersमेज, जोड़ने customerस्तंभ जो करने के लिए या तो एक विदेशी कुंजी संदर्भ हो सकता है customersया एक NULLनिशान।

  2. में customersमेज, एक शामिल userस्तंभ (एक साथ सेट UNIQUEजो की ओर इशारा करता बाधा) usersतालिका।

मैंने पहले से ही कुछ मंचों में एक समान प्रश्न पूछा है, लेकिन उत्तर मूल रूप से "आपको जो कुछ भी चाहिए", "जो भी आपको सुविधाजनक लगता है" है। मुझे इस तरह का जवाब पसंद नहीं है। मैं इसके बजाय डीबी सिद्धांत का एक गंभीर टुकड़ा चाहता हूं, एक अच्छी तरह से स्थापित उत्तर। मैं 1-0 के बारे में कहां पढ़ सकता हूं।

जवाबों:


10

मुझे डीबी सिद्धांत का एक गंभीर टुकड़ा चाहिए

आधुनिक संबंधपरक सिद्धांत नल को खारिज कर देता है , जो आपके विकल्प को तुरंत अमान्य कर देगा। हालांकि, इस स्ट्रोमैन को डिफ़ॉल्ट मान के साथ डिफ़ॉल्ट नल को बदलकर समाप्त किया जा सकता है। उदाहरण के लिए एक 'डमी' ग्राहक केवल स्पष्ट रूप से मॉडल बनाने के लिए "ग्राहक नहीं है" पत्र - व्यवहार।

मुझे लगता है कि आपका विकल्प 2 सबसे सैद्धांतिक रूप से ध्वनि है, क्योंकि संशोधित विकल्प 1 के विपरीत, संबंध छठे सामान्य रूप (6NF) में हो सकते हैं, प्रक्षेपण-सामान्य रूप में शामिल हो सकते हैं और उच्चतम सामान्य रूप प्राप्य हो सकता है।

मैंने अंगूठे के एक डिजाइन नियम के बारे में भी सुना है जिसमें कहा गया है कि एक संबंध को एक इकाई या संस्थाओं के बीच संबंध को मॉडल करना चाहिए लेकिन दोनों कभी नहीं, जो मुझे समझदार लगता है। फिर से, यह विकल्प 2 को पसंद करेगा। हालांकि, मैंने कई साल पहले अंगूठे के इस नियम के बारे में सुना था, याद नहीं है कि कहां और कोई गंभीर सैद्धांतिक आधार नहीं दे सकता है (6NF के अलावा अन्य जैसा कि ऊपर बताया गया है)।


2

आपको भाग में सही उत्तर दिया गया है। असली जवाब आपके डेटा मॉडल से आता है और यह सामान्य कैसे हुआ। एक कुंजी यह है कि आप रिश्ते में कैसे आते हैं:

  • customersतालिका के लिए विचार क्षेत्रों के एक नंबर के होते हैं usersतालिका जो ग्राहक अवधारणा के हैं, और जब तक उपयोगकर्ता यह भी एक ग्राहक (उपयोगकर्ता की उप-प्रकार) है अशक्त हैं। इस मामले में customersतालिका तालिका से प्राथमिक कुंजी विरासत में मिली है users। (यह कई उप-प्रकारों के लिए संभव है जो ओवरलैप कर सकते हैं या नहीं।)

  • customersतालिका ग्राहक अवधारणा से संबंधित क्षेत्रों के एक नंबर के होते हैं, लेकिन जरूरी नहीं कि उपयोगकर्ता अवधारणा। ग्राहक एक मजबूत तालिका है और उपयोगकर्ता अवधारणा पर निर्भर नहीं है। ( usersतालिका को हटाने से ग्राहकों की तालिका के डिज़ाइन पर महत्वपूर्ण प्रभाव नहीं पड़ेगा।) इस मामले में ग्राहकों की तालिका को अपनी प्राथमिक कुंजी मिलती है।

आपके पास जो विकल्प हैं उनमें से किसी एक के लिए एक विशेष मामला है जहां ऊपरी सीमा 1 है। दोनों पक्षों से इस पर विचार करें: क्या एक उपयोगकर्ता के लिए कई ग्राहक, या एक ग्राहक के लिए कई उपयोगकर्ता होना संभव होगा? यदि हां, तो आपको अपने डेटा को फिर से तैयार करना होगा।

तालिका में user-idविदेशी कुंजी जोड़ना customersएक बेहतर विकल्प माना जा सकता है क्योंकि सही ढंग से एक से कई (ऊपरी सीमा 1) संबंधों को मैप करता है और एक अशक्त क्षेत्र से बचा जाता है। ऊपरी सीमा को लागू करने के लिए विदेशी कुंजी सूचकांक का विशिष्ट होना आवश्यक है। यह स्वचालित रूप से घटित होगा यदि प्राथमिक कुंजी है user-id

तालिका में customer-idवैकल्पिक विदेशी कुंजी के रूप में जोड़ना usersरिश्ते में 1 की ऊपरी सीमा को लागू करता है लेकिन निर्भरता को उलट देता है।


1

क्या आपने थोड़ा अधिक जटिल लेकिन लचीला दृष्टिकोण माना है। मूल तालिका "व्यक्ति" (या "संस्था" पर निर्भर करता है कि आप कितने जटिल होना चाहते हैं)। फिर ग्राहक तालिका और उपयोगकर्ता तालिका प्रत्येक व्यक्ति तालिका के लिए एक FK है। व्यक्ति तालिका में व्यक्तिगत विवरण होते हैं, जबकि ग्राहक और उपयोगकर्ता तालिका में केवल उपयोगकर्ता या ग्राहक से संबंधित विशेषताएँ होती हैं। अक्सर पते (ईमेल और घोंघा मेल), फोन नंबर, आदि को अलग-अलग तालिकाओं में कई-से-कई स्थितियों की अनुमति के लिए मैपिंग टेबल के साथ दर्शाया जाता है। यह एक अपेक्षाकृत सामान्य मॉडल है जिसे आप कई संदर्भ साइटों पर पा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.