2011-11-11 13 views
5

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

हालांकि कुछ परीक्षण करने के बाद, मुझे एहसास हुआ कि यह आमतौर पर ऐसा करने का सबसे अच्छा तरीका है, जब बड़े डेटासेट से निपटने के दौरान यह समस्या के "गंदे" दृष्टिकोण के रूप में संदर्भित होने से बहुत धीमी है।

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

हालांकि ऑब्जेक्ट और लिंकर टेबल में शामिल होने के लिए ऑब्जेक्ट और लिंकर टेबल में शामिल होने के लिए, 3 सेकंड तक लग सकते हैं (यह लगभग 400k रिकॉर्ड पर आधारित है, लेकिन प्रति ऑब्जेक्ट केवल 1 लिंक)। हां मैंने इंडेक्स की ई.एस.सी. भी स्थापित की है। कोशिश करने और चीजों को गति देने के लिए।

यदि मैं बजाय लोगों और लिंकर तालिका को हटा देता हूं, और लोगों को ऑब्जेक्ट टेबल में कॉलम के रूप में डालता हूं और सेट करने के लिए 1/0 का उपयोग करता हूं कि प्रत्येक व्यक्ति को उस ऑब्जेक्ट को असाइन किया गया है, तो दो बड़ी टेबलों में शामिल किए बिना मुझे गति दिखाई देगी लगभग 0.3 -> 0.7 सेकेंड (विविधता में भिन्न)।

आरंभ करने के लिए, हमें केवल 2 लोगों की आवश्यकता है। लेकिन अगर मैं इसकी मदद कर सकता हूं तो मैं बहुत ही सीमित नहीं होना चाहता हूं। मुझे पता है कि मैं कैशिंग का उपयोग कर सकता हूं और अंतिम उपयोगकर्ता समय को सुधारने के लिए क्या नहीं कर सकता, लेकिन क्या कोई कारण है कि इसे लिंक टेबल की बजाय कॉलम का उपयोग करना वास्तव में एक बुरा विचार माना जाएगा?

+1

छोटी तस्वीरें स्कीमा से संबंधित प्रश्नों में एक लंबा सफर तय करती हैं। –

+0

सामान्यीकृत करें। अलग-अलग "श्रेणी" कॉलम जोड़ने का एकमात्र समय यह है कि "श्रेणियों" की सूची अच्छी तरह से समझा और सीमित है। आपके मामले में, आप विकसित करने के लिए लोगों की सूची उम्मीद - आप निर्णय को सामान्य बनाने में नहीं के लिए भुगतान करेंगे - मैं वादा करता हूँ :-) – drdwilcox

+1

यहाँ [सामान्यीकरण] (http://www.codinghorror.com/blog पर एक अच्छा पढ़ा है/2008/07/शायद-सामान्य-नहीं है-सामान्य।एचटीएमएल) – Ibu

उत्तर

2

मेरे पास एक समान सेटअप है।
मेरी जॉइन टेबल में 17,000,000 पंक्तियां हैं। मेरी "व्यक्ति" तालिका में 8,400,000 पंक्तियां हैं, और मेरी "ऑब्जेक्ट्स" तालिका में 300,000 पंक्तियां हैं।

मैं कई के साथ जुड़ जाता मेरी मेज और परिणामों की यूनियनों कि पंक्तियों की हजारों लौट सकते हैं और वे 1 सेकंड से कम लेने (50-400ms) को चलाने के लिए मिलती है पर प्रश्न हैं।

मुझे लगता है कि अपने पहले लेआउट ठीक हो सकता है, लेकिन आप शायद अपने अनुक्रमित और प्रश्नों पर ध्यान केंद्रित करने की जरूरत है।

0

लेकिन क्या कोई कारण है कि इसे लिंक टेबल की बजाय कॉलम का उपयोग करना वास्तव में एक बुरा विचार माना जाएगा?

मैं कहूंगा कि यह एक बहुत बुरा विचार है अगर आप प्रदर्शन आप प्राप्त की तुलना में अधिक scalability महत्व देते हैं।

मैं कहूंगा कि यह वास्तव में अच्छा विचार है यदि आप स्केलेबिलिटी से अधिक प्रदर्शन प्राप्त करते हैं।

0

यदि यह सच है कि एक वस्तु एक साथ एक से अधिक व्यक्तियों के साथ हो सकती है ... तो लिंक तालिका रखें।

+0

जहां तक ​​perofrmance - शायद क्वेरी के लिए कुछ समझाया गया योजना दिखाएं ... – Randy

0

विशाल तालिकाओं पर mysql alter table में भी बहुत लंबे समय तक निष्पादित कर सकते हैं ताकि आवेदन में नए उपयोगकर्ता उचित समय में संभव न हों।

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