Этот вопрос связан с этим сообщением: Конструкция SQL для опроса с ответами разных типов данных
У меня есть приложение для опроса, в котором у большинства вопросов есть набор ответов: 1-5. Теперь нам приходится задавать вопросы, которые могут иметь разные типы ответов - числовые, даты, строки и т.д. Благодаря предложениям из стека я пошел со строковым столбцом для хранения ответов. Некоторые вопросы имеют множественный выбор, поэтому вместе с табличными "вопросами" у меня есть таблица "ответы", в которой есть набор возможных ответов на вопрос.
Теперь: как мне хранить ответы на вопрос, который "выбрать все, что применимо"? Должен ли я создать дочерний стол "selected_answers" или что-то в этом роде? Или в таблице ответов есть столбец "выбран", который указывает, что ответчик выбрал этот ответ?
возможным решением является таблица UsersAnswers с 4 столбцами: первичный ключ, идентификатор пользователя, идентификатор вопроса и идентификатор ответа
с несколькими записями для любых вопросов, в которых можно выбрать более одного ответа
У меня есть два предложения.
Нормализовать вашу базу данных и создать таблицу с именем question_answer
или что-то, что больше соответствует номенклатуре вашей схемы. Вот как я мог бы это описать.
CREATE TABLE question_answer (
id INT NOT NULL AUTO INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
question_id INT NOT NULL,
answer_id INT NOT NULL
);
Создайте пять столбцов в таблице answers
, каждая из которых ссылается на конкретный ответ. В MySQL я использовал бы эти столбцы как значения bit(1)
.
ИМХО, если вы не увидите количество вариантов изменения, я бы придерживался опции 2. Это более быстрый вариант и, скорее всего, также сэкономит ваше место.
Поскольку у вас не будет выбора многих вариантов, у меня возникнет соблазн сохранить ответы в виде списка значений, разделенных запятыми, в столбце ответа строки.
Если пользователь выбирает свои ответы из группы флажков на веб-странице с вопросом (при условии, что это веб-приложение), вы также получите список разделенных запятыми. (Хотя вы не сможете сравнивать списки только как строки, так как ответ "красный, синий" совпадает с "синим, красным".)
У этих вопросов опроса всегда есть один универсальный ответ: он зависит от того, что вы хотите сделать с ответами, когда вы закончите.
например, если все, что вы хотите, хранит запись каждого индивидуального ответа (и никогда не делайте никаких суммирования или не находите всех пользователей, которые ответили на вопрос x с ответом y), тогда самый простой дизайн - это денормализация ответов в сериализованное поле.
если вам нужны итоги, вы, возможно, также можете уйти с денормализованными ответами в сериализованную таблицу, если вы подсчитаете итоговые суммы в сводной таблице и обновите значения при отправке викторины.
поэтому для вашего конкретного вопроса вам нужно решить, будет ли он более полезным для вашего конечного продукта хранить 5, если вы имеете в виду "все вышеперечисленное" , или если более полезно иметь каждый из выбраны четыре варианта.
Другая опция, (И я видел случаи, когда это было так, как были оценены такие вопросы), заключается в том, чтобы рассматривать каждый возможный ответ как отдельный вопрос "Да/Нет" и записывать ответ испытуемого (выбрать его или не) в качестве логического...