2009-01-30 18 views
18

मैं इन तालिकाओं है: (। "CreatedByID" एक foreign key कर्मचारियों के लिए है)डेटाबेस डिज़ाइन में सामान्यीकरण कैसे लेना है?

Projects(projectID, CreatedByID) 
Employees(empID,depID) 
Departments(depID,OfficeID) 
Offices(officeID) 

और मैं एक प्रश्न है कि मुझे लगता है कि सब पकड़ लेता है एक वेब अनुप्रयोग के लगभग हर अनुरोध के लिए चलाने की आवश्यकता है एक कार्यालय में परियोजनाओं। क्या तीन जोड़ों को खत्म करने के लिए परियोजनाओं में केवल एक अनावश्यक "OfficeID" कॉलम जोड़ने का बुरा अभ्यास है? या मुझे निम्नलिखित करना चाहिए?

SELECT * 
FROM Projects P 
JOIN Employees E ON P.CreatedBY = E.EmpID 
JOIN Departments D on E.DepID = D.DepID 
JOIN Offices O on D.officeID = O.officeID 
WHERE O.officeID = @SomeOfficeID 

जब तक मुझे प्रदर्शन की समस्याएं नहीं दिखाई देतीं?

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

+2

मैंने एसक्यूएल को स्वरूपित करने की कोशिश की लेकिन स्टैक ओवरफ्लो संपादक इसे एक पंक्ति पर रखता रहता है। – Element

+0

उन पंक्तियों को चार रिक्त स्थान के साथ इंडेंट करें जो इसे "कोड ब्लॉक" के रूप में दिखाई देते हैं। –

+0

आपको बेहतर डीबीए की आवश्यकता है, डेटाबेस में शामिल होने की उम्मीद है और उन्हें उपयोग करने के लिए अनुकूलित किया गया है। यदि आपके डीबीए ने इंडेक्स इंडेक्स नहीं किया है (एफकेएस इंडेक्स की आवश्यकता है) या डेटा बहुत बड़ा है तो वे केवल बहुत महंगे हैं। यहां तक ​​कि, मैं उन डेटाबेस वाले लोगों को जानता हूं जो आकार में डरावने हैं और वे अभी भी जुड़ने का उपयोग करते हैं। – HLGEM

उत्तर

29

असमान्यीकरण बड़े प्रश्नों पर तेजी से SELECT रों का लाभ दिया है।

नुकसान कर रहे हैं:

  • यह अखंडता (जो आपके मामले में सबसे महत्वपूर्ण है)

  • यह DML (सम्मिलित/अपडेट/DELETE)

  • पर धीमी है सुनिश्चित करने के लिए और अधिक कोडिंग और समय लगता है
  • यह अधिक स्थान

के लिए के रूप में लेता है आर अनुकूलन, आप या तो तेजी से पूछताछ के लिए या तेजी से डीएमएल के लिए अनुकूलित कर सकते हैं (एक नियम के रूप में, ये दो विरोधी हैं)।

तेजी से क्वेरी किए जाने के लिए अनुकूलन अक्सर डेटा डुप्लिकेट करने का अर्थ है, यह असमान्यीकरण, सूचकांक, जो कुछ भी की अतिरिक्त टेबल हो।

सूचकांक के मामले में, RDBMS यह आपके लिए करता है, लेकिन denormalization के मामले में, आपको इसे स्वयं कोड करना होगा। क्या होगा अगर Department अन्य Office पर ले जाता है? आपको इसे एक के बजाय तीन तालिकाओं में ठीक करने की आवश्यकता होगी।

इसलिए, जैसा कि मैं आपकी तालिकाओं के नाम से देख सकता हूं, वहां लाखों रिकॉर्ड नहीं होंगे। तो आप अपने डेटा को बेहतर सामान्य बनाना चाहते हैं, यह प्रबंधित करना आसान होगा।

+0

मुझे लगता है कि आपको कहना है "यह डीएमएल (INSERT/UPDATE/DELETE) पर धीमा है" – John

+0

निश्चित रूप से मैंने किया, धन्यवाद। – Quassnoi

7

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

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

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

4

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

33

मानक के अनुसार जब तक यह दर्द होता है, तो denormalize तक यह काम करता है

2

आप (या BIGINT) पूर्णांकों उपयोग कर रहे हैं पहचान पत्र के रूप में है और वे क्लस्टर प्राथमिक कुंजी आप ठीक होना चाहिए।

हालांकि ऐसा लगता है कि यह हमेशा एक परियोजना से कार्यालय खोजने के लिए तेज़ होगा क्योंकि आप हमेशा प्राथमिक कुंजी देख रहे हैं, विदेशी कुंजी पर इंडेक्स का उपयोग न्यूनतम अंतर करेगा क्योंकि इंडेक्स प्राथमिक कुंजी को भी कवर करेगा ।

आपको भविष्य में डेटा denormalise करने की जरूरत मिल जाए बाद में, आप एक समय या ट्रिगर पर एक कैश तालिका बना सकते हैं।

+0

आईडी को सबसे अच्छी संभव गति के लिए क्लस्टर करने की आवश्यकता नहीं है। चूंकि ये स्कैन के बजाए लुकअप की तलाश करेंगे, इसलिए एफके को घुमाने पर कोई फर्क नहीं पड़ता है। –

9

डेटाबेस अखंडता समस्याओं को दूर करने के लिए हमेशा तक सामान्यीकृत करें (यानी संभावित डुप्लिकेट या अनुपलब्ध डेटा)।

यहां तक ​​कि अगर वहाँ denormalizing (जो आमतौर पर मामला नहीं है) से निष्पादन लाभ थे, डेटा अखंडता को खोने की कीमत बहुत सही ठहराने के लिए अधिक है।

बस किसी को जो एक विरासत डेटाबेस से सभी अस्पष्ट समस्याओं को ठीक करने के लिए कि क्या वे अच्छे डेटा या तुच्छ गति बढ़ जाती है पसंद करेंगे (अगर कोई है) पर काम करना पड़ा है पूछो।

इसके अलावा

, के रूप में जॉन ने उल्लेख किया है - अगर आप denormalised डेटा की आवश्यकता होगी, तो एक अलग तालिका में इसे बनाने, कच्चे डेटा संरक्षण (गति/रिपोर्टिंग/आदि के लिए) अंत है।

2

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

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

क्या होगा यदि विभाग दो कार्यालयों पर कब्जा कर लेता है?

क्या होगा अगर एक कर्मचारी नाममात्र एक विभाग के अंतर्गत आता है, लेकिन एक अलग कार्यालय के बाहर काम करता है (यह मानते हुए आप शारीरिक कार्यालयों की बात कर रहे)?

1
उदाहरण दिया अनुक्रमित टेबल पर ठीक तरह से स्थापित बहुत तेज होने के लिये जुड़ जाता है और पंक्तियों की लगभग 100,000 करने के लिए अच्छी तरह से स्केल करेगा अनुमति चाहिए में

। यह आमतौर पर वह दृष्टिकोण है जो मैं इस मुद्दे को पाने के लिए लेता हूं।

कई बार डेटा लिखा जाता है और इसके बाकी हिस्सों के लिए चुना जाता है जहां यह वास्तव में हर बार एक दर्जन जुड़ने के लिए समझ में नहीं आता है।

+0

यह लाखों पंक्तियों या उससे अधिक के लिए अच्छी तरह से स्केल करना चाहिए। बहुत कम जुड़ने के साथ यह एक बहुत ही सरल सवाल है। लेकिन आप इंडेक्स के बारे में सही हैं। यदि इस तरह की एक क्वेरी धीमी है, तो आमतौर पर इसका मतलब है कि उन्होंने एफके को इंडेक्स नहीं किया है जो पीकेएस की तरह स्वचालित रूप से अनुक्रमित नहीं हैं। – HLGEM

3

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

3

मैं डीबीए के बारे में अधिक चिंतित हूं जो आपको शामिल होने की लागत के बारे में चेतावनी दे रहे हैं, जब तक कि आप अत्यधिक रोगजनक स्थिति में न हों।

3

आपको बाकी सब कुछ करने से पहले denormalizing को देखना नहीं चाहिए।

क्या यह वास्तव में एक मुद्दा है? क्या आपके डेटाबेस में ऐसी कोई विशेषताएं हैं जिनका उपयोग आप ईमानदारी से समझौता किए बिना चीजों को गति देने के लिए कर सकते हैं? क्या आप कैशिंग द्वारा अपना प्रदर्शन बढ़ा सकते हैं?

1

denormalize मत करो।

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

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

डिजाइन सिद्धांतों के अन्य सेट हैं। वे टेबल डिज़ाइन का नेतृत्व करते हैं जो पूरी तरह सामान्यीकृत से कम होते हैं। लेकिन यह "denormalization" नहीं है। यह सिर्फ एक अलग डिजाइन है, सामान्यीकरण के साथ कुछ हद तक असंगत है।

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

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

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

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

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

यह प्रतिक्रिया आपके मूल प्रश्न पर फैली हुई है, लेकिन मुझे लगता है कि यह डेटाबेस डिजाइनर के लिए प्रासंगिक है।

0

सामान्यीकरण: एक गुणवत्ता निर्णय है।

denormalization: एक प्रदर्शन निर्णय है।

है यही कारण है कि यह कहा जाता है -

मानक के अनुसार जब तक यह दर्द होता है, डी-सामान्य तक यह काम करता है।


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

  1. कितना गैर अतिरेक अपने तालिकाओं के लिए महत्वपूर्ण है?
  2. आप कितनी तेजी से डेटा प्रबंधन चाहते हैं?
  3. आप अपनी टेबल के बीच संबंध कितना स्पष्ट चाहते हैं?

    1. मेरी डेटाबेस की प्रतिक्रिया काफी तेजी से है:

    निम्नलिखित प्रदर्शन निर्णय क्या उच्चतम सामान्य फार्म अपने ग्राहकों/ग्राहकों/आवेदन को स्वीकार्य है बता सकते हैं?

  4. क्या बहुत से मंदी के कारण शामिल हो रहे हैं?

के बाद आप कम से कम तय कर दी है और अपने मामले में सबसे अधिक सामान्य फार्म स्वीकार्य, सामान्य फार्म के बीच कहीं भी उठा।

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