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

0

Этот вопрос связан с этим сообщением: Конструкция SQL для опроса с ответами разных типов данных

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

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

Теги:
rdbms
rdbms-agnostic

5 ответов

3
Лучший ответ

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

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

0

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

  • Нормализовать вашу базу данных и создать таблицу с именем 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. Это более быстрый вариант и, скорее всего, также сэкономит ваше место.

0

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

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

  • 0
    Да, это очень заманчиво: D, хотя Джимми выглядит как правильный.
  • 0
    Эта идея меня также поразила, но она кажется проблематичной, когда я пытаюсь запустить агрегирование отчетов - если бы я хотел получить уникальные значения и их соответствующие значения для набора опросов, это потребовало бы некоторого анализа строки майора.
Показать ещё 1 комментарий
0

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

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

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

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

  • 0
    Мы хотим запустить отчеты, которые суммируют количество ответов за заданные периоды времени (и другие атрибуты). У нас нет вопроса «все вышеперечисленное», но я могу легко предвидеть «выбрать все (читай: все), которые применимы»
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню