MySQL: कई कॉलम के साथ कई टेबल या एक टेबल?


124

तो यह एक डिजाइन प्रश्न का अधिक है।

मेरे पास एक प्राथमिक कुंजी है (उपयोगकर्ता की आईडी कहो), और मेरे पास उस उपयोगकर्ता से जुड़ी जानकारी है।

क्या मुझे जानकारी के अनुसार कई टेबल को श्रेणियों में विभाजित करना चाहिए, या क्या मेरे पास कई स्तंभों के साथ सिर्फ एक टेबल होनी चाहिए?

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

हाल ही में कुछ लोगों ने मुझे बताया कि यह इस तरह से नहीं करना बेहतर है और बहुत सारे स्तंभों के साथ एक तालिका होना ठीक है। बात यह है, उन सभी स्तंभों में एक ही प्राथमिक कुंजी है।

मैं डेटाबेस डिजाइन के लिए बहुत नया हूँ ताकि कौन सा दृष्टिकोण बेहतर हो और क्या पेशेवरों और विपक्षों के लिए?

इसे करने का पारंपरिक तरीका क्या है?


स्पष्टता के लिए, मुझे गलत होने पर सही करें, लेकिन मुझे लगता है कि "कई तालिकाओं" को लिंक / सहयोगी तालिका के रूप में समझा जा सकता है: en.wikipedia.org/wiki/Associative_entity
cellepo

1
क्या यह डेटाबेस विश्लेषणात्मक उद्देश्यों के लिए या परिचालन / लेनदेन प्रक्रिया के लिए आवश्यक है?
अलेक्जेंडर राडेव

जवाबों:


112

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

यदि डेटा एक-से-कई है (प्रत्येक उपयोगकर्ता के पास उपयोग की जानकारी की हजारों पंक्तियाँ हैं), तो इसे डुप्लिकेट डेटा (डुप्लिकेट डेटा कचरे के भंडारण की जगह, कैश स्थान, और डेटाबेस को बनाए रखने के लिए कठिन बनाता है) को कम करने के लिए अलग-अलग तालिकाओं में विभाजित किया जाना चाहिए। )।

डेटाबेस सामान्यीकरण पर आपको विकिपीडिया लेख दिलचस्प लग सकता है, क्योंकि यह गहराई से इसके कारणों पर चर्चा करता है:

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

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


आपके उत्तर के लिए धन्यवाद, इसलिए इसे पढ़ने के बाद मुझे लगता है कि मैं जिस बारे में बात कर रहा था वह एक-से-एक सूचना स्थिति थी, जब उपयोगकर्ता के पास एक-से-एक कॉलम होते हैं।
जेवियर_एक्स

@Xavier_Ex - हाँ, यदि प्रति उपयोगकर्ता केवल एक स्तंभ है, तो बस एक विशाल उपयोगकर्ता तालिका के साथ काम करना आसान होगा (और DB इंजन को अनुकूलित करने के लिए बहुत आसान है)।
ब्रेंडन लॉन्ग

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

@Xavier_Ex - मैं इसकी सिफारिश नहीं करूंगा। जब आप एक तालिका में आवश्यक सभी डेटा को देख सकते हैं, तो आप बेहतर प्रदर्शन प्राप्त कर सकते हैं (अपभ्रंश लेख देखें)। जोड़ महंगे हैं क्योंकि (1) उन्हें कई स्थानों पर डेटा देखने की आवश्यकता होती है, जिसमें कताई डिस्क पर कांटे शामिल हो सकते हैं, (2) आमतौर पर कई अनुक्रमित और कुछ प्रकार के मर्ज की आवश्यकता होती है, और (3) वे क्वेरी प्लानिंग को कठिन बनाते हैं, जो नहीं केवल समय लगता है, लेकिन यह भी संभावना बढ़ जाती है कि क्वेरी ऑप्टिमाइज़र को कुछ गलत मिलेगा (और बुरी तरह से अनुकूलित प्रश्न वास्तव में धीमा हो सकता है )।
ब्रेंडन लॉन्ग

1
हाल ही में मुझे इसी समस्या का सामना करना पड़ा, क्योंकि MySQL InnoDB तालिकाओं की अपेक्षाकृत छोटी लंबाई सीमा (~ 8000 बाइट्स) है। मेरी समस्या तालिका में (बहुत लंबा बीमा प्रपत्रों, 100 से अधिक स्तंभों से डेटा) हमारे पास कई varchar कॉलम हैं, सभी UTF8 हैं। इसलिए हमने आसानी से ~ 8000 बाइट्स सीमा को भर दिया और हर समय "एरर 139 स्टोरेज इंजन से त्रुटि" प्राप्त की। इसलिए हमें टेबल को विभाजित करना पड़ा। (हमने नए बाराकुडा प्रारूप के साथ परीक्षण किया और यह बिना विभाजन के काम किया, लेकिन हमारे क्लाइंट के सर्वर अभी भी MySQL 5.0 का उपयोग करते हैं)।
एम.वी.

12

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

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


1
आह अलग आवाजें! जो हमेशा महान है। आपकी जानकारी के लिए धन्यवाद! मुझे यकीन है कि जब मैं अपनी टेबल बनाऊंगा तो मुझे इस बात की जानकारी होगी ... लेकिन मुझे नहीं पता था कि मुझे मूल रूप से ऐसे निम्न स्तर के सामानों के बारे में पता होना चाहिए।
ज़ेवियर_एक्स

4

मेरे पास एक अच्छा उदाहरण है। रिश्तों के निम्नलिखित सेट के साथ सामान्य रूप से सामान्यीकृत डेटाबेस:

people -> rel_p2staff -> staff

तथा

people -> rel_p2prosp -> prospects

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

इस तरह के डिजाइन पूरे डेटाबेस के लिए किया जाता है।

अब संबंधों के इस सेट को क्वेरी करने के लिए यह हर बार एक मल्टी-टेबल जॉइन है, कभी-कभी 8 और अधिक टेबल जॉइन करते हैं। यह इस साल के मध्य तक ठीक काम कर रहा है, जब यह अब बहुत धीमी गति से होने लगा है कि हम लोगों के 40000 रिकॉर्ड पिछले हैं।

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

समाधान के लिए एक सीधा संबंध होगा people -> staffऔरpeople -> prospect


यह जानने में रुचि होगी कि पुनर्निर्माण कैसे हुआ? क्या आपने अंत में सिंगल टेबल इनहेरिटेंस के समान कुछ डिज़ाइन किया था जहाँ आप typeएक staffया एक थे prospect?
कोडरमा

1
प्रत्यक्ष संबंध वाले लोगों के साथ गए -> कर्मचारी और लोग -> संभावना, आकर्षण का उपयोग करता है, उपयोग में आसान, क्वेरी के लिए तेज़।
व्लाद

4

इस पार आया, और जैसा कि किसी ने MySQL का उपयोग किया था, और फिर हाल ही में Postgres पर स्विच किया, एक बड़ा लाभ यह है कि आप JSON ऑब्जेक्ट्स को Postgres में एक फ़ील्ड में जोड़ सकते हैं।

इसलिए यदि आप इस स्थिति में हैं, तो आपको कई स्तंभों के साथ एक बड़ी तालिका और इसे विभाजित करने के बीच आवश्यक रूप से निर्णय लेने की ज़रूरत नहीं है, लेकिन आप इसे कम करने के लिए JSON ऑब्जेक्ट्स में स्तंभों को मर्ज कर सकते हैं जैसे पते के बजाय 5 कॉलम, यह बस हो सकता है एक बने। आप उस ऑब्जेक्ट पर भी क्वेरी कर सकते हैं।


क्वेरी के दौरान json ऑब्जेक्ट का उपयोग करते समय वह क्या प्रदर्शन करता है?
डगलती

1
@dagalti प्रदर्शन उन अनुप्रयोगों के लिए ठीक है जो मैंने उस पर उपयोग किए हैं। मैंने इस पर अपना स्वयं का बेंचमार्किंग नहीं किया है, लेकिन यह आपके काम आ सकता है: arangodb.com/2018/02/…
moinhaque

3

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

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

विपक्ष डिजाइन कठिन है, प्रश्न थोड़े अधिक जटिल हो जाते हैं

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


मुझे याद दिलाने के लिए धन्यवाद! इसलिए मेरे मामले में मैं केवल उस मामले पर विचार कर रहा था जहाँ हर उपयोगकर्ता के पास एक से अधिक पंक्ति नहीं हो सकती है इसलिए सभी सूचना क्षेत्र एक-से-एक होते हैं। साथ ही उपयोगकर्ता के पास एक ही तत्व के एक से अधिक उदाहरण नहीं हो सकते हैं क्योंकि मेरा मानना ​​है कि एक तत्व की अवधारणा एक से अधिक स्थानों में मौजूद नहीं हो सकती है। तीसरे प्रश्न के लिए, हाँ, मैं तालिका में अधिक तत्व जोड़ सकता हूं लेकिन वे ऊपर बताई गई आवश्यकताओं को नहीं तोड़ेंगे। मुझे लगता है कि जब मैं एक उपयोगकर्ता के लिए कई पंक्तियों को जोड़ना चाहता हूं, तो माता-पिता / बच्चे की तालिका अच्छी होती है, लेकिन इस मामले में मेरी चिंता यह है कि उपयोगकर्ता के पास एक-से-एक कॉलम हैं।
Xavier_Ex

यहां तक ​​कि अगर सभी तत्व वर्तमान में एक से एक हैं, तो माता-पिता / बच्चे की तालिकाओं वाले आईएमओ की आवश्यकता या इच्छा को कम नहीं करता है। परिवर्तित डेटा का लॉग रखना एक उपयोग है। आलसी लोडिंग ऑब्जेक्ट एक और है। जब एक ही टेबल संरचना के लिए लाभ होते हैं तो माता-पिता के बच्चे के लेआउट के लिए भी लाभ होते हैं (हालांकि मैंने देखा है कि लोग इन के साथ भी चरम सीमा तक जाते हैं)।
ब्रायन

1

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


1
"यदि आप बड़े पैमाने पर रिकॉर्ड बना रहे हैं, तो एक बड़ी तालिका का उपयोग करें .." लेकिन फेसबुक, Google उपयोगकर्ता डेटा को एक ही तालिका में संग्रहीत नहीं करते हैं, उन्होंने उन्हें कई तालिकाओं के रूप में अलग किया है।
यामी ओडिमेल

0

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


जानकारी के लिए धन्यवाद, लेकिन खेद है कि मैं आपके उत्तर को काफी नहीं समझता ... मैं आपके द्वारा पहले उल्लेखित दो
स्कीमाओं

-4

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

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