क्या कई परस्पर अनन्य एक-से-एक संबंध रखना एक बुरा अभ्यास है?


38

कहते हैं, एक मेज carतालिकाओं के लिए एक-से-एक संबंध नहीं है electric_car, gas_carहै, और hybrid_car। यदि कोई carहै electric_car, तो यह अब दिखाई नहीं दे सकता है gas_carया एक hybrid_carआदि।

क्या इस तरह के डिजाइन में कुछ गड़बड़ है? कुछ समस्याएं जो सड़क के नीचे हो सकती हैं?

जवाबों:


59

विभिन्न प्रकार की कारें एक सामान्य समस्या का एक उदाहरण हैं जो डेटा मॉडलिंग में बार-बार सतहों पर होती हैं। इसे ईआर मॉडलिंग में "सामान्यीकरण / विशेषज्ञता" और ऑब्जेक्ट मॉडलिंग में "सुपरक्लास / सबक्लास" कहा जाता है।

ऑब्जेक्ट मॉडलर समस्या को आसानी से हल करने के लिए ऑब्जेक्ट मॉडल में निर्मित विरासत सुविधाओं का उपयोग करता है। उपवर्ग बस सुपरक्लास का विस्तार करते हैं।

रिलेशनल मॉडलर को एक समस्या का सामना करना पड़ता है। लाभ के अनुकरण के लिए तालिकाओं को कैसे डिजाइन किया जाए?

सरलतम तकनीक को सिंगल टेबल इनहेरिटेंस कहा जाता है । सभी प्रकार की कारों के बारे में डेटा कारों के लिए एक ही तालिका में वर्गीकृत किया गया है। एक कॉलम, car_type है, जो एक ही प्रकार की सभी कारों को एक साथ जोड़ते हैं। कोई भी कार एक से अधिक प्रकार की नहीं हो सकती। यदि कोई स्तंभ इलेक्ट्रिक कारों के लिए अप्रासंगिक है, तो उसे इलेक्ट्रिक कारों से संबंधित पंक्तियों में NULL छोड़ दिया जाएगा ।

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

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

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

इसमें थोड़ी अतिरिक्त प्रोग्रामिंग शामिल है जब नई कारों को जोड़ा जाना है, लेकिन यह जुड़ावों को सरल, आसान और तेज बनाता है।

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


3
वाह धन्यवाद! यह उस जगह पर है जिसे मैं जानने की कोशिश कर रहा था। कक्षा तालिका विरासत मुझे ठीक वही लगती है जिसकी मुझे आवश्यकता है। मैंने भविष्य के पाठकों के लिए अपना स्वीकृत उत्तर बदल दिया क्योंकि मुझे लगता है कि यह केवल मेरे मामले को ही नहीं, बल्कि प्रश्न को पूरी तरह से कवर करता है।
आर्थर तरासोव

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

आप इलेक्ट्रिक कारों को हाइब्रिड कारों से रखने पर प्रतिबंध को संबोधित नहीं करते हैं। उसके लिए आपको एक अलग टेबल चाहिए।
jmoreno

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

@AlterMitty लेकिन एक car_typeक्षेत्र के बिना , आप डेटा प्राप्त करते समय विवरण के लिए देखने के लिए किस तालिका को जानेंगे? क्या आपको उस विशिष्ट carरिकॉर्ड के बारे में डेटा देखने के लिए सभी तीन तालिकाओं को पढ़ना होगा ?
जोश भाग 3

12

आपके मॉडल में कई इकाई उप-प्रकार होने के साथ कुछ भी गलत नहीं है क्योंकि आपको उस मॉडल की वास्तविकता को प्रतिबिंबित करने की आवश्यकता है जिसे आप मॉडल करने की कोशिश कर रहे हैं। सवाल यह नहीं है कि क्या उप-प्रकार एक बुरा अभ्यास है। मुद्दा यह हो सकता है कि यह एक अच्छा मॉडल है ?

उदाहरण के लिए, अपने उदाहरण के तहत, आप ऑडी ए 4 ईट्रॉन जैसी किसी चीज के साथ क्या करते हैं - जो प्लग-इन हाइब्रिड है? क्या वह "इलेक्ट्रिक कार" है या यह "हाइब्रिड कार" है?

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

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

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


धन्यवाद, मुझे डर था कि मैं अपने लिए किसी तरह का जाल बिछा रहा हूं। मेरी समस्या यह है कि प्रत्येक उपप्रकार में बहुत सारे कॉलम होंगे। कुछ ओवरलैप होंगे और मैं उन्हें एक carमेज में रख दूंगा , लेकिन कई नहीं होंगे और उन्हें एक उप-तालिका में रखा जाएगा। उदाहरण के लिए, यह कार के प्रकारों के प्राथमिक भागों को संग्रहीत करने जैसा होगा। इलेक्ट्रिक कार इंजन में 100 भाग, गैस कार इंजन 75 भाग और एक हाइब्रिड 125 भाग हो सकते हैं। 50 भागों आम है और में संग्रहीत किया जाएगा cars, जबकि 50, 25, और 75 में हो जाएगा electric_car, gas_carऔर hybrid_carटेबल
आर्थर Tarasov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.