database धपरक प्रत्येक ग्राहक के लिए एक डेटाबेस का उपयोग करने के क्या फायदे हैं?




संबंधपरक डेटाबेस प्रबंधन प्रणाली (8)

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

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

जब तक मैंने सुना कि जोएल (एक अनुभवी डेवलपर) का उल्लेख है कि उसका सॉफ़्टवेयर एक अलग दृष्टिकोण का उपयोग करता है - और मैं उसके निर्णय के साथ थोड़ा उलझन में हूं, तो मुझे "सभी ग्राहकों के लिए एक डेटाबेस" विधि में बहुत भरोसा था ...

मैंने लोगों को उद्धृत किया है कि डेटाबेस बड़ी संख्या में रिकॉर्ड्स के साथ धीमा हो जाते हैं, लेकिन कुछ योग्यता वाले किसी भी रिलेशनल डेटाबेस में यह समस्या नहीं होगी - खासकर अगर उचित इंडेक्स और चाबियाँ उपयोग की जाती हैं।

किसी इनपुट की काफी सराहना की जाती है!


अनुमापकता। सुरक्षा। हमारी कंपनी प्रति ग्राहक दृष्टिकोण 1 डीबी का भी उपयोग करती है। यह कोड को बनाए रखने के लिए थोड़ा आसान बनाता है।


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


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


"डेटाबेस" के कुछ अर्थ हैं

  • हार्डवेयर बॉक्स
  • चल रहे सॉफ़्टवेयर (उदाहरण के लिए "ऑरैकल")
  • डेटा फ़ाइलों का विशेष सेट
  • विशेष लॉगिन या स्कीमा

ऐसा लगता है कि जोएल का मतलब निम्न परतों में से एक है। इस मामले में, यह केवल सॉफ्टवेयर कॉन्फ़िगरेशन प्रबंधन का मामला है ... उदाहरण के लिए, आपको सुरक्षा बग को ठीक करने के लिए 1000 सॉफ़्टवेयर सर्वर पैच करने की आवश्यकता नहीं है।

मुझे लगता है कि यह एक अच्छा विचार है, ताकि एक सॉफ्टवेयर बग ग्राहकों में जानकारी रिसाव न करे। इस मामले की कल्पना एक गलती के साथ करें जहां खंड ने मुझे अपना ग्राहक डेटा और साथ ही अपना खुद का दिखाया।


मान लें कि सभी क्लाइंट को एक डेटाबेस में स्टोर करने के लिए कोई स्केलिंग जुर्माना नहीं है; अधिकांश लोगों के लिए, और अच्छी तरह से कॉन्फ़िगर किए गए डेटाबेस / प्रश्नों के लिए, यह इन दिनों काफी सही होगा। यदि आप इन लोगों में से एक नहीं हैं, तो, एक डेटाबेस का लाभ स्पष्ट है।

इस स्थिति में, लाभ प्रत्येक ग्राहक के encapsulation से आते हैं। कोड परिप्रेक्ष्य से, प्रत्येक ग्राहक अलगाव में मौजूद है - कोई संभावित स्थिति नहीं है जिसमें डेटाबेस अपडेट ओवरराइट, दूषित, पुनर्प्राप्त या किसी अन्य क्लाइंट से संबंधित डेटा को बदल सकता है। यह मॉडल को भी सरल बनाता है, क्योंकि आपको इस तथ्य पर विचार करने की आवश्यकता नहीं है कि रिकॉर्ड किसी अन्य ग्राहक से संबंधित हो सकते हैं।

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

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

आपको आसान संस्करण मिल रहा है - यदि कोई क्लाइंट सॉफ़्टवेयर संस्करण 1.0 पर रहना चाहता है, और दूसरा 2.0 चाहता है, जहां 1.0 और 2.0 विभिन्न डेटाबेस स्कीमा का उपयोग करते हैं, तो कोई समस्या नहीं है - आप उन्हें एक डेटाबेस से बाहर खींचने के बिना माइग्रेट कर सकते हैं।

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


यहां एक दृष्टिकोण है जिसे मैंने पहले देखा है:

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

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

मैंने पाया है कि विशिष्ट डेटा डेटा बहाल करना वास्तव में कठिन होता है जब सभी डेटा एक ही डेटाबेस में होते हैं, लेकिन प्रबंधन का उन्नयन बहुत आसान होता है।

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


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

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

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

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


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





multi-tenant