Схема базы данных съемки.
Это настоящая классика, выполненная тысячами. Они всегда кажутся «довольно простыми» для начала, но, чтобы быть хорошими, это на самом деле довольно сложно. Для этого в Rails я бы использовал модель, показанную на прилагаемой диаграмме. Я уверен, что для некоторых это кажется слишком сложным, но после того, как вы построили несколько из них, на протяжении многих лет вы понимаете, что большинство проектных решений - это очень классические шаблоны, которые лучше всего решаются с помощью динамической гибкой структуры данных на боковик.
Более подробная информация ниже:
Детали таблицы для ключевых таблиц
ответы
Таблица ответов имеет решающее значение, поскольку она отражает реальные ответы пользователей. Вы заметите, что ответы ссылаются на question_options , а не на вопросы . Это намеренно.
input_types
input_types - это типы вопросов. Каждый вопрос может быть только одного типа, например, все радиозвонки, все текстовые поля и т. Д. Используйте дополнительные вопросы, если есть, скажем, 5 радиозвонков и 1 флажок для «включить?» вариант или некоторая такая комбинация. Пометьте два вопроса в представлении пользователей как один, но внутренне задайте два вопроса: один для радиодисков, один для флажка. Флажок будет иметь группу 1 в этом случае.
option_groups
option_groups и option_choices позволяют вам создавать «общие» группы. Например, в заявке на недвижимость может возникнуть вопрос «Сколько лет собственности?». Ответы могут быть желательны в диапазонах: 1-5 6-10 10-25 25-100 100+
Затем, например, если возникает вопрос о возрасте смежного свойства, тогда опросу понадобится «повторно» использовать вышеуказанные диапазоны, чтобы использовались те же option_group и options.
единицы измерения
unit_of_measure , как это звучит. Будь то дюймы, чашки, пиксели, кирпичи или что-то еще, вы можете определить это один раз здесь.
К сведению: Несмотря на то, что это универсальный характер, можно создать приложение поверх этого, и эта схема хорошо подходит для среды Ruby On Rails с такими соглашениями, как «id» для первичного ключа для каждой таблицы. Кроме того, все отношения простые one_to_many без необходимости в сквозных связях many_to_many или has_many. Я бы, вероятно, добавил has_many: throughs и / или: делегаты, чтобы легко получить такие вещи, как survey_name из индивидуального ответа без multiple.chaining.