डेटाबेस डिजाइन: एक ही टेबल पर कई रिश्तों के लिए दो 1


20

मुझे एक ऐसी स्थिति बनानी होगी, जहां मेरे पास एक टेबल हो Chequing_Account (जिसमें बजट, iban नंबर और खाते के अन्य विवरण शामिल हैं) जो कि दो अलग-अलग तालिकाओं से संबंधित होने के लिए है व्यक्ति और निगम दोनों जिसमें 0, 1 या कई चबाने वाले खाते हो सकते हैं।

दूसरे शब्दों में, एक ही तालिका Chequing खाते के साथ मेरे दो 1-टू-कई संबंध हैं

मैं इस समस्या के समाधान सुनना चाहूंगा जो सामान्यीकरण आवश्यकताओं का सम्मान करता है। अधिकांश समाधान जो मैंने सुना है वे हैं:

1) एक आम इकाई का पता लगाएं, जिसमें दोनों व्यक्ति और निगम संबंधित हैं और इसके और चेक्विंग_अक्वांट टेबल के बीच एक लिंक तालिका बनाते हैं, यह मेरे मामले में संभव नहीं है और भले ही मैं सामान्य समस्या को हल करना चाहता था और इस विशिष्ट उदाहरण को नहीं।

2) दो लिंक टेबल बनाएं PersonToChequingAccount और CorporationToChequingAccount जो चेकिंग अकाउंट्स के साथ दो संस्थाओं से संबंधित हैं। हालाँकि, मैं नहीं चाहता कि दो व्यक्तियों के पास एक ही चेक्विंग खाता हो, और मैं एक प्राकृतिक व्यक्ति और एक निगम को एक चेचिंग खाता साझा नहीं करना चाहता! इस छवि को देखें

http://i41.tinypic.com/35i6kbk.png

3) Chequing खाते में दो विदेशी कुंजियाँ बनाएँ जो निगम और प्राकृतिक व्यक्ति की ओर इशारा करती हैं, हालाँकि मैं इस तरह से लागू करना चाहूँगा कि एक व्यक्ति और एक कंपनी के कई खाते हो सकते हैं, हालाँकि मुझे मैन्युअल रूप से यह सुनिश्चित करना होगा कि प्रत्येक ChequingAccount पंक्ति के लिए दोनों संबंध इंगित करें। कॉरपोरेशन और प्राकृतिक व्यक्ति क्योंकि एक चेचक खाता या तो एक निगम या एक प्राकृतिक व्यक्ति का है। इस छवि को देखें

http://i40.tinypic.com/1rpv9z.png

क्या इस समस्या का कोई अन्य क्लीनर समाधान है?


आप जैसे एक के लिए होने के बारे में सोचा है OwnerTypeIDमें ChecquingAccount, तालिका के साथ 1=Corporationऔर 2=NaturalPerson? इस तरह आपको केवल तालिका OwnerIDमें एक की आवश्यकता होती है ChecquingAccount, जिसे आप साथ में अनुक्रमित कर सकते हैं OwnerTypeID
RoKa

मुझे न केवल यह जानने की आवश्यकता है कि यह एक निगम या प्राकृतिक व्यक्ति है, बल्कि संबंधित आईडी को भी जानना है, इसलिए मुझे एक आईडी नंबर की आवश्यकता है और न केवल 1 या 2 का मूल्य चाहिए! समाधान 3 जो मैंने यहां पाया है कि मेरे पास निगम या प्राकृतिक व्यक्ति के साथ आईडी वाले दो कॉलम हैं
dendini

2
हां, समाधान एक वैध विकल्प है। अधिकांश DBMS में आप यह लागू कर सकते हैं कि दो FK में से केवल एक चेक की कमी के साथ "सक्रिय" है: CHECK (CorporationID IS NOT NULL AND NaturalPersonID IS NULL OR CorporationID IS NULL AND NaturalPersonID IS NOT NULL)मैं समाधान 1 को अधिक पसंद करता हूं, हालांकि (लेकिन यह सिर्फ मेरे लिए है)। यह बहुत "क्लीनर" है।
ypercube y

हां, मैं समझता हूं, लेकिन आप ChecquingAccountतालिका में रिकॉर्ड कर सकते हैं OwnerTypeID=1और OwnerID=123, यह दर्शाता है कि यह एक प्रकार है Corporation, इसलिए तालिका 123में आईडी Corporation। OwnerTypeID आपको बताता है कि कौन सी तालिका है, और स्वामी तालिका में आपको ID बताता है।
RoKa

1
विकल्प # 1 असंभव कैसे है? शब्द "निगम" का मूल अर्थ "एक व्यवसाय है जो कानूनी रूप से एक व्यक्ति है," आखिरकार। इसे Customersटेबल कहो ।
जॉन ऑफ ऑल ट्रेड्स

जवाबों:


15

इस स्थिति को पूरी तरह से संभालने के लिए रिलेशनल डेटाबेस नहीं बनाए जाते हैं। आपको यह तय करना होगा कि आपके लिए सबसे महत्वपूर्ण क्या है और फिर अपना व्यापार बंद करें। आपके पास कई लक्ष्य हैं:

  • तीसरा सामान्य रूप बनाए रखें
  • संदर्भात्मक अखंडता बनाए रखें
  • बाधा को बनाए रखें कि प्रत्येक खाता किसी निगम या प्राकृतिक व्यक्ति का है।
  • बस और सीधे डेटा पुनर्प्राप्त करने की क्षमता को संरक्षित करें

समस्या यह है कि इनमें से कुछ लक्ष्य एक दूसरे के साथ प्रतिस्पर्धा करते हैं।

उप-टाइपिंग समाधान
आप एक उप-टाइपिंग समाधान चुन सकते हैं जहां आप एक सुपर-टाइप बनाते हैं जिसमें निगम और व्यक्ति दोनों शामिल होते हैं। इस सुपर-प्रकार में संभवतः उप-प्रकार के विभाजन की विशेषता (जैसे customer_type) की प्राकृतिक कुंजी की एक यौगिक कुंजी होगी । यह ठीक है जहां तक ​​सामान्यीकरण चला जाता है और यह आपको संदर्भात्मक अखंडता के साथ-साथ निगमों और व्यक्तियों को परस्पर अनन्य रूप से बाध्य करने की अनुमति देता है। समस्या यह है कि यह डेटा पुनर्प्राप्ति को और अधिक कठिन बना देता है, क्योंकि customer_typeजब आप खाता धारक से खाते में जुड़ते हैं तो आपको हमेशा उसके आधार पर शाखा लगाना पड़ता है । इसका शायद मतलब है कि UNIONआपकी क्वेरी में बहुत अधिक दोहराव वाले SQL का उपयोग करना और होना।

दो विदेशी कुंजी समाधान
आप एक समाधान चुन सकते हैं जहां आप अपनी खाता तालिका में दो विदेशी कुंजी रखते हैं, एक निगम और एक व्यक्ति। यह समाधान आपको संदर्भात्मक अखंडता, सामान्यीकरण और पारस्परिक विशिष्टता बनाए रखने की अनुमति देता है। इसमें उप-टाइपिंग समाधान के समान डेटा पुनर्प्राप्ति दोष भी है। वास्तव में, यह समाधान केवल उप-टाइपिंग समाधान की तरह है, सिवाय इसके कि आपको अपने शामिल होने के तर्क "जल्द" की शाखा लगाने की समस्या हो।

फिर भी, बहुत सारे डेटा मोडेलर इस समाधान को उप-टाइपिंग समाधान से हीन मानेंगे क्योंकि जिस तरह से पारस्परिक विशिष्टता बाधा लागू की जाती है। सब-टाइपिंग समाधान में आप पारस्परिक विशिष्टता को लागू करने के लिए कुंजियों का उपयोग करते हैं। दो विदेशी कुंजी समाधान में आप एक CHECKबाधा का उपयोग करते हैं। मैं कुछ लोगों को जानता हूं जिनके पास चेक बाधाओं के खिलाफ अनुचित पूर्वाग्रह है। ये लोग उस समाधान को पसंद करेंगे जो बाधाओं में बाधाओं को दूर रखता है।

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

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

आप इसलिए देख सकते हैं कि सभी नियमों का पालन करते हुए एक साफ-सुथरी डिज़ाइन का होना संभव नहीं है, जबकि एक ही समय में आपके डेटा को पुनः प्राप्ति के लिए सरल रखा जाए। आपको यह तय करना होगा कि आपके ट्रेड-ऑफ कहां होने वाले हैं।


मेरा समाधान # 2 आपके चार समूहों में से किसका है? "विघटित विभाजन विशेषता का समाधान" मेरे लिए बिल्कुल स्पष्ट नहीं है ..
dendini

@ डेंडिनी - आप समाधान नंबर 2 मेरे द्वारा बताए गए किसी भी समाधान के साथ फिट नहीं हैं। ऐसा इसलिए है क्योंकि यह एक कानूनी इकाई से संबंधित खाते की आवश्यकता के साथ फिट नहीं है। जिस तरह से आपने मध्यवर्ती तालिकाओं की प्राथमिक कुंजियों को परिभाषित किया है, वे कई-से-कई चौराहे हैं। यदि प्राथमिक कुंजी बस थी corporation_id और person_idतब आपके पास अनिवार्य रूप से उप-टाइपिंग समाधान होगा, सिवाय इसके कि सुपर-टाइप टेबल को दो में विभाजित किया गया होगा और विदेशी कुंजी को उल्टा कर दिया गया होगा, इसलिए लोग कई खाते नहीं रख सकते हैं। इस तरह का उद्देश्य पराजित करता है।
जोएल ब्राउन

महान व्याख्या। @JoelBrown, क्वेरी के संदर्भ में "दो विदेशी कुंजी" समाधान के प्रदर्शन निहितार्थ क्या हैं? इसके अलावा, यह देखते हुए कि 2 के बजाय, 6 या अधिक विदेशी चाबियाँ हो सकती हैं: क्या आप अभी भी इस दृष्टिकोण की सिफारिश करेंगे या एक अलग की ओर झुकाव करेंगे?
आमदेव गेलार्डो

1
@AmadeoGallardo जवाब "यह निर्भर करता है" है। एक कुंजी के खिलाफ क्वेरी करना हमेशा बहुत ही कुशल होता है, क्योंकि आप आमतौर पर कम से कम एक इंडेक्स स्कैन पर भरोसा कर सकते हैं, अगर यह एक खोज नहीं है, और ये त्वरित संचालन हैं। मुद्दा तब बनता है जब आप दो विदेशी कुंजियों के समाधान में दोनों कुंजियों की क्वेरी करते हैं। यहां आप क्वेरी ऑप्टिमाइज़र से एक / या ऑपरेशन करने के लिए कह रहे हैं। सबसे अच्छा तो यह क्वेरी की लागत को दोगुना कर देगा, आमतौर पर थोड़ा खराब होता है, क्योंकि आपको एक कुंजी के खिलाफ क्वेरी करनी होती है, फिर दूसरा, फिर परिणामों को मर्ज करता है।
जोएल ब्राउन

@JoelBrown Denormalized भविष्य एसक्यूएल संस्करणों दो स्तंभों के आधार पर एक यौगिक विदेशी कुंजी की परिभाषा की अनुमति देकर इस दृष्टिकोण की अनुमति चाहिए RefIDऔर RefTableजहां RefTableएक निश्चित आईडी कि पहचान करता है लक्ष्य तालिका है। इस प्रकार की कुंजी के लिए उपयोग के बहुत सारे मामले हैं और इसकी बहुत से 10 या अधिक संघटन / उप-तालिकाओं को बनाए रखने के लिए अखंडता को लागू करना है। उन मामलों के लिए मैंने इसे keyखुद बनाया है।
djmj
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.