उपयोगकर्ता और उपयोगकर्ता प्रोफ़ाइल को अलग-अलग तालिकाओं में रखें?


26

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



1
@ मिचेट धन्यवाद! दिलचस्प है कि सभी जुड़े सवालों पर एकमत नहीं है।
एंड्री

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

1
@MichaelT मैं सामान्यीकृत ढांचे को बनाने के बारे में सोच रहा हूं जो उपयोगकर्ता मॉडल प्रदान करेगा।
एंड्री

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

जवाबों:


11

यह आपके प्रोजेक्ट के आकार और आवश्यकताओं पर निर्भर करता है।

मैं एक तरीका देख सकता हूं जिसमें उपयोगकर्ताओं के बारे में डेटा को दो सेटों में विभाजित किया जा सकता है, विभिन्न उद्देश्यों और इस प्रकार आवश्यकताओं के साथ:

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

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

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

इस प्रकार, आमतौर पर डेटा को दो प्रकार की प्रणालियों में संग्रहीत किया जाता है:

  • पहचान डेटा आमतौर पर एक निर्देशिका या IAM समाधान में जाएगा।
  • प्राथमिकता डेटा एक डेटाबेस में समाप्त हो जाएगा।

यह कहते हुए कि, व्यवहार में, लोग इन नियमों का उल्लंघन करेंगे और एक या दूसरे (जैसे ASP.NET सदस्यता प्रदाता के पीछे SQL सर्वर) का उपयोग करेंगे।

जैसे-जैसे पहचान डेटा बड़ा होता जाता है या इसका उपयोग करने वाला संगठन बड़ा होता जाता है, विभिन्न प्रकार की समस्याएं बढ़ती जाती हैं। उदाहरण के लिए, निर्देशिका के मामले में, यह बहु-सर्वर वातावरण में सभी सर्वरों में तुरंत पासवर्ड परिवर्तन को दोहराने का प्रयास करेगा। हालांकि, उपयोगकर्ता वरीयता को केवल अंतिम स्थिरता की आवश्यकता होती है। (FYI करें: ये दोनों CAPS प्रमेय के विभिन्न अनुकूलन हैं।)

अंत में, डायरेक्टरी (esp। ऑनलाइन / क्लाउड डाइरेक्टरी) OAUTH (जैसे Facebook, Google, Microsoft Account, ADFS) जैसे प्रोटोकॉल का उपयोग करते हुए अन्य संसाधनों के लिए एक्सेस टोकन भी जारी करेगी, जबकि एक डेटाबेस को ऐसी कोई आवश्यकता नहीं है। एक डेटाबेस काफी जटिल जोड़ और क्वेरी संरचना का समर्थन करेगा, जिसे निर्देशिका की आवश्यकता नहीं है।

अधिक जानकारी के लिए, पहचान निर्देशिका बनाम डेटाबेस पर कुछ खोजों से मदद मिलेगी।

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

यदि आप DB, IMO के लिए जाते हैं, तो एक DB बनाम दो का उपयोग करके अंततः उपयोगकर्ताओं और अनुप्रयोगों दोनों के लिए, अभिगम नियंत्रण में कमी आएगी।


3

बुनियादी विशेषताओं के लिए व्यक्ति तालिका होने पर, कम से कम, तीन मामले हैं और एक-से-एक संबंध के साथ अन्य विशेषताओं के लिए दूसरी तालिका वांछनीय है:

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

मुझे लगता है कि आप जिस मामले का खुलासा करते हैं वह दूसरे मामले में फिट बैठता है।


1

उन्हें अलग रखने का मेरा मुख्य कारण ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में to गॉड क्लास ’के रूप में जाने जाने की कोशिश करना और बचना है। ORM का संबंध तालिका और फ़ील्ड से लेकर कक्षाओं और विशेषताओं तक है, इसलिए यह SQL स्तर के रूप में भी प्रासंगिक हो जाता है (यहां तक ​​कि ORM के बिना भी समान रूप से खेलने पर एक समान सिद्धांत है)।

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

तो उपयोगकर्ता से अलग होने से पता चलता है। व्यक्ति, उपयोगकर्ता, खाता हो सकता है और चिंताओं का पृथक्करण थोड़ा कृत्रिम लग सकता है, लेकिन यह प्रयास करना है और जटिलता से बचना है और यह सुनिश्चित करना है कि प्रत्येक वस्तु केवल डेटा के 1 पहलू के बारे में चिंतित है।


2
यहां तक ​​कि फूला हुआ उपयोगकर्ता वर्ग अभी भी एक ईश्वर वर्ग की आवश्यकता नहीं है। यह उपयोगकर्ता से संबंधित तर्क (जो बड़ी परियोजनाओं में जटिल हो सकता है) के साथ फूला हुआ हो सकता है, लेकिन अगर यह असंबंधित तर्क को शामिल नहीं करता है तो मुझे बड़ी समस्या नहीं दिखती है। मुझे यकीन नहीं है कि 2 में 1 वर्ग को तोड़ने से भगवान कक्षा समस्या का समाधान कैसे होगा।
एंड्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.