2010-11-23 6 views
6

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

यहाँ वर्तमान मॉडल मैं अनुप्रयोग में उपयोग कर रहा हूँ है:

Table 1) 
+-------------------------+ 
|  SURVEYS TABLE  | 
+----+------+-------------+ 
| ID | name | description | 
+----+------+-------------+ 

Table 2) 
+-----------------------------------+ 
|  $[name_of_the_survey]  | 
+----+-------+------+-------+-------+ 
| ID | field | type | value | items | 
+----+-------+------+-------+-------+ 


Table 3) 
+--------------------------------------+ 
| $[name_of_the_survey] _records | 
+----+---------------------------------+ 
| ID | columns specific to each survey | 
+----+---------------------------------+ 

तो मूल रूप से जब कोई उपयोगकर्ता एक सर्वेक्षण बनाता है, कार्यक्रमों में सर्वेक्षण टेबल एक रिकार्ड सम्मिलित करता है और फिर 2 टेबल बनाता है:

तालिका (2) फॉर्म तालिका (3) के रिकॉर्ड्स के लिए तालिका के लिए तालिका (2), जिसमें स्तंभ तालिका (2) पंक्तियों के अनुरूप होते हैं।

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

तो मेरा सवाल है ... क्या कोई बेहतर डेटाबेस डिज़ाइन है?

+1

अभिभावक तालिकाओं की एक विदेशी कुंजी वाली तालिका में कॉलम रखने के बजाय नई तालिकाओं को बनाने का क्या कारण है? – Scottie

+0

अच्छी तरह से, सभी तालिका (2) को एक ही तालिका में एग्रीगेट किया जा सकता है, तालिका में एक विदेशी कुंजी जोड़ना (1)। तालिका (3) हालांकि, क्योंकि मैं पहले से नहीं जानता कि सर्वेक्षण में कितने और कितने फ़ील्ड होंगे। – Tivie

उत्तर

3

प्रत्येक सर्वेक्षण के लिए एक अलग तालिका का उपयोग करना लगभग डेटाबेस के उपयोग को अमान्य करता है। आप परिणामों को केवल फाइलों में स्टोर कर सकते हैं।

हालांकि, आपको तीन तालिकाओं की आवश्यकता है: सर्वेक्षण परिभाषा, सर्वेक्षण प्रश्न, और सर्वेक्षण उत्तर। यह कुछ इस तरह लग सकता है ...

Surveys: 
ID; name; description 

Questions: 
ID; text; surveyID 

Answers: 
ID; answer; questionID 

आप प्रगणित जवाब को संभालने के लिए वहाँ से जटिलता जोड़ सकते हैं ...

Surveys: 
ID; name; description 

Questions: 
ID; text; surveyID 

Choices: 
ID; choice; questionID 

Answers: 
ID; choiceID 

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

+0

वाह। बस। प्रतिभाशाली। लागू करने के लिए बहुत अधिक सरल और बहुत अधिक लचीला। आपका बहुत बहुत धन्यवाद! – Tivie

1

आप http://en.wikipedia.org/wiki/Database_normalization#Normal_forms

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

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

+0

यह मेरा पहला दृष्टिकोण था। समस्या, हालांकि, मौजूदा फाइलों को संपादित कर रहा है। उदाहरण के लिए, यदि कोई उपयोगकर्ता पांच फ़ील्ड के साथ एक सर्वेक्षण फ़ॉर्म बनाता है। फिर उनमें से एक को हटाने का फैसला किया।मुझे सर्वेक्षण के क्षेत्र के बारे में केवल फाइल ही बदलनी होगी, बल्कि रिकॉर्ड खुद ही बदलना होगा। उदाहरण के लिए, एक सीएसवी में विशिष्ट फ़ील्ड को हटाना काफी सिरदर्द है। मुझे सही क्षेत्र को हटाने के लिए बहुत सी स्ट्रिंग मैनिपुलेशन करना होगा। – Tivie

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