2009-04-05 12 views
8

मैं अपनी चिंता पर कुछ राय की सराहना करता हूं।डाटाबेस डिजाइन प्रश्न

मैं बुनियादी सामान आप उम्मीद थी, उपयोगकर्ता नाम, पासवर्ड, आदि जैसे के साथ अपने डेटाबेस में एक [उपयोगकर्ता] तालिका है, ...

यह आवेदन है कि मैं प्रत्येक के लिए विशेषताओं की एक विशाल संख्या पर नज़र रखने की आवश्यकता है उपयोगकर्ता। इतना तो, कि मैं संभवतः कॉलम (पंक्ति भंडारण स्थान) से बाहर हो जाऊंगा।

मैं UserID, PropertyKey और PropertyValue कॉलम के साथ UserProperties तालिका जोड़ने का लुत्फ उठा रहा हूं। यह दृष्टिकोण आवश्यकताओं के साथ अच्छी तरह से फिट बैठता है।

मेरी चिंता यह है कि यदि प्रत्येक उपयोगकर्ता में 100 गुण होते हैं, जब डेटाबेस में दस लाख उपयोगकर्ता होते हैं, तो हमारे पास 100,000,000 संपत्ति पंक्तियां होंगी।

मुझे लगता है कि होता है कि UserID पर संकुल अनुक्रमणिका के साथ, कि पहुंच अभी भी तेजी से चिल्ला हो जाएगा, और तुम सच में के रूप में आप मेगा कॉलम दृष्टिकोण के साथ होगा डेटा की समान राशि के बारे में भंडारण कर रहे हैं।

प्रदर्शन चिंताओं पर कोई विचार या विचार? एक बेहतर डीबी डिजाइन के लिए विचार?

धन्यवाद!

अद्यतन:

सबसे पहले, धन्यवाद सभी महान प्रतिक्रिया के लिए बहुत बहुत!

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

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

मैं लिंककॉक्ल का उपयोग कर रहा हूं, और मुझे लगता है कि इस कॉलम के साथ तालिकाओं में सुरुचिपूर्ण हैं, मुझे लगता है कि सभी चुनौतियों और व्यापार-बंदों पर विचार करना, शायद यह सही है, लेकिन मैं अभी भी अन्य राय सुनने के लिए उत्सुक हूं।

उत्तर

11

जो आप वर्णन कर रहे हैं वह एक एंटीटी-एट्रिब्यूट-वैल्यू डेटाबेस है, जिसका अक्सर उपयोग होता है सटीक स्थिति के लिए आप वर्णन करते हैं, एक इकाई से बंधे डेटा को छेड़छाड़ करते हैं।

एक ई-ए-वी तालिका खोजना आसान है। समस्या पंक्तियों को नहीं ढूंढ रही है, यह संबंधित पंक्तियों को ढूंढ रही है।

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

हम आसानी से संपत्ति कुंजी देख सकते हैं, लेकिन इन संपत्तियों को कुछ भी समूह नहीं चांबियाँ।

विकिपीडिया ई-ए-वी पर एक बहुत अच्छा लेख है, लेकिन अब इसे पढ़ा - यह ज्यादातर एक लेखक का काम है, और "सुधार" के लिए उम्मीद है।

+0

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

3

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

1

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

1

तर्कसंगत रूप से गुणों को समूहबद्ध करने का कोई तरीका? आपको हमेशा हर संपत्ति तक पहुंचने की आवश्यकता नहीं हो सकती है। साथ ही, यदि वे तर्कसंगत रूप से समूहीकृत हैं, तो यह समझना आसान होगा कि कौन से गुण उपलब्ध हैं, जहां नए गुण फिट हैं, आदि ...

समूह के साथ कई संबंधों में से एक या एक हो सकता है उपयोगकर्ता ...

+0

ग्रुपिंग को उपयोगकर्ताप्रॉपर्टीज टेबल –

+0

मिच में समूह आईडी जोड़कर जोड़ा जा सकता है, मुझे नहीं लगता कि यह बिंदु था। मुझे लगता है कि यह टेबल आकार पर कटौती करना था। – mpen

+0

'दाएं' इंडेक्स किसी समस्या के तालिका आकार को कम करते हैं –

1

हमने कई परियोजनाओं में उपयोगकर्ताप्रॉपर्टीज रणनीति लागू की है।यह एक आम पैटर्न है और उपयुक्त इंडेक्स के साथ हमने कभी भी प्रदर्शन की समस्या में भाग नहीं लिया है।

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

1

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

+0

सही इंडेक्स और कैशिंग को अक्सर उपयोग किए जाने वाले डेटा –

1

कुछ विकल्प के बारे में सोच सकते हैं:

  • बिट क्षेत्रों: तुम वहाँ में कई मान संग्रहीत कर सकते हैं और आप अधिक क्षेत्रों के रूप में की जरूरत है जोड़ सकते हैं या यहां तक ​​कि एक अलग तालिका का उपयोग
  • सबसे आम सेटिंग्स डाल उपयोगकर्ता तालिका और सेटिंग्स प्रत्येक उपयोगकर्ता एक दूसरी तालिका में नहीं हो सकता है कि
  • केवल सेटिंग्स कि डिफ़ॉल्ट
1

कहा की कमी को देखते हुए से अलग हैं की दुकान में, मुझे नहीं लगता है आप वास्तव में कोई अन्य विकल्प है!

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

में सुधार नहीं हो सकता है अगर आप केवल लगभग 100 गुण बात कर रहे हैं , इसे एक टेबल द्वारा नियंत्रित किया जा सकता है (एमएस-एसक्यूएल अधिकतम में 1023 गैर-कुंजी कॉलम हैं); यदि गुण केवल कम आबादी वाले हैं तो उपयोगकर्ता-विशेषता तालिका संभावित रूप से अधिक स्थान-कुशल हो सकती है (केवल आपका प्रोफाइलर निश्चित रूप से जानता है)

1

मुझे लगता है कि उपयोगकर्ता आईडी पर क्लस्टर इंडेक्स के साथ, यह एक्सेस अभी भी तेजी से चिल्ला रही है, और आप वास्तव में उसी डेटा के बारे में संग्रह कर रहे हैं जैसे आप मेगा-कॉलम दृष्टिकोण के साथ करेंगे।

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

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

7

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

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

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

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

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