Дизайн бази даних опитування: пов’язати відповідь з користувачем


12

Я роблю концептуальну модель для бази даних опитування.

Мета - зберігати відповіді, надані користувачами (це буде додаток для Android).

У мене є три сутності: користувач, питання та варіант.

Питання буде мати один або кілька варіантів (наприклад: Скільки співробітників у вас є? 1-40, 40-1000, +1000).

Параметри матимуть текст (1-40) та значення (значення, вибране користувачем).

Користувач вибере одну (або більше) з цих опцій.

Моя концептуальна конструкція:

введіть тут опис зображення

Я не знаю, як пов’язати відповідь з користувачем.

Як я можу представити це відношення?
Чи є в мене інша особа, яка представляє значення опціону?

Ця модель буде зберігати запитання та заздалегідь зроблені відповіді (пропоновані відповіді) та дозволяє повторно використовувати їх у різних опитуваннях.

Я повинен представляти таке питання:

введіть тут опис зображення

Це питання пов'язане з цим: Дизайн бази даних опитування: перша версія. Чи є помилки?


1
Схоже, вам знадобиться ще одна таблиця, щоб обробляти відносини між багатьма та багатьма користувачами.
ОліверАсмус

Відповіді:


7

Потрібно розрізняти можливі відповіді та вибрані відповіді.

У Optionтаблиці повинні бути дві таблиці. OptionТаблиця повинна бути 1: М до Questionі повинна включати в себе можливі відповіді на це питання.

Тоді вам потрібно створити нову сукупність перехрестя, назвати її, Selected_Optionяка сидить між Userі Option.

Якщо ваше запитання дає можливість користувачеві заповнити значення як відповідь (тобто "ІНШЕ: ..."), це значення буде збережене в Selected_Optionтаблиці. Інакше вибране користувачем значення буде значенням, знайденим у Option.


Редагувати:

Виходячи з уточнення вимог ОП: Те, що вам потрібно, не схожа на типову модель анкети наступними способами:

  • Усі ваші запитання мають однакові набори відповідей (стовпці)
  • Деякі ваші відповіді (стовпці) згруповані разом.
  • Блоки питань групуються.

Взявши знімок форми як керівництво, я розділив елементи вашої форми на сутності, які я кольорово кодував:

Приклад кольорової форми

Це може бути прийнято за допомогою наступного логічного ERD:

Логічний ERD

Зауважте, що я зашифрував кольори об'єктів у ERD, щоб відповідати знімку вашої вибіркової форми, щоб показати кореляцію.

Одне з припущень цієї моделі полягає в тому, що кожен блок має лише один набір запитантів (тобто один QUESTION_GROUP), який відповідає лівій колонці в блоці. Це трохи спрощує припущення.


Я оновив своє запитання зображенням типового опитування.
VansFannel

1
@VansFannel - я оновив свою відповідь, щоб відобразити ваше відредаговане запитання.
Джоель Браун

Дуже дякую! Ви мені дуже допомогли. Свій остаточний дизайн я додав тут як питання: dba.stackexchange.com/questions/16066/… Ви можете перевірити його, якщо хочете.
VansFannel

Одне запитання: що означає «послідовність» та «значення»? Я не так багато працював з ERD (вибачте).
VansFannel

@VansFannel - Примітки до атрибутів у ERD - це просто нетривіальні (або неочевидні) стовпці таблиць. Я очікую, що ви здогадаєтесь, куди поставити посвідчення особи, FK, описи тощо. Тому sequenceщо я пропоную вам, що вам потрібно / хочете контролювати порядок відображення елементів Бо valueя вказую, що введене користувачем значення (а не лише вибір параметра) може бути доречним.
Джоел Браун

13

Схема бази даних опитування.

Це справжня класика, зроблена тисячами. Вони завжди здаються "досить простими" для початку, але щоб бути хорошим, це насправді досить складно. Для цього в 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.


Чудово! Дякую за вашу відповідь. Я з цим багато чого навчусь. Дякую.
VansFannel

Чудова відповідь. Дуже корисно, оскільки я зараз борюся з подібною дизайнерською проблемою. :)
Доктор Майк

Це мала бути обрана відповідь. Дуже корисно, дякую!
dsignr

@Michael "Ви помітите, що відповідає відповіді на посилання на питання_запитів, а не на запитання. Це навмисно". Чи можете ви надати додаткові пояснення, чому? :)
Пак

@Michael Привіт, чудова відповідь! Якщо вам доведеться налаштувати CSS деяких питань на HTML-сторінці, як би це зробити? Я створив властивість CssFile у таблиці своїх компаній, але мені потрібно бути більш конкретним на рівні запитань. Дякую.
Патрік

2

Погляньте на цю загальну ідею:

введіть тут опис зображення

(У кращу модель для стислості включені лише найнеобхідніші поля.)

Ця модель має такі характеристики:

  • Одне питання можна поділити між декількома опитуваннями (і одне опитування, звичайно, може містити кілька запитань). SURVEY_QUESTION - це таблиця "посилання", яка реалізує це відношення M: N.
  • Порядок запитань в опитуванні визначається SURVEY_QUESTION.QUESTION_NO. Оскільки {SURVEY_NO, QUESTION_NO} - це (альтернативна) клавіша, позначена на U1наведеній вище схемі, жодне два питання не може займати один і той же «проріз» в одному опитуванні. У різних опитуваннях можуть виникати однакові питання в різному порядку.
  • На кожне запитання є ряд можливих відповідей або "варіантів". Візуальний порядок опцій визначається параметром OPTION.OPTION_NO, і оскільки він знаходиться в ПК, жоден два варіанти не можуть займати один і той же «проріз» під одним і тим же питанням.
  • Різні користувачі можуть надати різні відповіді на одне і те ж питання (і, звичайно, один користувач може відповісти на кілька запитань). Це співвідношення M: N реалізується через таблицю "посилання" ВІДПОВІДЬ.
  • Користувач відповідає на питання, вибираючи принаймні один із його варіантів. Це забезпечується виключенням OPTION_NO з ПК відповіді. Якщо ви хочете дозволити користувачеві вибирати кілька варіантів, включіть OPTION_NO в ПК.

У цій моделі даних немає нічого, що змушує користувача відповідати на всі питання - це те, що вам потрібно зробити на рівні програми. Тим не менш, ця модель повинна стати гарним початком для того, що вам потрібно зробити ...


Я оновив своє запитання зображенням типового опитування.
VansFannel

1

Вам знадобиться ще одна таблиця, щоб вмістити відповіді користувачів.

user_answers
------------
  user_answer_id - унікальний первинний ключ
  user_id - таблиця від FK до користувача
  selected_option_id - таблиця від FK до параметрів
  question_id - FK до таблиці запитань

Якщо ви вирішите, що ви хочете, щоб користувачі могли вибрати опцію "Інше" і заповнити власну цінність, я рекомендую окрему таблицю для цього:

user_alt_answers
----------------
  user_alt_answer_id - ПК
  alt_answer_text - текст, який користувач ввів для параметра "інший".
  user_answeR_id - таблиця від FK до user_answers

Я оновив своє запитання зображенням типового опитування.
VansFannel

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.