जब मुझे एक से एक संबंधों का उपयोग करना चाहिए?


91

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

जवाबों:


104

1 से 0..1

  • सुपर और सब-क्लास के बीच "1 से 0..1" का उपयोग विरासत को लागू करने के लिए "सभी वर्गों को अलग-अलग तालिकाओं में" रणनीति के हिस्से के रूप में किया जाता है ।

  • एक "1 से 0..1" NULL-सक्षम फ़ील्ड द्वारा कवर "0..1" भाग के साथ एक ही तालिका में दर्शाया जा सकता है। हालांकि, अगर रिश्ता है ज्यादातर "1 0 करने के लिए" केवल कुछ "1 1 के लिए" पंक्तियाँ, बंटवारे बंद "0..1" एक अलग तालिका में भाग कुछ भंडारण (और कैश प्रदर्शन) की बचत हो सकती लाभ के साथ। कुछ डेटाबेस दूसरों की तुलना में NULLs का भंडारण करने में सफल होते हैं, इसलिए "कट-ऑफ पॉइंट" जहां यह रणनीति व्यवहार्य हो जाती है, काफी भिन्न हो सकती है।

1 से 1

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

  • ऊर्ध्वाधर विभाजन का एक अन्य उपयोग लॉकिंग व्यवहार को बदलने के लिए है: डेटाबेस आमतौर पर अलग-अलग क्षेत्रों के स्तर पर लॉक नहीं कर सकते हैं, केवल पूरी पंक्तियाँ। पंक्ति को विभाजित करके, आप लॉक को उसके आधे हिस्से में से केवल एक पर लगने दे रहे हैं।

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

  • अलग तालिकाओं से अधिक दानेदार सुरक्षा की अनुमति मिल सकती है।

ये विचार ज्यादातर मामलों में अप्रासंगिक हैं, इसलिए ज्यादातर मामलों में आपको "1 से 1" तालिकाओं को एक ही तालिका में विलय करने पर विचार करना चाहिए।


20

यदि एक तालिका में डेटा संबंधित है, लेकिन दूसरे द्वारा वर्णित इकाई के लिए 'संबंधित' नहीं है, तो वह इसे अलग रखने के लिए एक उम्मीदवार है।

यह भविष्य में लाभ प्रदान कर सकता है, यदि अलग डेटा को किसी अन्य इकाई से संबंधित होने की आवश्यकता है, तो भी।


19

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

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

यदि आपकी तालिका में 20 विशेषताएँ हैं, और उनमें से केवल 4 का उपयोग कभी-कभी किया जाता है, तो यह प्रदर्शन के मुद्दों के लिए तालिका को 2 तालिकाओं में तोड़ने के लिए समझ में आता है।

ऐसे मामलों में सब कुछ एक तालिका में होना अच्छा नहीं है। इसके अलावा, 45 स्तंभों वाली तालिका से निपटना आसान नहीं है!


17

मेरे 2 सेंट।

मैं एक ऐसे स्थान पर काम करता हूं जहां हम सभी एक बड़े अनुप्रयोग में विकसित होते हैं, और सब कुछ एक मॉड्यूल है। उदाहरण के लिए, हमारे पास एक usersतालिका है, और हमारे पास एक मॉड्यूल है जो उपयोगकर्ता के लिए फेसबुक विवरण जोड़ता है, एक अन्य मॉड्यूल जो उपयोगकर्ता के लिए ट्विटर विवरण जोड़ता है। हम उन मॉड्यूलों में से एक को अनप्लग करने का निर्णय ले सकते हैं और इसकी सभी कार्यक्षमता को हमारे एप्लिकेशन से हटा सकते हैं। इस स्थिति में, प्रत्येक मॉड्यूल वैश्विक usersतालिका में 1: 1 रिश्तों के साथ अपनी अपनी तालिका जोड़ता है , जैसे:

create table users ( id int primary key, ...);
create table users_fbdata ( id int primary key, ..., constraint users foreighn key ...)
create table users_twdata ( id int primary key, ..., constraint users foreighn key ...)

13

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

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

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

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


5

अक्सर नहीं।

यदि आपको कुछ सुरक्षा लागू करने की आवश्यकता है, तो आपको कुछ लाभ मिल सकते हैं - इसलिए कुछ उपयोगकर्ता कुछ कॉलम (तालिका 1) देख सकते हैं, लेकिन अन्य (तालिका) नहीं।

बेशक कुछ डेटाबेस (ओरेकल) आपको एक ही तालिका में इस तरह की सुरक्षा करने की अनुमति देते हैं, लेकिन कुछ अन्य नहीं कर सकते हैं।


5

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

नीचे, सामान्यीकरण पर एक लेख है।

http://support.microsoft.com/kb/283878


3

जैसा कि सभी डिज़ाइन सवाल करते हैं, इसका उत्तर "यह निर्भर करता है।"

कुछ विचार हैं:

  • तालिका कितनी बड़ी हो जाएगी (दोनों फ़ील्ड और पंक्तियों के संदर्भ में)? यह आपके उपयोगकर्ताओं के नाम, पासवर्ड को रखरखाव और प्रोग्रामिंग दोनों दृष्टिकोणों से आमतौर पर उपयोग किए जाने वाले अन्य कम डेटा के साथ घर करने के लिए असुविधाजनक हो सकता है

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

  • आप कितने निश्चित हैं कि संबंध 1: 1 होगा? जैसा कि यह सवाल बताता है, चीजें जल्दी से जटिल हो सकती हैं।


3

एक अन्य उपयोग मामला निम्नलिखित हो सकता है: आप किसी स्रोत से डेटा आयात कर सकते हैं और इसे दैनिक रूप से अपडेट कर सकते हैं, जैसे पुस्तकों के बारे में जानकारी। फिर, आप कुछ पुस्तकों के बारे में स्वयं डेटा जोड़ते हैं। फिर आयातित डेटा को अपने डेटा की तुलना में किसी अन्य तालिका में रखना समझ में आता है।


2

मैं आम तौर पर अभ्यास में 1: 1 संबंध के दो सामान्य प्रकारों का सामना करता हूं:

  1. IS-A संबंध, जिसे सुपरटाइप / उपप्रकार रिश्तों के रूप में भी जाना जाता है। यह तब है जब एक प्रकार की इकाई वास्तव में एक अन्य इकाई (EntityA IS A EntityB) का एक प्रकार है। उदाहरण:

    • एक ही कंपनी के भीतर एकाउंटेंट, इंजीनियर, विक्रेता के लिए अलग-अलग संस्थाओं के साथ व्यक्ति इकाई।
    • आइटम इकाई, विजेट, रॉ मटेरियल, फिनडॉग, आदि के लिए अलग-अलग संस्थाओं के साथ।
    • ट्रक, सेडान, आदि के लिए अलग-अलग संस्थाओं के साथ कार इकाई।

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

  2. "बॉस" रिश्तों। यह तब होता है जब एक व्यक्ति एक संगठनात्मक इकाई (विभाग, कंपनी, आदि) का अद्वितीय बॉस या प्रबंधक या पर्यवेक्षक होता है। जब संगठनात्मक इकाई के लिए केवल एक मालिक की अनुमति होती है, तो उस व्यक्ति इकाई के बीच 1: 1 संबंध होता है जो मालिक और संगठनात्मक इकाई इकाई का प्रतिनिधित्व करता है।


1
मुझे दूसरा उदाहरण पसंद है। आपके पास इकाई "विभाग" और इकाई "कर्मचारी" हो सकते हैं। एक विभाग में आपके पास कई कर्मचारी होते हैं, और एक कर्मचारी केवल एक विभाग में काम कर सकता है। यह 1: n है। एक कर्मचारी एक विभाग का एक पर्यवेक्षक हो सकता है - केवल एक विभाग का, और विभाग के पास केवल एक पर्यवेक्षक होता है। इसलिए आप दो संबंधों से जुड़े दो तालिकाओं के साथ समाप्त होते हैं - 1: n और 1: 1।
सीज़र

2

सबसे पहले, मुझे लगता है कि यह मॉडलिंग का सवाल है और इसे परिभाषित करने का एक अलग अस्तित्व है। मान लीजिए कि आपके पास customersएक और केवल एक ही है address। बेशक, आप एक ही तालिका में सब कुछ लागू कर सकते हैं customer, लेकिन अगर, भविष्य में आप उसे 2 या अधिक पते देने की अनुमति देते हैं, तो आपको इसे रिफैक्ट करने की आवश्यकता होगी (समस्या नहीं है, लेकिन सचेत निर्णय लें)।

मैं एक दिलचस्प मामले के बारे में अन्य उत्तरों में उल्लेख नहीं किया जा सकता है जहां तालिका को विभाजित करना उपयोगी हो सकता है:

कल्पना कीजिए, फिर से, आपके पास customersएक-एक के साथ है address, लेकिन इस बार एक पते के लिए वैकल्पिक है। बेशक आप इसे लागू कर सकते NULLहैं जैसे कि -able कॉलम जैसे कि ZIP,state,street। लेकिन मान लीजिए कि आपके पास एक पता है कि राज्य वैकल्पिक नहीं है, लेकिन ज़िप है। एक ही तालिका में मॉडल कैसे करें? आप customerमेज पर एक बाधा का उपयोग कर सकते हैं , लेकिन किसी अन्य तालिका में विभाजित करना और विदेशी_की पूरी करना आसान है। इस तरह आपका मॉडल यह कहने में अधिक स्पष्ट है कि इकाई address वैकल्पिक है, और यह ZIPउस इकाई का एक वैकल्पिक गुण है।


0

प्रोग्रामिंग के मेरे समय में मुझे केवल एक ही स्थिति में सामना करना पड़ा। ऐसा तब है जब समान 2 संस्थाओं ("एंटिटी ए" और "एंटिटी बी") के बीच 1-टू-कई और 1-टू -1 संबंध है।

जब "Entity A" में कई "Entity B" होते हैं और "Entity B" में केवल 1 "Entity A" होता है और "Entity A" में केवल 1 current "Entity B" होता है और "Entity B" में केवल 1 "Entity A" होता है।

उदाहरण के लिए, एक कार में केवल एक वर्तमान चालक हो सकता है, और चालक एक समय में केवल एक कार चला सकता है - इसलिए कार और चालक की अवधारणाओं के बीच का संबंध 1 से 1. होगा - मैंने @ उदाहरण फेंटन के जवाब से यह उधार लिया था

जहाँ एक चालक एक ही समय में कई कार नहीं चला सकता है। तो कार और ड्राइवर इकाइयां 1-से-कई या कई-से-कई हैं। लेकिन अगर हमें यह जानने की जरूरत है कि वर्तमान ड्राइवर कौन है, तो हमें 1-टू -1 संबंध भी चाहिए।


0

एक अन्य उपयोग का मामला हो सकता है यदि डेटाबेस तालिका में कॉलम की अधिकतम संख्या पार हो गई है। तब आप OneToOne का उपयोग करके एक अन्य तालिका में शामिल हो सकते हैं

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