Подтвердить что ты не робот

Какие таблицы и отношения базы данных mysql будут поддерживать опрос Q & A с условными вопросами?

Сейчас я работаю над довольно простой системой опроса. Схема базы данных будет простой: таблица Survey в отношении "один ко многим" с таблицей Question, которая находится в соотношении "один ко многим" с таблицей Answer и с PossibleAnswers > .

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

Теперь я начал задаваться вопросом, каким будет лучший способ реализовать эти условные вопросы с точки зрения моей схемы базы данных? Если question A имеет 2 возможных ответа: A и B и question B должны отображаться только пользователю , если ответ был A?

Изменить: то, что я ищу, - способ сохранить эту информацию о требованиях в базе данных. Обработка данных будет, вероятно, выполнена на стороне приложения, так как мои навыки SQL сосут;)

4b9b3361

Ответ 1

Дизайн базы данных опроса

Последнее обновление: 5/3/2015
Диаграммы и файлы SQL теперь доступны в https://github.com/durrantm/survey

enter image description here

Если вы используете этот (верхний) ответ или любой элемент, добавьте отзывы об улучшениях.

Это настоящая классика, сделанная тысячами. Они всегда кажутся "довольно простыми" для начала, но чтобы быть хорошими, это на самом деле довольно сложно. Чтобы сделать это в Rails, я бы использовал модель, показанную на прилагаемой диаграмме. Я уверен, что для некоторых это кажется сложным, но после того, как вы создали несколько из них, на протяжении многих лет вы понимаете, что большинство дизайнерских решений - это очень классические шаблоны, лучше всего решаемые динамической гибкой структурой данных на боковик.
Подробнее см. Ниже:

Данные таблицы для таблиц ключей

ответы

Таблица отвечает имеет решающее значение, поскольку она фиксирует фактические ответы пользователей. Вы заметите, что ответы на ссылки на question_options, а не вопросы. Это намеренно.

input_types

input_types - это типы вопросов. Каждый вопрос может быть только одного типа, например. все радиодиапазоны, все текстовые поля и т.д. Используйте дополнительные вопросы, если есть (например) 5 радиодисков и 1 флажок для "включить?". вариант или некоторая такая комбинация. Обозначьте два вопроса в представлении пользователей, как один, но внутри которых есть два вопроса: один для радио-циферблатов, один для флажка. В этом случае флажок будет содержать группу из 1.

option_groups

options_groups и option_choices позволяют создавать "общие" группы. Например, в приложении для недвижимости может возникнуть вопрос: "Сколько лет собственности?". Ответы могут быть желательными в диапазонах: 1-5 6-10 10-25 25-100 100 +

Затем, например, если возникает вопрос о возрасте сопутствующего имущества, то опрос захочет "повторно использовать" вышеуказанные диапазоны, так что будут использоваться те же опции_группы и параметры.

units_of_measure

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

FYI: Несмотря на общий характер, можно создать приложение поверх этого, и эта схема хорошо подходит для структуры Ruby On Rails с такими соглашениями, как "id" для первичной ключ для каждой таблицы. Кроме того, отношения - все просто одно_только, не требующее много_то_мании или has_many. Я бы, вероятно, добавил has_many: throughs и/или: делегаты, хотя легко получить такие вещи, как survey_name, из индивидуального ответа без .multiple.chaining.

Ответ 2

Вы также можете подумать о сложных правилах и иметь поле условий на основе строки в своей таблице "Вопросы", принимая/разбирая любой из них:

  • А (1) = 3
  • ((A (1) = 3) и (A (2) = 4))
  • А (3) > 2
  • (A (3) = 1) и (A (17)!= 2) и C (1)

Где A (x) = y означает "Ответ вопроса x есть y", а C (x) означает условие вопроса x (по умолчанию - true)...

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

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

Ответ 3

один из способов - добавить требования к "требованиям к таблице" с полями:

  • question_id (ссылка на вопрос "какой бренд?" )
  • required_question_id (ссылка на вопрос "вы курите?" )
  • required_answer_id (ссылка на ответ "да" )

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

Ответ 4

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

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

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

Надеюсь, это поможет вам найти стратегию для вашего приложения.