पारस्परिक रूप से अनन्य उपवर्गों के साथ प्रकार / उपप्रकार डिजाइन पैटर्न में एक उपप्रकार के उपप्रकार को लागू करना


20

परिचय

इस सवाल के लिए भविष्य के पाठकों के लिए उपयोगी होने के लिए मैं समस्या का सामना करने के लिए जेनेरिक डेटा मॉडल का उपयोग करूंगा।

हमारे डेटा मॉडल में 3 इकाइयां शामिल हैं, जिन्हें लेबल किया जाएगा A, Bऔर C। चीजों को सरल रखने के लिए, उनकी सभी विशेषताएँ intप्रकार की होंगी ।

इकाई की Aविशेषताओं निम्नलिखित है: D, Eऔर X;

इकाई की Bविशेषताओं निम्नलिखित है: D, Eऔर Y;

इकाई Cके निम्नलिखित गुण हैं: Dऔर Z;

चूंकि सभी इकाइयां सामान्य विशेषता साझा करती हैं D, इसलिए मैंने प्रकार / उपप्रकार डिजाइन लागू करने का निर्णय लिया है ।

महत्वपूर्ण: संस्थाएँ परस्पर अनन्य हैं! इसका मतलब है कि इकाई A या B या C है।

मुसीबत:

संस्थाओं Aऔर Bअभी तक एक और आम विशेषता है E, लेकिन यह विशेषता इकाई में मौजूद नहीं है C

सवाल:

यदि संभव हो तो मैं अपने डिज़ाइन को और अधिक अनुकूलित करने के लिए ऊपर वर्णित विशेषता का उपयोग करना चाहूंगा।

सच कहूँ तो, मुझे नहीं पता कि यह कैसे करना है, और न ही कोशिश करना कहां शुरू करना है, इसलिए यह पोस्ट।

जवाबों:


6

इस प्रश्न के रूप में इनफ़ॉफ़र यह जारी है कि क्या मेरे प्रकार / सबटाइप डिज़ाइन पैटर्न (पारस्परिक रूप से अनन्य उपवर्गों के लिए) का कार्यान्वयन सही है? , जो अपने आप में एक निरंतरता नहीं है कि परिवर्तनीय इकाई को संबंधपरक तालिका में कैसे बदलना है , मैं पूछता हूं: क्या आप वास्तव में अनुकूलन करने की कोशिश कर रहे हैं? भंडारण? ऑब्जेक्ट मॉडल? क्वेरी की जटिलता? क्वेरी प्रदर्शन? जब आप एक ही समय में सभी पहलुओं का अनुकूलन नहीं कर सकते हैं तो एक पहलू बनाम दूसरे को अनुकूलित करते समय व्यापार-बंद होते हैं।

मैं रेमस के बिंदुओं से पूरी तरह सहमत हूं :

  • प्रत्येक दृष्टिकोण के लिए पेशेवरों और विपक्ष हैं (यानी कभी-वर्तमान "यह निर्भर करता है" कारक), और
  • पहली प्राथमिकता डेटा मॉडल की दक्षता है (साफ और / या कुशल ऐप कोड द्वारा अक्षम डेटा मॉडल को ठीक नहीं किया जा सकता है)

कहा कि, आपके सामने जो विकल्प है, वह निम्नलिखित के बीच है, सबसे सामान्यीकरण के लिए कम से कम सामान्यीकरण के क्रम में व्यवस्थित किया गया है:

  • Eआधार-प्रकार तालिका में संपत्ति को बढ़ावा देना
  • इसे कई सब-टाइप टेबल्स में रखते हैं
  • पूरी तरह से सामान्य Eरूप में एक ही स्तर पर एक नया, मध्यस्थ उप-वर्ग तालिका के लिए बाहर C, कि Aऔर Bसीधे की उप-वर्गों होगा ( @ MDCCL का जवाब )

आइए प्रत्येक विकल्प देखें:

संपत्ति Eको आधार-प्रकार तालिका में स्थानांतरित करें

पेशेवरों

  • प्रश्नों कि जरूरत के लिए कम क्वेरी जटिलता Eनहीं बल्कि X, Y, या Z
  • संभवतः अधिक कुशल है कि जरूरत प्रश्नों के लिए Eनहीं बल्कि X, Y, या Z(विशेष रूप से कुल क्वेरी) नहीं की वजह से शामिल हों।
  • संभावित सूचकांक बनाने के लिए (D, E)(और यदि ऐसा है, तो संभावित रूप से फ़िल्टर किया गया सूचकांक (D, E)जहां EntityType <> C, अगर ऐसी स्थिति दी गई है)

विपक्ष

  • के Eरूप में चिह्नित नहीं कर सकताNOT NULL
  • CHECK CONSTRAINTयह सुनिश्चित करने के लिए कि E IS NULLकब EntityType = C(हालांकि यह बहुत बड़ा मुद्दा नहीं है) आधार-प्रकार तालिका पर अतिरिक्त आवश्यकता है
  • डेटा मॉडल के उपयोगकर्ताओं को शिक्षित करने की आवश्यकता है कि क्यों Eहोना चाहिए NULL, और यहां तक ​​कि पूरी तरह से अनदेखा किया जाना चाहिए, जब EntityType = C
  • Eफिक्स्ड-लेंथ प्रकार होने पर थोड़ा कम कुशल , और पंक्तियों का एक बड़ा हिस्सा EntityType के लिए होता है C(अर्थात इसका उपयोग नहीं Eकिया जाता है NULL), औरSPARSE स्तंभ पर विकल्प या डेटा कंप्रेशन इंडेक्स पर डेटा संपीड़न का उपयोग न करें
  • उन प्रश्नों के लिए संभावित रूप से कम कुशल जिन्हें आधार-प्रकार तालिका में Eमौजूद होने की आवश्यकता नहीं है E, प्रत्येक पंक्ति के आकार को बढ़ाएंगे जो बदले में उन पंक्तियों की संख्या को घटाता है जो किसी डेटा पृष्ठ पर फिट हो सकती हैं। लेकिन यह Eआधार, तालिका प्रकार, आदि में कितनी पंक्तियाँ हैं, इसके सटीक डेटाटाइप पर अत्यधिक निर्भर है ।

Eप्रत्येक उप-प्रकार तालिका में संपत्ति रखें

पेशेवरों

  • क्लीनर डेटा मॉडल (यानी दूसरों को शिक्षित करने के बारे में चिंता करने की ज़रूरत नहीं है Eकि आधार-प्रकार तालिका में कॉलम का उपयोग क्यों नहीं किया जाना चाहिए क्योंकि "यह वास्तव में नहीं है")
  • संभवतः अधिक बारीकी से वस्तु-मॉडल जैसा दिखता है
  • स्तंभ को चिह्नित कर सकते हैं जैसे NOT NULLकि यह इकाई की आवश्यक संपत्ति है
  • CHECK CONSTRAINTयह सुनिश्चित करने के लिए आधार-प्रकार तालिका पर अतिरिक्त की आवश्यकता नहीं है कि E IS NULLजब EntityType = C(हालांकि यह बहुत बड़ा लाभ नहीं है)

विपक्ष

  • इस संपत्ति को प्राप्त करने के लिए तालिका को उप-प्रकार में शामिल करने की आवश्यकता है
  • आवश्यकता के समय संभावित रूप से थोड़ा कम कुशल E, JOIN के कारण, A+ की कितनी पंक्तियों के आधार पर Bआपने कितनी पंक्तियों के विपरीत विरोध किया है C
  • संचालन के लिए थोड़ा और अधिक कठिन / जटिल है जो केवल संस्थाओं Aऔर B(और नहीं C ) के साथ समान "प्रकार" के रूप में व्यवहार करते हैं। बेशक, आप कर सकते थे कि एक करता है एक दृश्य के माध्यम से इस सार UNION ALLएक के बीच SELECTके लिए शामिल हो गए टेबल के Aऔर एक अन्य SELECTके लिए शामिल हो गए टेबल के B। यह चयनित प्रश्नों की जटिलता को कम करेगा लेकिन प्रश्नों INSERTऔर UPDATEप्रश्नों के लिए इतना उपयोगी नहीं होगा ।
  • विशिष्ट प्रश्नों के आधार पर और उन्हें कितनी बार निष्पादित किया जाता है, यह उन मामलों में एक संभावित अक्षमता हो सकती है जहां एक सूचकांक होने पर (D, E)वास्तव में एक या अधिक बार उपयोग किए जाने वाले प्रश्नों में मदद मिलेगी, क्योंकि उन्हें एक साथ अनुक्रमित नहीं किया जा सकता है।

सामान्य Eआधार वर्ग और के बीच मध्यस्थ टेबल के लिए बाहर AऔरB

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

पेशेवरों

  • डेटा मॉडल पूरी तरह से सामान्यीकृत है (इसमें कुछ भी गलत नहीं हो सकता है, यह देखते हुए कि RDBMS क्या करने के लिए तैयार हैं)
  • प्रश्नों की आवश्यकता के लिए कम क्वेरी जटिलता Aऔर B, लेकिन नहीं C(यानी दो प्रश्नों के लिए कोई ज़रूरत नहीं है UNION ALL)

विपक्ष

  • थोड़ा अधिक स्थान लिया गया ( Barतालिका आईडी को डुप्लिकेट करती है, और एक नया कॉलम है, BarTypeCode) [नगण्य, लेकिन कुछ जागरूक होने के लिए]
  • या JOINतो Aया पाने के लिए एक अतिरिक्त के रूप में क्वेरी जटिलता में मामूली वृद्धिB
  • लॉकिंग के लिए सतह क्षेत्र में वृद्धि, ज्यादातर पर INSERT( DELETEविदेशी कुंजी के रूप में चिह्नित करने के माध्यम से स्पष्ट रूप से नियंत्रित किया जा सकता है ON CASCADE DELETE) क्योंकि लेन-देन बेस-क्लास टेबल (यानी Foo) [नगण्य, लेकिन कुछ के बारे में पता होना चाहिए] पर थोड़ी देर खुला रखा जाएगा
  • वास्तविक प्रकार का कोई प्रत्यक्ष ज्ञान - Aया B- बेस-क्लास टेबल के भीतर Foo; यह केवल उस प्रकार को जानता है Brजो Aया तो हो सकता है B:

    मतलब, अगर आपको सामान्य आधार की जानकारी पर सवाल करने की ज़रूरत है, लेकिन या तो इकाई प्रकार को वर्गीकृत करने की आवश्यकता है या एक या अधिक इकाई प्रकारों को फ़िल्टर करना है, तो आधार-वर्ग तालिका में पर्याप्त जानकारी नहीं है, जिस स्थिति में आपको ज़रूरत है तालिका। यह कॉलम को अनुक्रमित करने की प्रभावशीलता को भी कम करेगा ।LEFT JOINBarFooTypeCode

  • Aऔर Bबनाम के साथ बातचीत करने के लिए कोई सुसंगत दृष्टिकोण नहीं C:

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

  • समय के साथ बदलने वाले व्यावसायिक नियमों के लिए संभवतः कम अनुकूलनीय:

    मतलब, चीजें हमेशा बदलती रहती हैं, और Eयदि सभी उप-प्रकारों के लिए यह सामान्य हो जाता है, तो बेस-क्लास टेबल पर जाना काफी आसान है । एक सामान्य संपत्ति को उप-प्रकारों में स्थानांतरित करने के लिए पर्याप्त आसान है यदि संस्थाओं की प्रकृति में परिवर्तन एक लायक-परिवर्तन करता है। एक उप-प्रकार को दो उप-प्रकारों में विभाजित करना आसान है (बस एक और SubTypeIDमूल्य बनाएं ) या एक में दो या अधिक उप-प्रकारों को संयोजित करना। इसके विपरीत, क्या होगा अगर Eबाद में सभी उप-प्रकारों की एक आम संपत्ति बन गई? तब Barतालिका की मध्यस्थ परत अर्थहीन होगी, और जोड़ा जटिलता इसके लायक नहीं होगी। बेशक, यह जानना असंभव है कि क्या इस तरह का बदलाव 5 या 10 साल में होगा, इसलिए Barतालिका जरूरी नहीं है, और न ही बहुत अधिक होने की संभावना है, एक बुरा विचार (यही वजह है कि मैंने " संभावित रूप से कम अनुकूलनीय" कहा)। ये केवल विचार करने के लिए बिंदु हैं; यह किसी भी दिशा में एक जुआ है।

  • संभावित अनुचित समूहीकरण:

    मतलब, सिर्फ इसलिए कि Eसंपत्ति इकाई प्रकार के बीच साझा किया जाता है Aऔर Bयह है कि इसका मतलब यह नहीं Aहै और B होना चाहिए एक साथ समूहीकृत किया। सिर्फ इसलिए कि चीजें "समान" दिखाई देती हैं (यानी समान गुण) का मतलब यह नहीं है कि वे समान हैं।

सारांश

बस यह तय करने के लिए कि कब / कब वंचित करना है, कैसे इस विशेष स्थिति के लिए सबसे अच्छा तरीका है डेटा मॉडल के उपयोग के निम्नलिखित पहलुओं पर विचार करना और यह सुनिश्चित करना कि लाभ लागत से आगे निकल जाएं:

  • प्रत्येक इकाई के लिए आपके पास कितनी पंक्तियाँ होंगी (सड़क से कम से कम 5 वर्ष नीचे देखें, औसत वृद्धि से ऊपर मानकर)
  • इन तालिकाओं (बेस-प्रकार और उप-प्रकार) में से कितने जीबी 5 वर्षों में होंगे?
  • विशिष्ट डेटाटाइप क्या संपत्ति है E
  • क्या यह केवल एक संपत्ति है या कुछ, या यहां तक ​​कि कई, गुण हैं
  • आपको किन प्रश्नों की आवश्यकता होगी Eऔर उन्हें कितनी बार निष्पादित किया जाएगा
  • आपको किन प्रश्नों की आवश्यकता होगी, जिनकी आवश्यकता नहीं है Eऔर उन्हें कितनी बार निष्पादित किया जाएगा

मुझे लगता है कि मैं Eअलग-अलग उप-प्रकार तालिकाओं में रखने के लिए डिफ़ॉल्ट हूं क्योंकि यह बहुत कम से कम "क्लीनर" है। मैं Eबेस-प्रकार तालिका में जाने पर विचार करूंगा यदि: अधिकांश पंक्तियाँ EntityType के लिए नहीं थीं C; और पंक्तियों की संख्या कम से कम लाखों में थी; और मुझे अधिक-अक्सर-निष्पादित निष्पादित प्रश्नों की आवश्यकता होती है Eऔर / या जिन प्रश्नों पर सूचकांक से लाभ होता है वे (D, E)या तो बहुत बार निष्पादित होते हैं और / या पर्याप्त सिस्टम संसाधनों की आवश्यकता होती है जैसे कि सूचकांक होने से समग्र संसाधन उपयोग कम हो जाता है, या कम से कम रोकता है संसाधन खपत में वृद्धि जो स्वीकार्य स्तरों से ऊपर जाती है या पिछले लंबे समय से अत्यधिक अवरुद्ध और / या गतिरोधों में वृद्धि का कारण बनती है।


अपडेट करें

ओपी ने इस जवाब पर टिप्पणी की कि:

मेरे नियोक्ताओं ने व्यावसायिक तर्क को बदल दिया, ई को पूरी तरह से हटा दिया!

यह परिवर्तन विशेष रूप से महत्वपूर्ण है, क्योंकि यह है मैं वास्तव में क्या "मानक के अनुसार के" विपक्ष "उप-अनुभाग में क्या हो सकता predicated है Eआधार वर्ग और के बीच मध्यस्थ टेबल के लिए बाहर Aऔर Bअनुभाग के ऊपर (6 बुलेट बिंदु)"। विशिष्ट मुद्दा यह है कि इस तरह के परिवर्तन होने पर डेटा मॉडल को फिर से तैयार करना कितना आसान / कठिन है (और वे हमेशा करते हैं)। कुछ का तर्क होगा कि किसी भी डेटा मॉडल को फिर से बनाया / बदला जा सकता है, इसलिए आदर्श के साथ शुरू करें। लेकिन जबकि यह तकनीकी स्तर पर सच है कि किसी भी चीज को फिर से बनाया जा सकता है, स्थिति की वास्तविकता पैमाने की बात है।

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

इस बात को ध्यान में रखते हुए, यदि डेटा का आकार काफी छोटा है, जिसमें परिवर्तन बहुत ही क्वेरी से किए जा सकते हैं, और / या आपके पास एक रखरखाव विंडो है जो न केवल परिवर्तनों को बनाने के लिए पर्याप्त है, बल्कि यदि कुछ हो भी जाता है गलत, फिर Eबेस-क्लास टेबल और A& Bसब-क्लास टेबल के बीच एक मध्यस्थ तालिका को सामान्य करने से काम हो सकता है (हालांकि यह अभी भी आपको विशिष्ट प्रकार के प्रत्यक्ष ज्ञान के साथ नहीं छोड़ता है ( Aया)B) बेस-क्लास टेबल में)। लेकिन, यदि आपके पास इन तालिकाओं में सैकड़ों लाखों पंक्तियाँ हैं, और तालिकाओं को संदर्भित करने वाली कोड की एक अविश्वसनीय मात्रा है (परिवर्तन किए जाने पर कोड का परीक्षण किया जाना है), तो यह आमतौर पर आदर्शवादी की तुलना में अधिक व्यावहारिक होने का भुगतान करता है। और यह वह वातावरण है जिसे मुझे वर्षों तक निपटना था: बेस-क्लास तालिका में 987 मिलियन पंक्तियाँ और 615 जीबी, 18 सर्वरों के साथ फैली हुई थीं। और इतना कोड इन तालिकाओं (बेस-क्लास और सब-क्लास तालिकाओं) को मारा गया था कि बहुत अधिक प्रतिरोध था - ज्यादातर प्रबंधन से लेकिन कभी-कभी टीम के बाकी हिस्सों से - विकास की मात्रा के कारण कोई भी बदलाव करने के लिए। क्यूए संसाधनों को आवंटित करने की आवश्यकता होगी।

तो, एक बार फिर, "सबसे अच्छा" दृष्टिकोण केवल स्थिति-दर-स्थिति निर्धारित किया जा सकता है: आपको अपनी प्रणाली (यानी कितना डेटा और तालिकाओं और कोड सभी संबंधित हैं), रिफैक्टिंग और लोगों को कैसे पूरा करना है, यह जानने की जरूरत है कि आप (आपकी टीम और संभवतया प्रबंधन के साथ काम करते हैं - क्या आप ऐसी परियोजना के लिए उनकी खरीद कर सकते हैं?)। कुछ बदलाव हैं जिनका मैं 1 - 2 वर्षों से उल्लेख और नियोजन कर रहा था, और उनमें से 85% को लागू करने के लिए कई स्प्रिंट / रिलीज़ किए गए। लेकिन अगर आपके पास केवल <1 मिलियन पंक्तियाँ हैं और इन तालिकाओं से बहुत अधिक कोड बंधा हुआ नहीं है, तो आप संभवतः चीजों के अधिक आदर्श / "शुद्ध" पक्ष पर शुरू करने में सक्षम हैं।

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


17

मार्टिन फाउलर के अनुसार, तालिका विरासत की समस्या के लिए 3 दृष्टिकोण हैं:

  • एकल तालिका वंशानुक्रम : एक तालिका सभी प्रकारों का प्रतिनिधित्व करती है। अप्रयुक्त विशेषताएँ NULLed हैं।
  • कंक्रीट टेबल इनहेरिटेंस : एक टेबल प्रति कंक्रीट प्रकार, प्रत्येक टेबल टाइप के प्रत्येक गुण के लिए। तालिकाओं के बीच कोई संबंध नहीं।
  • क्लास टेबल इनहेरिटेंस : एक टेबल प्रति प्रकार, प्रत्येक टेबल में केवल नए, विरासत में मिले विशेषताओं के लिए विशेषताएँ होती हैं। तालिकाओं का संबंध वास्तविक प्रकार वंशानुगत पदानुक्रम को दर्शाने से है।

आप प्रत्येक दृष्टिकोण के पेशेवरों और विपक्षों की खोज के लिए शुरुआती बिंदु के रूप में इनसे शुरुआत कर सकते हैं। इसका सार यह है कि सभी दृष्टिकोणों के बड़े नुकसान हैं, और किसी को भी कोई भारी लाभ नहीं है। ऑब्जेक्ट रिलेशनल इम्पीडेंस मिसमैच के रूप में बेहतर रूप से जाना जाता है , इस समस्या का समाधान ढूंढना बाकी है।

व्यक्तिगत रूप से मुझे लगता है कि खराब संबंधपरक डिजाइन के प्रकार एक खराब प्रकार के डिजाइन से उत्पन्न होने वाली समस्याओं की तुलना में परिमाण के आदेशों को अधिक गंभीर बना सकते हैं । खराब डेटाबेस डिज़ाइन से धीमी क्वेरी, अद्यतन विसंगतियाँ, डेटा आकार विस्फोट, गतिरोध और अनुत्तरदायी ऐप, और दसियों सैकड़ों गीगाबाइट डेटा गलत स्वरूप में डूब जाते हैं । खराब प्रकार का डिज़ाइन कोड को बनाए रखने और अपडेट करने के लिए मुश्किल होता है , रनटाइम नहीं। इसलिए, मेरी पुस्तक में, सही संबंधपरक डिज़ाइन किसी भी OO प्रकार की शुद्धता को बार-बार ट्रम्प करता है।


@AlwaysLearningNewStuff मुझे लगता है कि यह प्रश्न dba.stackexchange.com/questions/139092 पर अनुवर्ती है , सही है? कार्यान्वयन में वहाँ आप कर तालिका विरासत है।
रेमस रूसु

हां यह है, इस प्रश्न को पूछने से पहले मैं यह सुनिश्चित करना चाहता था कि मैं सही तरीके से समझाऊं कि पहले प्रकार / उपप्रकार डिजाइन को कैसे लागू किया जाए। अब मैं ऊपर वर्णित समस्या का सामना करता हूं जब कुछ (लेकिन सभी नहीं!) उपवर्गों में साझा विशेषताएं होती हैं। मैं सोच रहा था कि क्या कुछ है जो मैं उस मामले में डेटा मॉडल को अनुकूलित करने के बजाय उस बारीकियों की अवहेलना कर सकता
हूं

6

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

औचित्यपूर्ण कार्य को प्राप्त करने के लिए एक दृष्टिकोण को उजागर करने के लिए, मैं दो क्लासिक काल्पनिक इकाई प्रकारों को जारी करने के लिए परिदृश्य में जोड़ने जा रहा हूं Fooऔर Barजिन्हें मैं बोला विस्तार दूंगा।

व्यापार नियम

यहाँ कुछ कथन दिए गए हैं जो मुझे एक तार्किक मॉडल बनाने में मदद करेंगे:

  • A Foo is either one Bar or one C
  • A Foo is categorized by one FooType
  • A Bar is either one A or one C
  • A Bar is classified by one BarType

तार्किक मॉडल

और फिर, परिणामी IDEF1X [1] लॉजिकल मॉडल को चित्र 1 में दिखाया गया है (और आप इसे ड्रॉपबॉक्स से पीडीएफ के रूप में भी डाउनलोड कर सकते हैं ):

चित्र 1 - हाइपोथेटिकल सुपरटाइप-सबटाइप रिलेशनशिप डेटा मॉडल

फू और बार इसके अलावा

मैं जोड़ने नहीं था Fooऔर Barमॉडल नज़र बेहतर बनाने के लिए है, लेकिन यह अधिक अर्थपूर्ण बनाने के लिए। मुझे लगता है कि वे निम्नलिखित के कारण महत्वपूर्ण हैं:

  • के रूप में Aऔर Bविशेषता नामित हिस्सा E, इस सुविधा का सुझाव है कि वे की subentity प्रकार के होते हैं एक अलग (लेकिन संबंधित) की तरह अवधारणा , घटना , व्यक्ति , माप , आदि, जो मैं के माध्यम से प्रतिनिधित्व किया Barsuperentity प्रकार है कि, बारी में, है एक उप-प्रकार का प्रकार Foo, जो Dपदानुक्रम के शीर्ष पर विशेषता रखता है।

  • के बाद से Cचर्चा के अंतर्गत इकाई प्रकार, के बाकी के साथ ही शेयरों एक विशेषता यानी, D, इस पहलू insinuates कि यह का एक और प्रकार का एक subentity प्रकार है अवधारणा , घटना , व्यक्ति , माप , आदि, मैं इतना के आधार पर इस परिस्थिति का चित्रण किया Fooसुपर इकाई प्रकार।

हालाँकि, ये केवल धारणाएं हैं, और चूंकि एक संबंधपरक डेटाबेस एक निश्चित व्यावसायिक संदर्भ के शब्दार्थ को प्रतिबिंबित करने के लिए है , आपको अपने विशिष्ट डोमेन में रुचि की सभी चीजों को पहचानना और वर्गीकृत करना होगा, ताकि आप ठीक से अधिक अर्थ प्राप्त कर सकें। ।

डिजाइन चरण में महत्वपूर्ण कारक

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

  • प्रत्येक अनन्य सुपरेंटिटी प्रकार की घटना केवल एक सबेंटिटी प्रकार के पूरक से संबंधित है ।

इस प्रकार, इन मामलों में एक-से-एक (1: 1) का एक पत्राचार (या कार्डिनैलिटी) है।

आप अपने पूर्ववर्ती पद से जानते हैं, discriminator विशेषता (स्तंभ, जब कार्यान्वित) एक सर्वोपरि भूमिका निभाता है जब एक बनाने संघ इस प्रकार की है, क्योंकि यह सही उप प्रकार उदाहरण है, जिसमें से महाप्रकार है इंगित करता है जुड़ा । (I) उपप्रकार से (i) उपप्रकार के लिए प्राथमिक कुंजी का प्रवास भी मुख्य महत्व है।

कंक्रीट DDL संरचना

और फिर मैंने एक डीडीएल संरचना लिखी जो ऊपर प्रस्तुत तार्किक मॉडल पर आधारित है:

CREATE TABLE FooType -- Look-up table.
(
    FooTypeCode     CHAR(2)  NOT NULL,
    Description     CHAR(90) NOT NULL, 
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_FooType             PRIMARY KEY (FooTypeCode),
    CONSTRAINT AK_FooType_Description UNIQUE      (Description)
);

CREATE TABLE Foo -- Supertype
(
    FooId           INT      NOT NULL, -- This PK migrates (1) to ‘Bar’ as ‘BarId’, (2) to ‘A’ as ‘AId’, (3) to ‘B’ as ‘BId’, and (4) to ‘C’ as ‘CId’.
    FooTypeCode     CHAR(2)  NOT NULL, -- Discriminator column.
    D               INT      NOT NULL, -- Column that applies to ‘Bar’ (and therefore to ‘A’ and ‘B’) and ‘C’.
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_Foo                 PRIMARY KEY (FooId),
    CONSTRAINT FK_from_Foo_to_FooType FOREIGN KEY (FooTypeCode)
        REFERENCES FooType (FooTypeCode)
);

CREATE TABLE BarType -- Look-up table.
(
    BarTypeCode CHAR(1)  NOT NULL,  
    Description CHAR(90) NOT NULL,  
    CONSTRAINT PK_BarType             PRIMARY KEY (BarTypeCode),
    CONSTRAINT AK_BarType_Description UNIQUE      (Description)
);

CREATE TABLE Bar -- Subtype of ‘Foo’.
(
    BarId       INT     NOT NULL, -- PK and FK.
    BarTypeCode CHAR(1) NOT NULL, -- Discriminator column. 
    E           INT     NOT NULL, -- Column that applies to ‘A’ and ‘B’.
    CONSTRAINT PK_Bar             PRIMARY KEY (BarId),
    CONSTRAINT FK_from_Bar_to_Foo FOREIGN KEY (BarId)
        REFERENCES Foo (FooId),
    CONSTRAINT FK_from_Bar_to_BarType FOREIGN KEY (BarTypeCode)
        REFERENCES BarType (BarTypeCode)    
);

CREATE TABLE A -- Subtype of ‘Bar’.
(
    AId INT NOT NULL, -- PK and FK.
    X   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_A             PRIMARY KEY (AId),
    CONSTRAINT FK_from_A_to_Bar FOREIGN KEY (AId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE B -- (1) Subtype of ‘Bar’ and (2) supertype of ‘A’ and ‘B’.
(
    BId INT NOT NULL, -- PK and FK.
    Y   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_B             PRIMARY KEY (BId),
    CONSTRAINT FK_from_B_to_Bar FOREIGN KEY (BId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE C -- Subtype of ‘Foo’.
(
    CId INT NOT NULL, -- PK and FK.
    Z   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_C             PRIMARY KEY (CId),
    CONSTRAINT FK_from_C_to_Foo FOREIGN KEY (FooId)
        REFERENCES Foo (FooId)  
);

इस संरचना के साथ आप अपने बेस टेबल (या संबंध ) में NULL अंकों के भंडारण से बचते हैं , जो आपके डेटा बेस में अस्पष्टता का परिचय देगा।

वफ़ादारी, स्थिरता और अन्य विचार

एक बार जब आप अपने डेटाबेस को लागू कर रहे हैं, तो आप यह सुनिश्चित करना चाहिए कि (क) प्रत्येक अनन्य महाप्रकार पंक्ति हमेशा अपने इसी से पूरित है उपप्रकार समकक्ष और, बारी में, गारंटी नहीं है कि (ख) इस तरह के उप-प्रकार पंक्ति मूल्य के साथ संगत है महाप्रकार में निहित discriminator स्तंभ । इसलिए, यह TRANSACTIONSसुनिश्चित करने के लिए कि आपके डेटाबेस में ये स्थितियां पूरी हुई हैं, ACID को नियोजित करने के लिए यह काफी सुविधाजनक है ।

आपको अपने डेटाबेस की तार्किक ध्वनि, आत्म-अभिव्यक्ति और सटीकता को नहीं छोड़ना चाहिए, ये ऐसे पहलू हैं जो निश्चित रूप से आपके डेटाबेस को अधिक ठोस बनाते हैं।

पहले से पोस्ट किए गए दो उत्तर में पहले से ही मौजूद बिंदु शामिल हैं जो निश्चित रूप से आपके डेटाबेस और इसके एप्लिकेशन प्रोग्राम (ओं) को डिजाइन, बनाते और प्रबंधित करते समय ध्यान में रखने योग्य हैं।

VIEW परिभाषाओं के माध्यम से डेटा पुनर्प्राप्त करना

आप कुछ दृश्य सेट कर सकते हैं जो विभिन्न सुपर-टाइप-उप-प्रकार समूहों के स्तंभों को जोड़ते हैं , ताकि आप हर बार डेटा को पुनः प्राप्त कर सकें, जैसे, हर बार आवश्यक जॉइन क्लॉस लिखना। इस तरह, आप आसानी से सीधे VIEW (एक व्युत्पन्न संबंध या तालिका ) से चयन कर सकते हैं ।

जैसा कि आप देख सकते हैं, "टेड" कॉड, निस्संदेह, एक प्रतिभाशाली था। उनके द्वारा निकाले गए उपकरण काफी मजबूत और सुरुचिपूर्ण हैं, और निश्चित रूप से, एक दूसरे के साथ अच्छी तरह से एकीकृत हैं।

संबंधित संसाधन

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


ध्यान दें

1. सूचना मॉडलिंग के लिए एकीकरण परिभाषा ( आईडीईएफ 1 एक्स ) एक उच्च अनुशंसित डेटा मॉडलिंग तकनीक है जिसे संयुक्त राज्य अमेरिका के राष्ट्रीय मानक और प्रौद्योगिकी संस्थान ( एनआईएसटी ) द्वारा 1993 में मानक के रूप में स्थापित किया गया था । यह डॉ। ईएफ कोडड द्वारा लिखित प्रारंभिक सैद्धांतिक सामग्री (ए) पर आधारित है । पर (ख) इकाई-संबंध डेटा, द्वारा विकसित की दृष्टि डॉ पीपी चेन ; और भी (ग) रॉबर्ट जी ब्राउन द्वारा बनाई गई लॉजिकल डेटाबेस डिजाइन तकनीक। यह ध्यान देने योग्य है कि IDEF1X को पहले-क्रम तर्क के माध्यम से औपचारिक रूप दिया गया था।


मेरे नियोक्ताओं ने व्यावसायिक तर्क को बदल दिया, Eपूरी तरह से हटा दिया! उपयोगकर्ता के srutzky के उत्तर को स्वीकार करने का कारण यह है कि यह अच्छे अंक प्रदान करता है जो मुझे सबसे कुशल मार्ग चुनने का मेरा निर्णय लेने में मदद करते हैं। यदि इसके लिए नहीं तो मैं आपके उत्तर को स्वीकार करूंगा। मैंने आपके उत्तर को पहले ही बदल दिया है। एक बार फिर धन्यवाद!
AlwaysLearningNewStuff
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.