mysql - कितने कॉलम बहुत सारे हैं?


111

मैं एक तालिका स्थापित कर रहा हूं जिसमें 70 कॉलम ऊपर हो सकते हैं। अब मैं इसे विभाजित करने के बारे में सोच रहा हूं क्योंकि हर बार तालिका तक पहुंचने के बाद कॉलम में कुछ डेटा की आवश्यकता नहीं होगी। फिर, अगर मैं ऐसा करता हूं तो मुझे जॉइन करने के लिए छोड़ दिया जाता है।

किस बिंदु पर, यदि कोई है, तो क्या इसे बहुत अधिक कॉलम माना जाता है?


6
हमें हर समय SELECT * का उपयोग नहीं करना है। हमारे पास हमेशा यह विकल्प होता है कि हम किसी दिए गए स्थिति के लिए आवश्यक कॉलमों का चयन करें।
एपीसी

3
70 कॉलम ?! उनमें से कितने अशक्त नहीं हो सकते?
OMG पॉनीज़

1
बड़ा सवाल यह है ... क्या आप अपनी तालिकाओं को सामान्य कर रहे हैं? 70 एक असामान्य राशि है जब तक कि आप जानबूझकर प्रदर्शन के लिए असामान्य नहीं हैं (बहुत कम चीजों में 70 अद्वितीय गुण हैं)। यदि आप प्रदर्शन के लिए निंदा कर रहे हैं, तो मैं ChssPly76 से सहमत होगा कि आप डेटाबेस का उपयोग कर सकते हैं जो आपको दूर ले जाएगा।
गोडके

2
@KM। यह एक मजाक माना जाता है? मैं MySQL के लिए नया हूं और इसे प्राप्त नहीं कर सकता, क्या आपका मतलब है कि JOIN एक अच्छी चीज है या कोशिश करने और बचने के लिए कुछ है?
एलिया इलियासेंको

2
जितना भी जोड़ SQL का एक मुख्य हिस्सा हैं, जुड़ने की खातिर शामिल होने से संभवत: आपके पास जो भी एप्लिकेशन है उसके लिए प्रदर्शन और स्थिरता में कमी आएगी।
जेटीएन

जवाबों:


142

डेटाबेस द्वारा समर्थित अधिकतम सीमा के ऊपर यह बहुत अधिक माना जाता है ।

यह तथ्य कि आपको हर क्वेरी द्वारा लौटाए जाने वाले प्रत्येक कॉलम की आवश्यकता नहीं है, पूरी तरह से सामान्य है; यही कारण है कि सेलेक्ट स्टेटमेंट आपको उन कॉलमों का स्पष्ट रूप से नाम देता है जिनकी आपको आवश्यकता है।

एक सामान्य नियम के रूप में, आपकी तालिका संरचना को आपके डोमेन मॉडल को प्रतिबिंबित करना चाहिए; यदि आपके पास वास्तव में 70 (100, आपके पास क्या है) विशेषताएँ जो एक ही इकाई से संबंधित हैं, तो उन्हें कई तालिकाओं में अलग करने का कोई कारण नहीं है।


29
@ केएम - इसलिए मैंने कहा "डोमेन मॉडल पर एक ही इकाई से संबंधित विशेषताएँ"। तालिका में स्तंभों की उच्च संख्या इसे असामान्य नहीं बनाती है; यह कहा गया है कि कॉलम उस बात का प्रतिनिधित्व करते हैं। इसके अलावा, जबकि सामान्यीकरण निश्चित रूप से एक अच्छी बात है, यह जीवन की सभी समस्याओं का समाधान नहीं है। ट्रिक सवाल - क्या आपको लगता है कि SO प्रश्न / उत्तर के आगे के वोटों की संख्या की गणना select count(*) from votesहर बार की जाती है या क्या आपको लगता है कि शायद यह असामान्य है? क्या यह एसओ डेटाबेस को खराब बनाता है और जेफ एटवुड पागल है?
ChssPly76

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

20
क्या "numberOfTeethPulled" व्यक्ति के रिकॉर्ड का एक हिस्सा होना चाहिए? नहीं, इसे संभवतः संग्रहीत नहीं किया जाना चाहिए - यदि आपके डोमेन मॉडल के लिए इस तरह के स्तर की आवश्यकता है, तो आपको "टूथएक्स्ट्रेक्शन रिकर्ड" से वह जानकारी मिल जाएगी। लेकिन यह तुम्हारा (और, मैं कहता हूँ, बल्कि वंचित) उदाहरण की हिम्मत है - इसका मेरी बात से कोई लेना-देना नहीं है: किसी तालिका में बड़ी संख्या में कॉलम का मतलब यह नहीं है कि तालिका का नामकरण नहीं है। केवल कुछ उदाहरणों के नाम पर रियल एस्टेट कॉन्ट्रैक्ट्स / खरीद ऑर्डर / अन्य वित्तीय दस्तावेजों के बारे में सोचें। क्या उन्हें आगे कई तालिकाओं में विभाजित किया जा सकता है? हाँ। ऐसा करने का कोई कारण? ज़रुरी नहीं।
ChssPly76

1
+1, यह प्रफुल्लित करने वाला था। यदि आप एक और तालिका बना रहे हैं, और यह सिर्फ 1: 1 संबंध होने वाला है, तो आपको संभवतः इसे मुख्य तालिका में शामिल करना चाहिए। यह अंतरिक्ष को बचाने के लिए नहीं जा रहा है, यह बहुत बेहतर प्रदर्शन नहीं करने वाला है यदि आप डेटा का अनुरोध नहीं करते हैं, तो यह तालिका में बिल्कुल भी नहीं है। एकमात्र कानूनी कारण जो मेरे लिए अभी दिमाग में आता है, अगर वहाँ संवेदनशील जानकारी है जैसे कि SSN, क्रेडिट कार्ड की जानकारी, आदि ...
Vandel212

1
अगर मेरे पास एक टेबल में 15 कॉल हैं, और दूसरे में 300 कॉल हैं, तो दो टेबल की प्राथमिक कुंजी समान है। दो तालिकाओं में एक कॉलम का चयन करें, क्या प्रदर्शन में काफी अंतर होगा?
एक प्रस्ताव

28

कुछ स्तंभों के साथ तालिका को विभाजित करने के कुछ लाभ हैं, जिन्हें वर्टिकल विभाजन भी कहा जाता है । यहाँ कुछ है:

  1. यदि आपके पास कई पंक्तियों वाली तालिकाएँ हैं, तो अनुक्रमणिका को संशोधित करने में बहुत लंबा समय लग सकता है, क्योंकि MySQL को तालिका में सभी अनुक्रमणिकाओं के पुनर्निर्माण की आवश्यकता है। कई टेबल पर इंडेक्स के अलग होने से यह और तेज हो सकता है।

  2. आपके प्रश्नों और स्तंभ प्रकारों के आधार पर, MySQL डिस्क पर अस्थायी तालिकाओं (अधिक जटिल चयन क्वेरी में प्रयुक्त) लिख सकता है। यह खराब है, क्योंकि डिस्क i / o एक बड़ी बोतल-गर्दन हो सकती है। यदि आपके पास क्वेरी में बाइनरी डेटा (पाठ या बूँद) है तो यह होता है।

  3. वाइडर टेबल धीमी क्वेरी प्रदर्शन को जन्म दे सकती है।

समय से पहले अनुकूलन न करें, लेकिन कुछ मामलों में, आप संकरी तालिकाओं से सुधार प्राप्त कर सकते हैं।


5
यदि केवल एक ही को संशोधित किया जाता है, तो MySQL को तालिका में सभी अनुक्रमित के पुनर्निर्माण की आवश्यकता क्यों है?
पेट्र पेलर

मेरे मन में इसी का ख्याल आ रहा था । क्यों MySQL तालिका में सभी अनुक्रमितों का पुनर्निर्माण करता है? क्या उपर्युक्त कथन सही है?
मेजर

13

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

निम्न नियमों को विस्तृत तालिका में लागू करें और आप एक ही तालिका में बहुत कम स्तंभों की संभावना रखेंगे।

  1. कोई दोहराए जाने वाले तत्व या तत्वों के समूह नहीं
  2. एक आंशिक कुंजी पर कोई आंशिक निर्भरता नहीं
  3. गैर-प्रमुख विशेषताओं पर कोई निर्भरता नहीं

यहाँ आप के साथ मदद करने के लिए एक कड़ी है।


17
It is pretty hard to get that many columns if you are normalizing your database.जितना मुश्किल लगता है उतना है नहीं।
पेट्र पेलर

5
निश्चित रूप से वह कठिन नहीं है। लोगों को वास्तव में इन भागों के आसपास सामान्य रूपों को समझने की जरूरत नहीं है। आपके पास 10000 कॉलम और STILL सामान्यीकृत हो सकते हैं (उच्चतम सामान्य रूप में भी)।
हज्जाज़मैन

2
@foljs और यही वह जगह है जहाँ पर वियोग का स्वीकृत अभ्यास आता है। यदि आप एक चौराहे पर हैं और एक कार आपको ड्राइव करने वाली है, तो रोशनी के हरे होने का इंतजार करना बेवकूफी होगी। आपको रास्ते से हटना होगा। जबकि लाल बत्ती के माध्यम से जाना तकनीकी रूप से कानूनी नहीं हो सकता है, आप वह कर रहे हैं जो आपको स्पष्ट रूप से स्थिति को देना चाहिए =
विकेंद्रीकरण

3
तुमने मुझे खो दिया जब तुम कारों के बारे में बात करने लगे। प्रासंगिकता क्या है, इसका कोई अंदाजा नहीं है।
JohnFx

2
हालाँकि, आप एकल डेटा टेबल के साथ इस परिदृश्य में जटिल प्रश्न कैसे करते हैं, आप नहीं कर सकते, आपको इस काम को करने के लिए प्रोग्रामिंग भाषा और अन्य सामानों की विविधता पर बहुत भरोसा करना होगा! इसलिए, मैं 170 स्तंभों वाली एक तालिका रखने के लिए वापस जा सकता हूं, क्योंकि "JOIN" प्रश्नों और अतिरिक्त जटिल प्रोग्रामिंग के लिए अलग-अलग तालिकाओं को बनाने की आवश्यकता होती है जो मुझे समय की बर्बादी की तरह लगती है। मुझे लगता है मैं KISS सिद्धांत का एक बड़ा प्रशंसक हूँ।
व्लादिमीर व्लादिमीर हरक्यूलिस

0

यह एक समस्या नहीं है जब तक कि सभी विशेषताएँ एक ही इकाई से संबंधित न हों और एक-दूसरे पर निर्भर न हों। जीवन को आसान बनाने के लिए आपके पास एक टेक्स्ट कॉलम हो सकता है जिसमें JSON सरणी संग्रहीत है। जाहिर है, अगर आपको हर बार सभी विशेषताओं को प्राप्त करने में कोई समस्या नहीं है। यद्यपि यह पूरी तरह से RDBMS में इसे संग्रहीत करने के उद्देश्य को पराजित करेगा और प्रत्येक डेटाबेस लेनदेन को बहुत जटिल करेगा। तो इसकी पूरे डेटाबेस में पालन करने की सिफारिश नहीं की गई है।


0

एक ही तालिका में बहुत सारे कॉलम होने से प्रतिकृति में भी भारी समस्या हो सकती है। आपको पता होना चाहिए कि मास्टर में होने वाले परिवर्तन दास को दोहराएंगे .. उदाहरण के लिए, यदि आप तालिका में एक फ़ील्ड को अपडेट करते हैं, तो पूरी पंक्ति w होगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.