Разработка схемы для вопросника с одним или несколькими вариантами ответов без правильного / неправильного ответа - PullRequest
0 голосов
/ 07 ноября 2019

Во-первых, я прошел здесь десятки вопросов, связанных с моим, но не смог найти то, что искал, поэтому снова задаю, казалось бы, дублирующий вопрос.

У меня есть требование дляАнкета из примерно 30 фиксированных вопросов для всех пользователей, которые могут иметь,

  • Параметры одиночного выбора (Текст или Текст с изображениями)
  • Варианты множественного выбора (Текст или Текст с изображениями)
  • Свободный текст
  • Поля даты

Нет правильного или неправильного ответа, так как вопросы обслуживают предпочтения пользователя. Я работал над схемой Postgres, которая выглядит примерно так:

- Таблица вопросов -

   id int
   question varchar
   description varchar
   type varchar -> single select/multi select or free text with no options
   createdAt timestamp
   updatedAt timestamp

- Параметры -

  questionId int -> foreign key to questions.id
  type varchar -> text or text with image
  text varchar
  image varchar
  createdAt timestamp
  updatedAt timestamp

--- Ответы ---

  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

Теперь я не уверен, как лучше сохранить параметры в таблице ответов в случае множественного выбора. Сохранить массив идентификаторов опций? но это сделало бы меня неспособным даже иметь внешний ключ ref в таблице параметров и могло бы затруднить запрос, так как мне нужно было иметь возможность запрашивать пары вопрос-ответ для всех вопросов отдельным пользователем, этот массив не помог бы мнеЗаполните варианты, которые он выбрал. Пожалуйста, помогите мне найти лучший способ сохранить это.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Моя модель, вероятно, будет выглядеть примерно так ... Рич

--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 
0 голосов
/ 08 ноября 2019

Первый разрез по модели. Уточнение потребует знания большего количества предполагаемого использования приложения. Вверх: я бы посчитал это усовершенствованием модели @ RichMurnane.

--user table
  user_id (primary key)
  first_name 
  last_name 
  other user detail columns

--survey master table, so you can reuse the model for additional surveys
  survey_id (primary key)
  survey_name
  survey_description

--question table
  question_id (primary key)
  question_text
  description
  question_type
  image_id

--survey question table
  survey_question_id (primary key) 
  survey_id (foreign key)
  question_id (foreign key


--answers table
  survey_question_id (primary key, foreign key)
  user_id (primary key, foreign key)
  answer_type
  answer_text
  image_id

--image table 
  image_id (primary key) 
  image_url              (url/ file path to if externally stored)
  image                  (.jpg, .png, ...) 
...