2011-10-17 9 views
6

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

अब, हमारे पास हजारों प्रश्न और हजारों उपयोगकर्ता होंगे। चूंकि प्रत्येक प्रश्न में कम से कम 4 उत्तर होंगे और हम भी दिए गए गलत उत्तरों को ट्रैक करना चाहते हैं, मेरा सवाल यह है कि: इस विशेष मामले में, क्या प्रति उपयोगकर्ता एक टेबल रखना समझ में आता है?

मुझे पता है कि तालिका-प्रति-उपयोगकर्ता प्रश्न पहले से ही पूछा गया है (here, उदाहरण के लिए), लेकिन मुझे लगता है कि यह वास्तव में एक अलग मामला है।

तो: हजारों पंक्तियों के साथ लाखों पंक्तियों या हजारों तालिकाओं वाली एक तालिका?

+3

इसे किसने चिह्नित किया? ओपी विकल्पों के बारे में पूछ रहा है। यदि आप एक प्रश्न को नीचे चिह्नित करते हैं क्योंकि ओपी पहली जगह सही नहीं था, तो यह विकी होगा और क्यू एंड ए फोरम नहीं होगा। शीश। – MatBailie

उत्तर

7

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

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

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

+3

+1: सामान्यीकरण, प्राथमिक और विदेशी कुंजी, इंडेक्स आदि के सही उपयोग के साथ, आपको कभी भी प्रति उपयोगकर्ता एक टेबल की आवश्यकता नहीं है। यहाँ अनुशासनिक है; क्या आपको कभी ओओ भाषा में प्रति उपयोगकर्ता एक नई कक्षा की आवश्यकता होगी? – MatBailie

1

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

+0

हम MySQL का उपयोग करने की योजना बना रहे हैं, ताकि हमारे सर्वर पर यह संभव हो। मैं उस विकल्प को देख लूंगा। हर किसी से इस तरह की एक निश्चित प्रतिक्रिया सुनना अच्छा है। मुझे लगता है कि मैं एक टेबल-समाधान के साथ बेहतर तरीके से जाऊंगा। धन्यवाद! – Jonas

4

सामान्य उत्तर यह है कि "प्रति उपयोगकर्ता तालिका" एक भयानक डिज़ाइन है, और सरल समाधान स्वामित्व की पहचान करने के लिए एक अतिरिक्त फ़ील्ड के साथ एक एकल तालिका है।

उदा।

table_1 table_2 table_3 ...... table_999999999 
id  id   id    id 
...  ...  ...   ... 

रहा है

table 
id 
user 
... 

होने जबकि संसाधनों के एक बड़े पैमाने पर बेकार, अब तक का प्रतिनिधित्व करने के लिए आसान है।

+0

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

+0

आपके पास इस तरह के कुछ फ़ील्ड के साथ एक टेबल हो सकती है ... 'उपयोगकर्ता आईडी, टेस्टआईडी, प्रश्न आईडी, सबमिट किए गए AnswersID, TimeSubmitted, ThinkingTime'। फिर आपकी सभी उपयोगकर्ता जानकारी एक तालिका में जाती है, आपकी तालिका की दूसरी तालिका में टेस्ट जानकारी, किसी अन्य तालिका में प्रश्नों की सूची, किसी अन्य तालिका में संभावित उत्तरों की सूची इत्यादि। यदि आप डेटा के प्रकार से सबकुछ अलग करते हैं, तो आप सही दिशा में आगे बढ़ रहे हैं। – MatBailie

+0

अरे डेम्स! धन्यवाद! मेरे पास इस तरह की प्रश्न/उत्तर-सारणी सेट है: प्रश्नों के लिए एक तालिका, उत्तर के लिए एक तालिका (एकाधिक प्रश्न पूछे जाने वाले प्रश्न) और एक स्पष्टीकरण के लिए क्यों गलत जवाब वास्तव में गलत हैं ("answerid" से जुड़े हुए हैं)। तो अब मुझे बस इतना करना है कि "उपयोगकर्ता" -टेबल और मैं आपके विपक्ष में अच्छा हूं? भी, क्या आप सभी प्रश्नों को एक टेबल में रखेंगे या प्रत्येक विषय के लिए एक टेबल लेंगे (जिसमें लगभग 30 परीक्षण प्रत्येक (और 30 प्रश्न प्रत्येक) हैं, और लगभग 20 विषय सभी में हैं? धन्यवाद! – Jonas

0

मैं निश्चित रूप से प्रति उपयोगकर्ता एक टेबल का उपयोग नहीं करता, जो कि बनाए रखने के लिए सिर्फ एक दुःस्वप्न बन जाएगा।

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

उपयोगकर्ता तालिका: शामिल अपने सभी उपयोगकर्ताओं सवाल: सभी प्रश्न शामिल हैं

परिणाम: सभी परिणाम UserID, test_id, समय शामिल

टेस्ट testID, questionid, उत्तर, time_to_complete

उत्तर answer_id, उत्तर

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

प्रस्तुत का जवाब तो डेटा कैसा दिखेगा है:

Results 
UserID, TestID, Time 
1   1  00:11 

Test 
TestID QuestionID, answers, time_to_complete 
1  1    1   00:10:00 
1  2    2   00:01:00 

Answers 
answer_id, Answers 
    1   A 
    1   B 
    2   A 
    3   A 
    3   B 
    3   C 

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

+0

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

+0

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