Firstly, I went through tens of questions over here related to mine, but couldn’t quite find what I’m looking for, hence asking a seemingly duplicate question again.
I have a requirement for a questionnaire of about 30 fixed questions for all users which can have,
- Single select options (Text or Text with images)
- Multi select options (Text or Text with images)
- Free text
- Date fields
There is no right or wrong answer since the questions cater to a user’s preferences. I’ve been working on a postgres schema design, which looks something like this.
–Questions Table–
id int question varchar description varchar type varchar -> single select/multi select or free text with no options createdAt timestamp updatedAt timestamp
–Options–
questionId int -> foreign key to questions.id type varchar -> text or text with image text varchar image varchar createdAt timestamp updatedAt timestamp
—Answers—
questionId int -> foreign ref to questions.id option int -> foreign ref to options.id value varchar -> free text in case a question didn't have options options ? -> array of option ids? userId int -> foreign ref to users.id createdAt timestamp updatedAt timestamp
Now, I’m not sure how best to store the options in the answers table in case of a multiselect. Do I save an array of option ids? but that would render me unable to even have a foreign key ref to the options table and might make querying difficult since I need to be able to query the question-answer pairs for all questions by an individual user, this array wouldn’t help me populate the options he chose. Please help me figure out the best way to store this.
Advertisement
Answer
My model would probably look something like this…Rich
--user table user_id (primary key) first_name last_name email create_date_time update_date_time --survey master table, so you can reuse the model for additional surveys survey_id (primary key) survey_name survey_description create_date_time update_date_time --question table question_id (primary key) survey_id (foreign key) question_text description question_type create_date_time update_date_time --question answers table answer_id (primary key) question_id (foreign key) answer_type answer_text answer_image create_date_time update_date_time --user answers table user_id (primary key and foreign key) question_id (primary key and foreign key) answer_id (primary key if >1 answer allowed, and foreign key) user_answer_text create_date_time update_date_time