2009-06-05 7 views
8

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

दृष्टिकोण 1: ताकि कोई उत्पाद प्रबंधक के साथ एक उत्पाद NULL मूल्य द्वारा मॉडलिंग की है बदल तालिका Product एक नया NULL सक्षम स्तंभ product_manager_employee_ID जोड़ने के लिए।

दृष्टिकोण 2: product_ID पर गैर NULL सक्षम कॉलम product_ID और employee_ID के साथ एक नई तालिका ProductManagers बनाने के लिए, एक अद्वितीय बाधा के साथ, ताकि कोई उत्पाद प्रबंधक के साथ एक उत्पाद इस तालिका में एक पंक्ति की अनुपस्थिति से मॉडलिंग की है।

अन्य दृष्टिकोण हैं लेकिन ये दो हैं जो मुझे अक्सर सामना करना पड़ता है।

मान लीजिए कि ये दोनों वैध डिजाइन विकल्प हैं (जैसा कि मैं विश्वास करने के इच्छुक हूं) और केवल अलग शैलियों का प्रतिनिधित्व करता हूं, क्या उनके नाम हैं? मैं दृष्टिकोण 2 पसंद करता हूं और किसी ऐसे व्यक्ति को शैली में अंतर व्यक्त करना मुश्किल लगता हूं जो वास्तविक उदाहरण को नियोजित किए बिना दृष्टिकोण 1 पसंद करता है (जैसा कि मैंने यहां किया है!) अगर मैं कहूं तो मैं अच्छा होगा, "मैं पसंद करता हूं झुकाव-दिशा -6 एनएफ (या जो कुछ भी) शैली खुद। "

मान लीजिए कि इन दृष्टिकोणों में से एक वास्तव में एक विरोधी पैटर्न है (क्योंकि मुझे केवल दो इकाइयों के बीच संबंधों को मॉडल करने के लिए दृष्टिकोण 1 के मामले में संदेह है) इस विरोधी पैटर्न में क्या है एक नाम?

उत्तर

9

वैसे पहला एक से कई रिश्तों (कई उत्पादों के लिए एक कर्मचारी) से ज्यादा कुछ नहीं है। इसे कभी-कभी ओ: एम रिलेशनशिप (कई से शून्य) के रूप में जाना जाता है क्योंकि यह वैकल्पिक है (प्रत्येक उत्पाद में कोई उत्पाद प्रबंधक नहीं है)। इसके अलावा प्रत्येक कर्मचारी एक उत्पाद प्रबंधक नहीं है, इसलिए यह दूसरी ओर भी वैकल्पिक है।

दूसरा एक जॉइन टेबल है, आमतौर पर कई से अधिक रिश्तों के लिए उपयोग किया जाता है। लेकिन चूंकि एक तरफ केवल एक-एक-एक है (प्रत्येक उत्पाद केवल एक बार टेबल में होता है) यह वास्तव में केवल एक जटिल रिश्तेदार है।

व्यक्तिगत रूप से मैं पहले व्यक्ति को पसंद करता हूं लेकिन न तो गलत (या बुरा) है।

दूसरे का उपयोग दो कारणों से किया जाएगा जो दिमाग में आते हैं।

  1. आप इस संभावना की कल्पना करते हैं कि एक उत्पाद में एक से अधिक प्रबंधक होंगे; या
  2. आप इस उत्पाद को ट्रैक करना चाहते हैं कि उत्पाद प्रबंधक उत्पाद के लिए कौन है। आप इसे 'y' (या समान) पर सेट एक current_flag कॉलम कहें, जहां एक समय में केवल एक ही चालू हो सकता है। यह डेटाबेस-केंद्रित अनुप्रयोगों में वास्तव में एक सुंदर आम पैटर्न है।
2

यह मुझे दो मॉडल अलग व्यवहार की तरह दिखता है। पहले उदाहरण में, आपके पास प्रति उत्पाद एक उत्पाद प्रबंधक हो सकता है और एक कर्मचारी एक से अधिक उत्पाद (एक से कई) के लिए उत्पाद प्रबंधक हो सकता है। दूसरा उत्पाद प्रति उत्पाद एक से अधिक उत्पाद प्रबंधक (कई से कई) के लिए अनुमति देता है। यह सुझाव देगा कि दो समाधान विभिन्न परिस्थितियों में समान रूप से मान्य हैं और आप जो भी उपयोग करते हैं वह व्यापार नियम पर निर्भर करेगा।

+0

उचित बिंदु लेकिन मैं इसे इस तरह से देखने का इरादा नहीं रखता था। अब मैं अपने इरादे को स्पष्ट करने के लिए संपादित करने के लिए थक गया हूं कि प्रत्येक उत्पाद में शून्य या एक उत्पाद प्रबंधक होगा (दृष्टिकोण 2 के लिए केवल उत्पाद प्रबंधक आईडी पर एक अद्वितीय बाधा की आवश्यकता है, मुझे लगता है)। – onedaywhen

0

पहले दृष्टिकोण में एक दोष है। एक सेकंड के लिए कल्पना कीजिए कि व्यवसाय की आवश्यकताओं में बदलाव आया है और अब आपको उत्पाद में 2 उत्पाद प्रबंधक सेट करने में सक्षम होना चाहिए। आप क्या करेंगे?तालिका उत्पाद में एक और कॉलम जोड़ें? छी। यह स्पष्ट रूप से 1 एनएफ का उल्लंघन करता है।

दूसरा दृष्टिकोण दूसरा दृष्टिकोण देता है एक निश्चित उत्पाद प्रबंधक < -> उत्पाद संबंध के लिए कुछ विशेषताओं को स्टोर करने की क्षमता है। जैसे, यदि आपके पास किसी उत्पाद के लिए दो उत्पाद प्रबंधक हैं, तो आप उनमें से एक को प्राथमिक के रूप में सेट कर सकते हैं ... या, उदाहरण के लिए, एक कर्मचारी के पास फ़ोन नंबर हो सकता है, लेकिन एक उत्पाद प्रबंधक के रूप में उसके पास दूसरा हो सकता है फोन नंबर ... यह तब भी विशेष टेबल पर जाता है।

+0

मैं स्पष्ट रूप से YAGNI सिद्धांत (http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It) को लागू कर रहा था। जबकि मैं मानता हूं कि भविष्य के रखरखाव के बारे में सोचने के लिए कोई नुकसान नहीं होता है, मुझे लगता है कि दोनों दृष्टिकोण वर्तमान आवश्यकताओं को पूरा करते हैं और इसलिए स्वीकार्य हैं (और कहने से कम रुक जाएगा कि 'दोषपूर्ण' है)। – onedaywhen

+0

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

+0

मैं तर्क दूंगा कि 1: एम रिश्ते के लिए एक संबंध तालिका शुरू करना सिस्टम के वास्तविक उद्देश्य को रोकता है। सामान्य मामले में, एक विदेशी कुंजी (* नहीं * एक संबंध तालिका) 1: एम संबंधों के लिए स्वीकार्य, सर्वोत्तम अभ्यास समाधान है। शायद यह इस उदाहरण में एक त्वरित हैक की तरह लगता है क्योंकि यह बहुत उचित है कि कुछ उत्पादों में एक से अधिक प्रबंधक हो सकते हैं। –

0

दृष्टिकोण 1)

  1. सभी डेटाबेस के लिए नहीं है, लेकिन कुछ के लिए) हो सकता है अतिरिक्त उत्पाद प्रबंधक क्षेत्र के साथ उत्पाद तालिका के उपयोग धीमा (।
  2. उत्पाद तालिका से कर्मचारी तालिका में लिंक करना सरल है।

दृष्टिकोण 2) उत्पाद तालिका का उपयोग कर

  1. मौजूदा प्रश्नों प्रभावित नहीं हैं।
  2. आपके डेटाबेस के आकार को बढ़ाता है। अब आपने उत्पाद आईडी कॉलम को दूसरी तालिका में डुप्लिकेट किया है और साथ ही उस तालिका में अद्वितीय बाधाएं और इंडेक्स भी जोड़े हैं।
  3. उत्पाद तालिका से कर्मचारी तालिका में लिंक करना अधिक बोझिल और महंगा है क्योंकि आपको पहले मध्यवर्ती तालिका में स्याही करना है।

आप दो तालिकाओं के बीच कितनी बार लिंक करना चाहिए?

उत्पाद तालिका का कितना अन्य प्रश्न उपयोग करते हैं?

उत्पाद तालिका में कितने रिकॉर्ड हैं?

+0

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

0

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

पेशेवरों और विपक्ष on wikipedia की चर्चा है।

मुझे पूरा यकीन है कि, सी तिथि को नापसंद करने के बाद, वह संबंध सिद्धांत को परिभाषित करता है ताकि केवल एकाधिक तालिका समाधान "मान्य" हो। उदाहरण के लिए, आप एकल तालिका दृष्टिकोण को "खराब टाइप" कह सकते हैं (चूंकि शून्य का प्रकार unclear है - पी 4 पर उद्धरण देखें)।

संबंधित मुद्दे