2009-07-09 40 views
12

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

+0

देखें [इस] (http://omtlab.com/database-what-is-normalization/)। कोडड पन के लिए –

उत्तर

15

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

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

+0

इसलिए यदि कोई डुप्लिकेशन नहीं है तो आपको सामान्य नहीं करना चाहिए? – IAdapter

+0

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

+0

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

4

हम डेटा प्रविष्टि, हटाने, अद्यतन के परिणामस्वरूप उत्पन्न होने वाली विसंगतियों की संभावनाओं को कम करने के लिए सामान्यीकरण का उपयोग करते हैं। सामान्यीकरण प्रदर्शन में वृद्धि नहीं करता है।

इंटरनेट पर बहुत सारी सामग्री है इसलिए मैं फिर से सामान दोहराना नहीं चाहता हूं। लेकिन आप (रूप में अच्छी तरह अन्य) Normalization rules Anomalies पर एक नज़र

6

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

  • एकल टेबल में कोई दोहरा समूहों:

    पहले सामान्य रूप के रूप में संक्षेप किया जा सकता है।

  • संबंधित जानकारी के लिए अलग-अलग टेबल।
  • प्राथमिक कुंजी से संबंधित तालिका में सभी आइटम।

दूसरा सामान्य रूप, एक और प्रतिबंध कहते हैं मूल रूप से है कि एक उम्मीदवार कुंजी प्रत्येक स्तंभ हिस्सा नहीं हर उम्मीदवार पर निर्भर होना चाहिए कुंजी (एक उम्मीदवार कुंजी स्तंभों की एक न्यूनतम सेट जो में दोहराया नहीं जा सकता है के रूप में परिभाषित किया जा रहा टेबल)।

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

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

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

सामान्यीकरण यह सुनिश्चित करने में एक महत्वपूर्ण उपकरण है कि हमारे पास अनावश्यक डेटा नहीं है (जो दो अनावश्यक क्षेत्रों को सिंक से बाहर होने पर वास्तविक समस्या बन जाती है)। यह आम तौर पर प्रदर्शन में वृद्धि नहीं करता है।

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

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


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

+1

+1। – Whymarrh

+0

@philipxy, नहीं मैं अपने पहले बिंदु undetstand यकीन है कि, मैं काफी आसानी से एक कॉलम एक प्रमुख (उदाहरण के लिए, एक पूरी तरह से यादृच्छिक संख्या) के साथ कोई संबंध नहीं है कि जोड़ सकता है - कि निश्चित रूप से 1nF का उल्लंघन होगा, हाँ? दूसरी बात करने के लिए के रूप में, मैं हालांकि वाक्यांश 'कुंजी' इस दिशा में गुमराह कर सकते हैं नहीं देख सकते हैं मेरा उत्तर में 'प्राथमिक' कहीं भी।अगर आपको इससे बचने के बारे में कोई विचार है, तो मुझे बताएं, अन्यथा जब मैं एक वास्तविक कंप्यूटर पर जाता हूं तो मैं इसे एक शॉट दूंगा। – paxdiablo

+0

पुन 1: नहीं, यह नहीं करता है। सामान्यीकरण कुछ अस्पष्ट रोज़मर्रा की अवधि के बारे में नहीं है जैसे "इसके साथ कुछ लेना देना नहीं है"। विशिष्ट परिभाषा के साथ एक विशिष्ट शब्द * * * प्रासंगिक है "कार्यात्मक रूप से निर्भर करता है"। (मुझे लगता है कि "कुंजी" का मतलब है कि आप सीके (उम्मीदवार कुंजी) का मतलब है। सी * की परिभाषा * एक स्तंभ सेट है जिसका उपरोक्त अद्वितीय है और इसमें कोई छोटा स्तंभ सेट नहीं है जिसका subrows अद्वितीय हैं। पुनः "प्रत्येक कॉलम प्रत्येक कुंजी पर निर्भर करता है" अन्य उत्तरों पर मेरी टिप्पणियां देखें। – philipxy

9

सामान्यीकरण "सामान्य" होने की गणितीय अवधारणा से आता है। एक और शब्द "लंबवत" होगा। एक नियमित दो-अक्ष समन्वय प्रणाली की कल्पना करो। आगे बढ़ना y समन्वय को बदलता है, तरफ जाने के लिए बस एक्स समन्वय बदलता है। तो हर आंदोलन को एक किनारे और ऊपर की ओर आंदोलन में तोड़ दिया जा सकता है। ये दोनों एक-दूसरे से स्वतंत्र हैं।

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

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

1

साथ ही सब से ऊपर है, यह सिर्फ एक निश्चित समझ में आता है। मान लें कि आपके पास एक उपयोगकर्ता है और आप रिकॉर्ड करना चाहते हैं कि उनके पास किस तरह की कार है।

सभी को एक टेबल में रखें और फिर आप ठीक हैं, जब तक कि किसी के पास दो कारें न हों ... आपको उस व्यक्ति के लिए दो पंक्तियों की आवश्यकता होगी, और यह सुनिश्चित करने का एक तरीका होगा कि आप उन दोनों को जोड़ सकते हैं कतारें लग ...

और फिर क्या हुआ अगर आप भी रिकॉर्ड करने के लिए कितने कुत्तों वे करना चाहते हैं? बहुत सारी भ्रमित डुप्लिकेट के साथ एक ही टेबल? अद्वितीय उपयोगकर्ताओं को प्रबंधित करने के लिए अपने स्वयं के कस्टम तर्क के साथ एक और तालिका?

सामान्यीकरण आप इन समस्याओं का एक बहुत से दूर रखता है ...

+0

प्रत्येक पते के लिए एक पंक्ति होने के साथ कुछ भी गलत नहीं है।केवल जब कि मौजूद है यह * कुछ अन्य बातें हैं जब * कि सामान्य अनुरूप है ... जैसे जब हम एक से अधिक पते * और * एकाधिक कुत्तों * और * यह घर या कुत्ते प्रति घर प्रति एक कुत्ता नहीं है। तो यह वास्तव में विसंगतियों की व्याख्या नहीं करता है। (स्टीव टेम्पल के जवाब पर मेरी टिप्पणियां देखें।) – philipxy

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