2008-09-18 24 views
9

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

क्या दूसरी तालिका, people_tb बनाना उचित है, यह मुख्य संबंध तालिका और डेटा स्टोर है, और प्रमाणीकरण के लिए केवल users_tb का उपयोग करें? people_tb से user_tb को अलग करने से कोई समस्या उत्पन्न होती है? यदि यह आमतौर पर किया जाता है, तो कुछ रणनीतियों और समाधानों के साथ-साथ कमियां क्या होती हैं?

उत्तर

8

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

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

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

मेरे आवेदन में, मैं इसे रूबी पर रूबी में लिख रहा हूं, इसलिए मैं लगातार कर्मचारी.यूसर.नाम जैसी चीजें कर रहा हूं, जहां मैं उन्हें एक साथ रखता हूं, तो यह केवल कर्मचारी होगा। नाम या उपयोगकर्ता नाम ।

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

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

1

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

3

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

0

मैं हमेशा जितना संभव हो उतना डेटा पुनरावृत्ति से बचने की कोशिश करता हूं। यदि सभी लोगों को लॉगिन करने की आवश्यकता नहीं है, तो आपके पास एक सामान्य people तालिका हो सकती है जो जानकारी दोनों लोगों और उपयोगकर्ताओं (जैसे। Firstname, lastname, आदि) पर लागू होती है।

फिर लॉगिन करने वाले लोगों के लिए, आपके पास users तालिका हो सकती है जिसमें people के साथ 1 ~ 1 संबंध हो। यह तालिका उपयोगकर्ता नाम और पासवर्ड स्टोर कर सकती है।

0

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

+2

ध्यान दें कि यूयूआईडीएस (एमएस भूमि में GUID) वास्तव में कई मामलों में खराब कुंजी बनाते हैं क्योंकि उनकी यादृच्छिकता और आकार इंडेक्सिंग तंत्र को हरा देता है। जब संभव हो तो एक सरल पूर्णांक का उपयोग करना बेहतर होता है। –

0

मैं कहूंगा कि सामान्यीकृत डिज़ाइन (दो टेबल) के लिए जाएं और केवल denormalize (एक उपयोगकर्ता/व्यक्ति तालिका पर जाएं) यदि यह वास्तव में आपके जीवन को लाइन के नीचे आसान बना देगा। यदि व्यावहारिक रूप से सभी लोग भी उपयोगकर्ता हैं तो सामने को denormalize करने के लिए यह आसान हो सकता है। यह आप पर निर्भर करता है; मैंने समस्याओं के बिना सामान्यीकृत दृष्टिकोण का उपयोग किया है।

0

बहुत उचित।

उदाहरण के तौर पर, aspnet_ * सेवा तालिका here पर एक नज़र डालें।

उनके स्कीमा में बनाया गया है एक aspnet_Users और aspnet_Membership बाद में तालिका (आदि टुकड़ों में बांटा पासवर्ड,) किसी दिए गए उपयोगकर्ता के बारे में अधिक विस्तृत जानकारी लेकिन aspnet_User.UserID होने के साथ रेफेरेंन्शिअल सत्यनिष्ठा के लिए आदि

स्कीमा के अन्य भागों में प्रयोग किया जाता है

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

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