क्या वेबप के प्रत्येक ग्राहक के लिए एक नई तालिका बनाना एक अच्छा विचार हो सकता है?


10

यह अर्ध-काल्पनिक है, और जैसा कि मैंने बड़े पैमाने पर डेटाबेस तालिकाओं से निपटने में कोई अनुभव नहीं किया है, मुझे नहीं पता कि यह किसी कारण से भयानक है। स्थिति पर:

एक वेब आधारित एप्लिकेशन की कल्पना करें - अकाउंटिंग सॉफ्टवेयर कहते हैं - जिसमें 20,000 क्लाइंट हैं और प्रत्येक क्लाइंट के पास एक टेबल में 1000+ प्रविष्टियां हैं। यह 20 मिलियन पंक्तियाँ है जो मुझे पता है कि निश्चित रूप से जटिल प्रश्नों को धीमा कर सकती है।

इस तरह के एक मामले में, क्या प्रत्येक ग्राहक के लिए डेटाबेस में एक नई तालिका बनाने के लिए यह अधिक समझ में आता है? 20k (या अधिक!) तालिकाओं के लिए डेटाबेस कैसे प्रतिक्रिया करता है?

जवाबों:


15

आम तौर पर बोलना, नहीं, इसका कोई मतलब नहीं है कि प्रति ग्राहक एक मेज है (मुझे लगता है कि आप वास्तव में यहां डेटाबेस का मतलब है)। डेटाबेस तालिका के लिए 20 मिलियन पंक्तियाँ अपेक्षाकृत छोटी हैं। जब तक डेटाबेस ठीक से ट्यून (अनुक्रमित) है और क्वेरी को सही ढंग से रखा जाता है, तब तक उसके खिलाफ क्वेरी की गति एक मुद्दा नहीं होनी चाहिए। जो भी लाभ आपको लगता है कि आप उन्हें अलग होने से प्राप्त करेंगे, 20,000 व्यक्तिगत डेटाबेस के प्रबंधन की अतिरिक्त जटिलता से ऑफसेट होगा। पूर्व के लिए, क्या होता है जब आप तालिका संरचना को बदलना चाहते हैं? अब आपको इसे 20,000 बार करना होगा!

इससे भी बदतर मामला, यदि आप अंततः यह पाते हैं कि डेटाबेस का आकार एक मुद्दा बन रहा है, तो आप हमेशा उन्हें अलग-अलग डेटाबेस में विभाजित कर सकते हैं।


नहीं, मेरा शाब्दिक अर्थ था डेटाबेस के भीतर टेबल। मैं प्रति ग्राहक डेटाबेस बनाने के लिए एक कारण की कल्पना नहीं कर सकता। और अगर 20 मिलियन पंक्तियाँ छोटी हैं, तो क्या बड़ी है? और आप उस बिंदु पर क्या करते हैं?
होगा

1
@ क्रिस, वास्तव में - ऐसे कई मामले हैं जहां प्रौद्योगिकी या व्यवसाय मॉडल अलग-अलग डीबी के प्रति ग्राहक के लिए कॉल करता है। लेकिन मैं एक ही डीबी के भीतर अलग-अलग तालिकाओं के लिए एक कारण नहीं सोच सकता ।
ग्रैंडमास्टरबी

1
@GrandmasterB - मुझे लगता है कि @Will गलत सवाल पूछ रहा है।
ChrisF

1
@Will: यदि संभव हो, तो Oracle उपयोगकर्ता समूह की बैठक में जाएं, या कुछ अन्य हाई-एंड डेटाबेस के लिए बराबर। आप पाएंगे कि आपके "छोटे" और "बड़े" विचारों को बहुत अधिक पढ़ने की आवश्यकता है। यह मेरे साथ हुआ। संकेत: यदि यह एक डिस्क पर फिट बैठता है, तो यह डीबीए मानकों से बड़ा नहीं है।
डेविड थॉर्नले

1
@Gorton, InnoDB आमतौर पर विश्वसनीयता और सहमति के लिए बेहतर माना जाता है, गति के लिए MyISAM। तो आपको वास्तव में अपने विशिष्ट एप्लिकेशन के अपेक्षित डेटाबेस उपयोग के आधार पर विभिन्न भंडारण इंजनों का मूल्यांकन करने की आवश्यकता है।
ग्रैंडमास्टरबी

5

एक बुरे विचार की तरह लगता है।

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

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


यदि अनुमति दी जाए तो मैं आपके प्रत्येक दो पैराग्राफ के लिए एक बार अपवोट करूंगा।
डेविड थॉर्नले

3

यहाँ एक लेख है जो मैं हमेशा लोगों से पढ़ने का आग्रह करता हूँ, जब वे यह प्रश्न पूछते हैं:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html


मुझे इस बात का अंदाजा नहीं था कि एक डीबी प्रति सारणी = x
विल

1
यह इस्तेमाल किए जाने वाले वास्तविक आरडीबीएमएस पर निर्भर हो सकता है। MySQL ऐसा करता है (यदि आप MyISAM का उपयोग करते हैं तो प्रति टेबल तीन फ़ाइल तक)। दूसरों को नहीं हो सकता है।
Mchl 19

यदि आप इसे इस तरह से डिज़ाइन करते हैं, तो SQL सर्वर का एंटरप्राइज़ संस्करण ऐसा करेगा, लेकिन स्वचालित रूप से नहीं।
जेफओ

ओरेकल निश्चित रूप से ऐसा नहीं करता है।
user281377

ओरेकल ऐसा कर सकता है, उसी तरह जो एसक्यूएल सर्वर कर सकता है, लेकिन मैं कल्पना नहीं कर सकता कि आप अपने स्कीमा को प्रति टेबल एक फाइल रखने के लिए कभी क्यों डिजाइन करेंगे। एक डेटाबेस को कई फ़ाइलों में विभाजित करने से समझ में आता है, लेकिन प्रति तालिका एक फ़ाइल नहीं।
डीन हार्डिंग

1

IMHO एक एकल तालिका में कोई समस्या नहीं होनी चाहिए, इसलिए कोई ऐसा मुद्दा न बनाएं जहां कोई मौजूद न हो - फिर भी। प्रदर्शन में मदद करने के लिए आप बहुत कुछ कर सकते हैं। आप ग्राहक या आईओ के साथ मदद करने के लिए एक दिनांक फ़ील्ड के आधार पर एक ही तालिका को कई फाइलों में विभाजित कर सकते हैं। आपके db को ट्रैक रखने, ऑप्टिमाइज़ करने और हर क्वेरी के लिए 20,000 अलग-अलग sql स्टेटमेंट्स रखने की ज़रूरत नहीं है जो आपको चाहिए। आप clientid द्वारा इंडेक्स कर सकते हैं। 20K क्लाइंट बहुत सारे हार्डवेयर के लिए भुगतान कर सकते हैं।

इस प्रकार की तालिका के लिए, NoSQL प्रकार db का उपयोग किया जा सकता है।

20K क्लाइंट्स के साथ, डेटाबेस आपके सबसे कमजोर लिंक नहीं हो सकता है, तो इस जटिलता को क्यों पेश करें?


`आप क्लाइंट आईडी या IO के साथ मदद करने के लिए एक डेट फ़ील्ड के आधार पर एक ही टेबल को कई फाइलों में विभाजित कर सकते हैं - यह सुनिश्चित करने के लिए कि आपका क्या मतलब है। कोई स्पष्टीकरण?
विल

ऑपरेटिंग सिस्टम पर कई फाइलें। एक सर्वर सिर्फ एक के बजाय कई फाइलों को अधिक पढ़ / लिख सकता है।
19

मुझे लगता है कि मेरा मतलब है: मैंने कभी इस तरह की बात नहीं सुनी, मुझे ऐसा करने के बारे में अधिक जानकारी कहां मिली? :-) लेकिन मैं गूगल मारा जाएगा ~
विल

msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx यदि बैकअप तालिकाएँ अनुक्रमणिका (या शायद ड्राइव?) की तुलना में अलग-अलग फ़ाइलों पर हैं, तो आप बैकअप प्रदर्शन समस्याओं में चला सकते हैं।
20

0

यह वास्तव में बुरा दृष्टिकोण है।

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

User_id द्वारा डेटा को क्रमबद्ध करें और यदि संभव नहीं है तो भारी मात्रा में RAM या SSD डिस्क प्राप्त करें।

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