आपकी पहली स्कीमा दोनों में से बेहतर विकल्प है। इस बिंदु पर, आपको प्रदर्शन समस्याओं के बारे में चिंता नहीं करनी चाहिए। एक अच्छा, लचीला, एक्स्टेंसिबल डिज़ाइन बनाने की चिंता करें। डेटा को कैश करने और प्रश्नों को तेज़ी से बनाने के लिए आप बाद में सभी प्रकार की तरकीबें अपना सकते हैं। प्रदर्शन की समस्या को हल करने के लिए कम लचीले डेटाबेस स्कीमा का उपयोग करना जो कि अमल में भी नहीं आ सकता है, एक बुरा निर्णय है।
इसके अलावा, कई (शायद अधिकतर) सर्वेक्षण परिणाम केवल समय-समय पर और कम संख्या में लोगों (कार्यक्रम आयोजकों, प्रशासकों, आदि) द्वारा देखे जाते हैं, इसलिए आप सभी परिणामों के लिए डेटाबेस से लगातार पूछताछ नहीं करेंगे। और अगर आप थे भी तो प्रदर्शन ठीक रहेगा। आप शायद किसी भी तरह परिणामों को पृष्ठांकित करेंगे।
पहली स्कीमा बहुत अधिक लचीली है। आप डिफ़ॉल्ट रूप से, नाम और पते जैसे प्रश्न शामिल कर सकते हैं, लेकिन अनाम सर्वेक्षणों के लिए, आप उन्हें नहीं बना सकते। यदि सर्वेक्षण निर्माता पाँच सौ में से केवल तीन प्रश्नों के उत्तर देखना चाहता है, तो यह वास्तव में एक सरल SQL क्वेरी है। जब कोई सर्वेक्षण हटा दिया जाता है तो आप प्रतिक्रियाओं और प्रश्नों को स्वचालित रूप से हटाने के लिए एक कैस्केडिंग डिलीट सेट कर सकते हैं। इस स्कीमा से भी आंकड़े बनाना बहुत आसान हो जाएगा।
आपके द्वारा प्रदान की गई स्कीमा का थोड़ा संशोधित संस्करण यहां दिया गया है। मुझे लगता है कि आप यह पता लगा सकते हैं कि कौन से डेटा प्रकार कहां जाते हैं :-)
surveys
survey_id (index)
title
questions
question_id (index, auto increment)
survey_id (link to surveys->survey_id)
question
responses
response_id (index, auto increment)
survey_id (link to surveys->survey_id)
submit_time
answers
answer_id (index, auto increment)
question_id (link to questions-question_id)
answer