2009-06-01 7 views
30

डीबी (उदा। MySQL) के लिए स्कीमा को डिज़ाइन करते समय प्रश्न उठता है कि टेबल को पूरी तरह सामान्यीकृत करना है या नहीं।क्या मुझे अपना डीबी सामान्य करना चाहिए या नहीं?

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

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

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

क्या यह तथ्य यह है कि यह डीबी डालने जा रहा है-निर्णय पर भारी असर पड़ता है?

+0

यह एक गंभीर अंतर बनाता है कि आप किस आवेदन के बारे में बात कर रहे हैं। क्या यह उद्यम/व्यापार तर्क या सार्वजनिक वेबसाइट या कुछ और है? –

+0

@ बोगदान, यह एक ऐसी प्रणाली है जो भू-स्थान के साथ कई वस्तुओं को ट्रैक करती है। –

+0

ठीक है, आप लोग मूल रूप से मुझे 5 वें सामान्यीकृत रूप में सीधे डरते हैं। तो धन्यवाद। हालांकि जवाब पढ़ने के लिए अभी भी दिलचस्प है। –

उत्तर

29

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

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

[संपादित करें]

प्रश्न: तो अगर मैं पिछले अनुकूलन, आप डेटा को स्थानांतरित करने के लिए एक उचित तरीका के बाद स्कीमा बदल गया है की सलाह देते हैं कर सकते हैं?उदाहरण के लिए, उदाहरण के लिए, मैं लुकअप टेबल से छुटकारा पाने का निर्णय लेता हूं - मैं इस नए डिज़ाइन के लिए मौजूदा डेटाबेस माइग्रेट कैसे कर सकता हूं?

ए: निश्चित रूप से।

  1. बैकअप बनाएं।
  2. किसी अन्य डिवाइस पर एक और बैकअप बनाएं।
  3. "पुराने टेक्स्ट से नए टेम्पलेट में चुनें ..." टाइप के साथ नई टेबल बनाएं। आपको पहले अलग-अलग तालिकाओं को गठबंधन करने के लिए कुछ जुड़ने की आवश्यकता होगी।
  4. पुरानी टेबल ड्रॉप करें।
  5. नई तालिकाओं का नाम बदलें।

    अपने पूरी तरह से सामान्यीकृत टेबल पर कुछ दृश्यों अभी बनाएँ:

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

वास्तव में अभ्यास में इसके लिए और भी कुछ है, लेकिन यह आपको शुरू करना चाहिए।

+0

इसलिए यदि मैं आखिरी बार अनुकूलित करता हूं, तो क्या आप स्कीमा बदलने के बाद डेटा माइग्रेट करने के उचित तरीके की अनुशंसा कर सकते हैं? यदि, उदाहरण के लिए, मैं एक लुकअप टेबल से छुटकारा पाने का फैसला करता हूं - मैं इस नए डिज़ाइन में मौजूदा डेटाबेस को माइग्रेट कैसे कर सकता हूं? –

+1

यदि आप SQL सर्वर पर हैं, तो "इसके बजाए" ट्रिगर्स देखें। यह मेरा पसंदीदा ट्रिगर है। –

13

आपके डेटाबेस का उपयोग पैटर्न (डालने-भारी बनाम रिपोर्टिंग-भारी) निश्चित रूप से आपके सामान्यीकरण को प्रभावित करेगा। इसके अलावा, यदि आप सामान्यीकृत तालिकाओं के साथ एक महत्वपूर्ण मंदी देख रहे हैं, तो आप अपने अनुक्रमण आदि को देखना चाहेंगे। आप MySQL का कौन सा संस्करण उपयोग कर रहे हैं?

सामान्य रूप से, एक डालने-भारी डेटाबेस एक रिपोर्टिंग-भारी डेटाबेस से सामान्यीकृत होना चाहिए। हालांकि, निश्चित रूप से वाईएमएमवी ...

+1

। क्या आप कृपया विस्तार से बता सकते हैं कि एक डालने-भारी डीबी को सामान्यीकृत क्यों किया जाना चाहिए? वाईएमएमवी? –

+3

सम्मिलित भारी डीबी को अधिक सामान्यीकृत किया जाना चाहिए क्योंकि उनका मुख्य फोकस डेटा कैप्चर कर रहा है। यदि यह लेनदेन है, तो आप एक 3 एनएफ डेटाबेस चाहते हैं। यदि आप एक रिपोर्टिंग डेटाबेस कर रहे हैं जहां मुख्य फोकस जानकारी खींच रहा है, तो आप अर्द्ध-डिमॉर्मलाइज्ड डीबी चाहते हैं। – Eric

+1

"वाईएमएमवी" = "आपका माइलेज मई वेरी", जैसा कि ईंधन माइलेज में कारों के लिए रिपोर्ट किया गया था। दूसरे शब्दों में आपको विशिष्ट मामलों के लिए बिल्कुल वही परिणाम नहीं मिल सकते हैं। – Turnkey

4

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

मैं कहूंगा, हाँ। मुझे बुरी तरह से संरचित डीबी से निपटने के लिए कई बार विचार किया गया था कि वे बिना किसी विचार के 'फ्लैट टेबल' को व्यवस्थित करें।

दरअसल, आमतौर पर सामान्य रूप से सामान्यीकृत डीबी पर सम्मिलन अच्छी तरह से व्यवहार करते हैं, इसलिए यदि यह भारी है तो यह एक कारक नहीं होना चाहिए।

4

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

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

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

यह स्पष्ट होना चाहिए कि denormalisation अपवाद होना चाहिए। किसी भी उत्पादन डेटाबेस में मैं इसके बहुमत की अपेक्षा करता हूं - 95% प्लस - तीसरे सामान्य रूप में होना चाहिए, केवल कुछ हद तक denormalised संरचनाओं के साथ।

4

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

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

4

आपको यह विचार कहां मिला कि "जुड़ता है (और विदेशी कुंजी बाधाएं, आदि) बहुत धीमी हैं"? यह एक बहुत ही अस्पष्ट बयान है, और आम तौर पर आईएमओ में कोई प्रदर्शन समस्या नहीं होती है।

+2

जॉइन मुफ्त नहीं हैं। आपके डीबी को सामान्यीकृत करने के आधार पर, आप परिमाण के क्रम से बहुत धीमे प्रश्नों को देख सकते हैं। दिल में यह प्रत्येक तालिका की सभी पंक्तियों का एक क्रॉस उत्पाद है, जहां जो लोग शामिल होने की स्थिति को संतुष्ट नहीं करते हैं, वे समाप्त हो जाते हैं। यह संभवतः अनुकूलित किया गया है, लेकिन फिर भी यह एक बहुत महंगा ऑपरेशन है। –

+1

@Assaf: OTOH, आपके पास कम डेटा हो सकता है, इसलिए डेटा रैम में फिट बैठता है। और आपका दावा है कि "दिल में यह एक क्रॉस उत्पाद है ..." बस सादा गलत है। यह एक जुड़ाव है, और कुछ नहीं, कुछ भी कम नहीं है। – erikkallen

+4

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

4

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

समय-समय पर डेटा के साथ डेटाबेस को अनुकूलित न करें। यह चल रही डेटा अखंडता समस्याओं के लिए एक नुस्खा है। साथ ही, denormalised डेटा को प्रबंधित करने के लिए हमेशा डेटाबेस ट्रिगर्स का उपयोग करें - एप्लिकेशन पर भरोसा न करें इसे करें।

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

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

2

मैं नहीं जानता कि यदि आप एक डेटाबेस बनाने के बारे में क्या मतलब द्वारा-पुस्तक क्योंकि ज्यादातर किताबें मैं डेटाबेस के बारे में पढ़ा है अनुकूलन के बारे में एक विषय है जो डेटाबेस डिजाइन denormalizing के रूप में एक ही बात है शामिल हैं।

यह एक शेष कार्य है इसलिए समय-समय पर अनुकूलन न करें। कारण यह है कि denormalized डेटाबेस डिजाइन के साथ काम करना मुश्किल हो जाता है। आपको कुछ मीट्रिक की आवश्यकता होगी ताकि गीलेर का फैसला करने के लिए डेटाबेस पर कुछ तनाव-परीक्षण करें या आप denormalize नहीं करना चाहते हैं।

तो रखरखाव के लिए सामान्यीकृत करें लेकिन अनुकूलन के लिए denormalize।

7

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

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

और सामान्यीकरण सामान्य डिजाइन के साथ समाप्त करने का एकमात्र तरीका है ...

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