patternMinor
Database Design for Questions and Answers
Viewed 0 times
answersdesignquestionsdatabaseforand
Problem
I'm building a website that will host a variety of questionnaires. Each questionnaire has a different number of questions and each question has a different number of answers. I have attempted to design a database to hold the questions and possible answers for each questionnaire, but I end up having separate tables for each question. Is this correct or am I going wrong somewhere?
For example
I cant have a fixed size table for all questions as I don't have a maximum amount of answers. This obviously means I could end up with hundreds of tables, one for each question.
For example
Table for question x
Answer | Answer ID
1 019
2 089I cant have a fixed size table for all questions as I don't have a maximum amount of answers. This obviously means I could end up with hundreds of tables, one for each question.
Solution
We have an application at our workplace that does a similar thing. It works by having a table that contains a list of all possible questions like such:
Then you have an ANSWERS and a QUESTIONAIRES table defined using the same structure above. Once you have these two tables you then define a table to hold the list of question/answer possibilties as such:
Once you have these you can then create a table to contain the responses as such:
This will give you maximum flexibility allowing you to add new questions and answers without having to change your database design frequently. It can get a bit complicated if you need to version the questions/answers but this should give you a good foothold to work from.
I hope this helps you.
CREATE TABLE QUESTIONS
(
ID INT NOT NULL PRIMARY KEY,
SUMMARY NVARCHAR(64) NOT NULL UNIQUE,
DESCRIPTION NVARCHAR(255) NULL
);Then you have an ANSWERS and a QUESTIONAIRES table defined using the same structure above. Once you have these two tables you then define a table to hold the list of question/answer possibilties as such:
CREATE TABLE QUESTION_ANSWERS
(
ID INT NOT NULL PRIMARY KEY,
QUESTION INT NOT NULL REFERENCES QUESTIONS(ID),
ANSWER INT NOT NULL REFERENCES ANSWERS(ID)
);Once you have these you can then create a table to contain the responses as such:
CREATE TABLE RESPONSES
(
QUESTIONAIRE INT NOT NULL REFERENCES QUESTIONAIRES(ID),
RESPONSE INT NOT NULL REFERENCES QUESTION_ANSWERS(ID)
);This will give you maximum flexibility allowing you to add new questions and answers without having to change your database design frequently. It can get a bit complicated if you need to version the questions/answers but this should give you a good foothold to work from.
I hope this helps you.
Code Snippets
CREATE TABLE QUESTIONS
(
ID INT NOT NULL PRIMARY KEY,
SUMMARY NVARCHAR(64) NOT NULL UNIQUE,
DESCRIPTION NVARCHAR(255) NULL
);CREATE TABLE QUESTION_ANSWERS
(
ID INT NOT NULL PRIMARY KEY,
QUESTION INT NOT NULL REFERENCES QUESTIONS(ID),
ANSWER INT NOT NULL REFERENCES ANSWERS(ID)
);CREATE TABLE RESPONSES
(
QUESTIONAIRE INT NOT NULL REFERENCES QUESTIONAIRES(ID),
RESPONSE INT NOT NULL REFERENCES QUESTION_ANSWERS(ID)
);Context
StackExchange Database Administrators Q#23630, answer score: 7
Revisions (0)
No revisions yet.