"вопросы" и "ответы" с несколькими ответами

Этот вопрос связан с этим постом: SQL дизайн для опроса с ответами разных типов данных

У меня есть приложение для опроса, где у большинства вопросов есть набор ответов 1-5. Теперь нам нужно задавать вопросы, которые могут иметь различные типы ответов - числовые, дата, строка и т. Д. Благодаря предложениям из стека я выбрал столбец со строкой для хранения ответов. Некоторые вопросы имеют множественный выбор, поэтому наряду с таблицей "вопросы" у меня есть таблица "ответов", в которой есть множество возможных ответов на вопрос.

Теперь: как мне хранить ответы на вопрос "выбери все подходящие"? Должен ли я создать дочернюю таблицу "selected_answers" или что-то в этом роде? Или в таблице ответов должен быть столбец "выбрано", указывающий, что респондент выбрал этот ответ?

5 ответов

Решение

Возможное решение - это таблица UsersAnswers с 4 столбцами: первичный ключ, идентификатор пользователя, идентификатор вопроса и идентификатор ответа.

с несколькими записями для любых вопросов, где можно выбрать более одного ответа

Другой вариант (и я видел случаи, когда так оценивались и такие вопросы), состоит в том, чтобы рассматривать каждый возможный ответ как отдельный вопрос "да / нет" и записывать ответ испытуемого (выбрал или не сделал)) как логическое значение...

Поскольку у вас не будет выбрано много опций, у меня возникнет соблазн сохранить ответы в виде списка значений, разделенных запятыми, в столбце строковых ответов.

Если пользователь выбирает свои ответы из группы флажков на веб-странице с вопросом (предполагая, что это веб-приложение), то вы также получите список через запятую. (Хотя вы не сможете просто сравнивать списки как строки, так как ответ "красный, синий" такой же, как "синий, красный".)

На эти вопросы анкеты всегда есть один универсальный ответ: это зависит от того, что вы хотите сделать с ответами, когда закончите.

например, если все, что вам нужно, это вести учет каждого отдельного ответа (и никогда не делать суммирования или не находить всех пользователей, которые ответили на вопрос x с ответом y), тогда самый простой способ - это денормализовать ответы в сериализованном поле.,

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

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

У меня есть два предложения.

  1. Нормализуйте свою базу данных и создайте таблицу под названием 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
    );
    
  2. Создайте пять столбцов в вашем answers таблица, каждая из которых относится к конкретному ответу. В MySQL я бы использовал установить эти столбцы как bit(1) ценности.

ИМХО, если вы не увидите, как меняется количество вариантов, я бы остановился на варианте 2. Это более быстрый вариант, который, скорее всего, также сэкономит ваше пространство.

Другие вопросы по тегам