Схема бази даних опитування.
Це справжня класика, зроблена тисячами. Вони завжди здаються "досить простими" для початку, але щоб бути хорошим, це насправді досить складно. Для цього в Rails я б використав модель, показану на доданій схемі. Я впевнений, що для деяких це здається складним, але, коли ви створили декілька з них, протягом багатьох років ви усвідомлюєте, що більшість дизайнерських рішень - це дуже класичні зразки, найкраще вирішені динамічною гнучкою структурою даних на початок.
Детальніше нижче:
Деталі таблиці ключових таблиць
відповіді
Таблиця відповідей є критичною, оскільки фіксує фактичні відповіді користувачів. Ви помітите, що відповіді посилаються на питання_опції , а не на запитання . Це навмисно.
input_types
input_types - це типи питань. Кожне запитання може бути лише 1-го типу, наприклад, всі радіотелефони, усі текстові поля тощо. Використовуйте додаткові запитання щодо того, коли є (скажімо) 5 радіо-циферблатів та 1 прапорець "Включити?" варіант або якесь таке поєднання. Позначте два запитання на екрані користувачів, як одне, але всередині є два запитання, одне для радіотехнічного набору, одне для прапорця. У цьому випадку в групі буде 1 група.
option_groups
option_groups та option_choices дозволяють створювати "загальні" групи. Одним із прикладів у додатку щодо нерухомості може бути питання "Скільки років має власність?". Відповіді можуть бути бажані в межах: 1-5 6-10 10-25 25-100 100+
Тоді, наприклад, якщо виникає питання про сусідній вік властивості, тоді опитування захоче «повторно використати» вищезазначені діапазони, щоб ті самі опціони_групи та варіанти звикли.
одиниці_ міри
units_of_measure так , як це звучить. Незалежно від того, чи це дюйми, чашки, пікселі, цегла чи все інше, ви можете визначити це один раз тут.
FYI: Незважаючи на загальну природу, можна створити додаток поверх цього, і ця схема добре підходить до рамки Ruby On Rails з умовами, такими як "id" для первинного ключа для кожної таблиці. Крім того, відносини є простими one_to_many, не вимагаючи багато_to_many чи has_many за допомогою. Я б, мабуть, додав has_many: throughs та / або: делегати, хоча для отримання таких обставин, як ім'я_визначення, з індивідуальної відповіді легко без.multiple.chaining.