Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एकाधिक स्तंभों के साथ एकल निश्चित तालिका बनाम लचीली सार सारणी

कुछ मुद्दों को पहले . स्पष्ट और हल करने की आवश्यकता है हम एक उचित चर्चा में प्रवेश कर सकते हैं।

पूर्व-आवश्यक समाधान

  1. लेबल
    एक ऐसे पेशे में जो सटीकता की मांग करता है, यह महत्वपूर्ण है कि हम सटीक लेबल का उपयोग करें, भ्रम से बचने के लिए, और ताकि हम लंबे-चौड़े विवरण और क्वालिफायर का उपयोग किए बिना संवाद कर सकें।

    आपने FixedTables के रूप में जो पोस्ट किया है, वह असामान्यीकृत . है . पर्याप्त रूप से, यह तीसरे सामान्य रूप में एक प्रयास हो सकता है, लेकिन वास्तव में यह एक फ्लैट फ़ाइल है, असामान्य ("असामान्यीकृत" नहीं)। आपने एब्सट्रैक्टटेबल्स के रूप में जो पोस्ट किया है, वह सटीक है, इकाई-विशेषता-मूल्य , जो लगभग है, लेकिन काफी नहीं, छठा सामान्य रूप है, और इसलिए 3NF से अधिक सामान्यीकृत है। यह मानते हुए कि यह सही ढंग से किया गया है।

    • असामान्य फ्लैट फ़ाइल "असामान्यीकृत" नहीं है। यह दोहराव से भरा हुआ है (दोहराए जाने वाले समूहों और डुप्लिकेट कॉलम को हटाने या निर्भरताओं को हल करने के लिए कुछ भी नहीं किया गया है) और नल, यह कई मायनों में एक प्रदर्शन हॉग है, और समेकन को रोकता है।

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

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

    • सामान्यीकृत संरचनाएं असामान्य संरचनाओं की तुलना में कहीं बेहतर प्रदर्शन करती हैं। अधिक सामान्यीकृत संरचनाएं (EAV/6NF) कम सामान्यीकृत संरचनाओं (3NF/5NF) की तुलना में बेहतर प्रदर्शन करती हैं।

    • मैं OMG Ponies के जोर से सहमत हूं, लेकिन उनके लेबल और परिभाषाओं से नहीं

    • यह कहने के बजाय कि '"असामान्यीकरण" न करें जब तक कि आपको ऐसा न करना पड़े' , मैं कह रहा हूँ, 'ईमानदारी से सामान्य करें, अवधि' और 'यदि कोई प्रदर्शन समस्या है, तो आपने सही ढंग से सामान्यीकृत नहीं किया है'

  2. विकिपीडिया
    सामान्य प्रपत्रों और सामान्यीकरण के लिए प्रविष्टियाँ ऐसी परिभाषाएँ प्रस्तुत करती हैं जो गलत हैं; वे सामान्य रूपों को भ्रमित करते हैं; वे सामान्यीकरण की प्रक्रिया के बारे में कमी कर रहे हैं; और वे बेतुके या संदिग्ध एनएफ को समान महत्व देते हैं जिन्हें बहुत पहले खारिज कर दिया गया था। नतीजा यह है कि विकिपीडिया पहले से ही भ्रमित और शायद ही कभी समझे जाने वाले विषय में जुड़ जाता है। तो अपना समय बर्बाद मत करो।

    हालाँकि, प्रगति के लिए, उस संदर्भ में बाधा उत्पन्न किए बिना, मुझे यह कहने दो।

    • 3NF की परिभाषा स्थिर है, और नहीं बदली है।
    • 3NF और 5NF के बीच NF को लेकर बहुत भ्रम है। सच तो यह है कि यह एक ऐसा क्षेत्र है जो पिछले 15 वर्षों में विकसित हुआ है; और कई संगठनों, शिक्षाविदों के साथ-साथ विक्रेताओं ने अपने उत्पादों की सीमाओं के साथ, अपने प्रसाद को मान्य करने के लिए एक नया "सामान्य फॉर्म" बनाने के लिए छलांग लगाई। सभी व्यावसायिक हितों की सेवा कर रहे हैं और अकादमिक रूप से अस्वस्थ हैं। 3NF अपनी मूल छेड़छाड़ नहीं की स्थिति में कुछ विशेषताओं का इरादा और गारंटी देता है।
    • कुल योग है, 5एनएफ आज है, जो 3एनएफ 15 साल पहले होने का इरादा था, और आप वाणिज्यिक मजाक और बारह या तो "विशेष" (वाणिज्यिक और छद्म-शैक्षणिक) एनएफ को बीच में छोड़ सकते हैं, कुछ जिनमें से विकिपीडिया में और यहां तक ​​कि भ्रमित करने वाले शब्दों में पहचाने जाते हैं।
  3. पांचवां सामान्य रूप
    चूंकि आप अपनी पोस्ट में ईएवी को समझने और लागू करने में सक्षम हैं, इसलिए आपको निम्नलिखित को समझने में कोई समस्या नहीं होगी। बेशक एक सच्चा रिलेशनल मॉडल पूर्व-आवश्यक, मजबूत कुंजी आदि है। पांचवां सामान्य फॉर्म है, क्योंकि हम चौथे को छोड़ रहे हैं:

    • तीसरा सामान्य रूप
      • जो सरल निश्चित शब्दों में है, प्रत्येक तालिका में प्रत्येक गैर-कुंजी कॉलम का तालिका की प्राथमिक कुंजी से 1::1 संबंध होता है,
      • और कोई अन्य गैर-कुंजी कॉलम नहीं
    • शून्य डेटा दोहराव (परिणाम, यदि सामान्यीकरण को परिश्रम से आगे बढ़ाया जाता है; केवल बुद्धि या अनुभव से प्राप्त नहीं किया जाता है, या औपचारिक प्रक्रिया के बिना लक्ष्य के रूप में इसके लिए काम करके)
    • कोई अद्यतन विसंगतियाँ नहीं (जब आप किसी कॉलम को कहीं अपडेट करते हैं, तो आपको कहीं और स्थित उसी कॉलम को अपडेट करने की आवश्यकता नहीं होती है; कॉलम एक और केवल एक ही स्थान पर मौजूद होता है)।
    • यदि आप उपरोक्त को समझते हैं, 4NF, BCNF, और सभी मूर्खतापूर्ण "NFs" को खारिज किया जा सकता है, तो वे भौतिक रूप से रिकॉर्ड फाइलिंग सिस्टम के लिए आवश्यक हैं, जैसा कि शिक्षाविदों द्वारा प्रचारित किया जाता है, रिलेशनल मॉडल (Codd) के लिए काफी अलग है।
    • ली>
  4. छठा सामान्य रूप

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

    अंतर यह है:क्योंकि यह ढीला है, और क्योंकि कार्यान्वयनकर्ताओं के पास वफादार होने के लिए एक संदर्भ (6NF) नहीं है, वे केवल वही लागू करते हैं जो उन्हें चाहिए, और वे इसे कोड में लिखते हैं; जो अंत में एक असंगत मॉडल बन जाता है।

    जबकि, एक शुद्ध 6NF कार्यान्वयन में एक शुद्ध शैक्षणिक संदर्भ बिंदु होता है, और इस प्रकार यह आमतौर पर सख्त और सुसंगत होता है। आमतौर पर यह दो दृश्य तत्वों में दिखाई देता है:

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

उदा. कैटलॉग के साथ 6NF डेटाबेस के लिए, मेरे पास प्रोसेस का एक सेट है जो सभी SELECT को करने के लिए आवश्यक SQL [re] जेनरेट करेगा, और मैं सभी उपयोगकर्ताओं के लिए 5NF में व्यू प्रदान करता हूं, इसलिए उन्हें अंतर्निहित 6NF संरचना को जानने या समझने की आवश्यकता नहीं है। . उन्हें कैटलॉग से बाहर कर दिया जाता है। इस प्रकार परिवर्तन आसान और स्वचालित हैं। कैटलॉग की अनुपस्थिति के कारण EAV प्रकार मैन्युअल रूप से ऐसा करते हैं।

चर्चा

अब, हम चर्चा शुरू कर सकते हैं।

<ब्लॉकक्वॉट>

"बेशक यह अधिक सारगर्भित हो सकता है यदि मूल्य पूर्वनिर्धारित हैं (उदाहरण:विशिष्टताओं की अपनी सूची हो सकती है)"

ज़रूर। लेकिन बहुत "सार" मत बनो। निरंतरता बनाए रखें और ऐसी सूचियों को अन्य सूचियों की तरह ही EAV (या 6NF) तरीके से लागू करें।

<ब्लॉकक्वॉट>

"अगर मैं अमूर्त दृष्टिकोण अपनाता हूं तो यह बहुत लचीला हो सकता है, लेकिन बहुत से जुड़ने के साथ प्रश्न अधिक जटिल होंगे। लेकिन मुझे नहीं पता कि यह प्रदर्शन को प्रभावित करता है, इन 'अधिक जटिल' प्रश्नों को निष्पादित करता है।"

  1. जॉइन रिलेशनल डेटाबेस में पैदल यात्री हैं। समस्या डेटाबेस नहीं है, समस्या यह है कि SQL जॉइन करते समय बोझिल है, विशेष रूप से कंपाउंड कुंजियाँ।

  2. EAV और 6NF डेटाबेस में अधिक जॉइन होते हैं, जो पैदल यात्री के रूप में, अधिक नहीं, कम नहीं। यदि आपको प्रत्येक चयन को मैन्युअल रूप से कोड करना है, तो निश्चित रूप से, बोझिल वास्तव में बोझिल हो जाता है।

  3. पूरी समस्या को (ए) ईएवी पर 6एनएफ के साथ जाने और (बी) एक कैटलॉग को लागू करने से समाप्त किया जा सकता है, जिससे आप (सी) सभी मूल एसक्यूएल उत्पन्न कर सकते हैं। त्रुटियों की एक पूरी श्रेणी को भी समाप्त करता है।

  4. यह एक आम मिथक है कि किसी भी तरह से जुड़ने की लागत होती है। पूरी तरह से झूठ।

    • जॉइन को कंपाइल समय पर लागू किया जाता है, CPU चक्रों को 'लागत' करने के लिए कुछ भी नहीं है।
    • समस्या है तालिकाओं का आकार शामिल होना, उन्हीं तालिकाओं के बीच शामिल होने की लागत नहीं।
    • एक सही PK⇢FK संबंध पर लाखों पंक्तियों के साथ दो तालिकाओं में शामिल होना, जिनमें से प्रत्येक में उपयुक्त सूचकांक हैं
      (माता-पिता [पीके] पक्ष पर अद्वितीय; बच्चे के पक्ष में अद्वितीय [पीके =माता-पिता FK + कुछ]
      तात्कालिक है
    • जहां चाइल्ड इंडेक्स अद्वितीय नहीं है, लेकिन कम से कम प्रमुख कॉलम मान्य हैं, यह धीमा है; जहां कोई उपयोगी सूचकांक नहीं है, निश्चित रूप से यह बहुत धीमा है।
    • इसका जॉइन कॉस्ट से कोई लेना-देना नहीं है।
    • जहां कई पंक्तियों को वापस किया जाता है, अड़चन नेटवर्क और डिस्क लेआउट होगी; जॉइन प्रोसेसिंग नहीं।
  5. इसलिए आप जितना चाहें "जटिल" प्राप्त कर सकते हैं, इसकी कोई कीमत नहीं है, SQL इसे संभाल सकता है।

<ब्लॉकक्वॉट>

मुझे यह जानने में दिलचस्पी होगी कि दोनों विधियों के ऊपर और नीचे क्या हैं। मैं केवल अपने लिए कल्पना कर सकता हूं, लेकिन मेरे पास इसकी पुष्टि करने का अनुभव नहीं है।

  1. 5NF (या 3NF उन लोगों के लिए जिन्होंने प्रगति नहीं की है) कार्यान्वयन के मामले में सबसे आसान और सर्वोत्तम है; उपयोग में आसानी (डेवलपर्स और साथ ही उपयोगकर्ता); और रखरखाव।

    • दोष यह है कि हर बार जब आप कोई कॉलम जोड़ते हैं, तो आपको डेटाबेस संरचना (टेबल डीडीएल) को बदलना पड़ता है। यह कुछ मामलों में ठीक है, लेकिन ज्यादातर मामलों में नहीं, जगह में परिवर्तन नियंत्रण के कारण, काफी कठिन है।
    • दूसरा, आपको मौजूदा कोड को बदलना होगा (नए कॉलम को संभालने वाले कोड की गणना नहीं की जाती है, क्योंकि यह एक अनिवार्य है):जहां अच्छे मानकों को लागू किया जाता है, वह कम से कम होता है; जहां वे अनुपस्थित हैं, वहां गुंजाइश अप्रत्याशित है।
  2. ईएवी (जो आपने पोस्ट किया है), डीडीएल परिवर्तनों के बिना कॉलम जोड़ने की अनुमति देता है। यही कारण है कि लोग इसे चुनते हैं। (नए कॉलम को संभालने वाले कोड की गणना नहीं की जाती है, क्योंकि यह एक अनिवार्यता है)। अगर अच्छी तरह से लागू किया जाता है, तो यह मौजूदा कोड को प्रभावित नहीं करेगा; यदि नहीं, तो यह होगा।

  3. लेकिन आपको ईएवी-सक्षम डेवलपर्स की आवश्यकता है।

    • जब ईएवी को बुरी तरह से लागू किया जाता है, तो यह घिनौना होता है, 5 एनएफ से भी बदतर गड़बड़ी बुरी तरह से की जाती है, लेकिन असामान्य से भी बदतर नहीं है, जो कि वहां के अधिकांश डेटाबेस हैं (गलत तरीके से "प्रदर्शन के लिए असामान्य" के रूप में प्रस्तुत किया गया है)।
    • बेशक, एक मजबूत लेन-देन संदर्भ रखने के लिए (5NF/3NF की तुलना में) और भी अधिक महत्वपूर्ण है, क्योंकि कॉलम कहीं अधिक वितरित हैं।
    • इसी तरह, डिक्लेरेटिव रेफरेंशियल इंटिग्रिटी को बनाए रखना आवश्यक है:मैंने जो गड़बड़ी देखी है, वह बड़े हिस्से में डीआरआई को हटाने वाले डेवलपर्स के कारण थी क्योंकि यह "बनाए रखने के लिए बहुत कठिन" हो गया था, परिणाम था, जैसा कि आप कल्पना कर सकते हैं, एक माँ सभी जगह डुप्लिकेट 3NF/5NF पंक्तियों और स्तंभों के साथ डेटा हीप का। और असंगत नल हैंडलिंग।
  4. प्रदर्शन में कोई अंतर नहीं है, यह मानते हुए कि सर्वर को इच्छित उद्देश्य के लिए यथोचित रूप से कॉन्फ़िगर किया गया है। (ठीक है, ऐसे विशिष्ट अनुकूलन हैं जो केवल 6NF में संभव हैं, जो अन्य NF में संभव नहीं हैं, लेकिन मुझे लगता है कि यह इस धागे के दायरे से बाहर है।) और फिर से, बुरी तरह से किया गया EAV अनावश्यक बाधाओं का कारण बन सकता है, इससे अधिक नहीं असामान्य।

  5. बेशक, यदि आप ईएवी के साथ जाते हैं, तो मैं अधिक औपचारिकता की सिफारिश कर रहा हूं; पूर्ण क्विड खरीदें; 6NF के साथ जाओ; एक कैटलॉग लागू करें; एसक्यूएल का उत्पादन करने के लिए उपयोगिताओं; दृश्य; लापता डेटा को लगातार संभालना; नल को पूरी तरह से हटा दें। यह आपके डेवलपर्स की गुणवत्ता के प्रति आपकी भेद्यता को कम करता है; वे EAV/6NF गूढ़ मुद्दों के बारे में भूल सकते हैं, दृश्यों का उपयोग कर सकते हैं और ऐप लॉजिक पर ध्यान केंद्रित कर सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL प्रदर्शन:MySQL डेटाबेस इंडेक्सिंग का लाभ कैसे उठाएं

  2. पैरामीटर के साथ MySQL संग्रहीत प्रक्रिया

  3. डेटा के दो सेट को दो अलग-अलग जहां क्लॉज के साथ वापस करने की आवश्यकता है

  4. MySQL में कैलेंडर ईवेंट और रिमाइंडर के लिए डेटाबेस डिज़ाइन करने के लिए मार्गदर्शिका

  5. पीएचपी पीडीओ तैयार बयान