Дизайн бази даних анкети - який спосіб краще?


15

У мене ОДНА довга HTML-сторінка, кілька наборів питань, розділених на невеликі розділи (приблизно 15 підрозділів на одній сторінці), загальна кількість запитань - близько 100 питань: варіюється від вводу, вибору декількох виборів, прапорців, перемикачів, текстових областей, і завантаження файлів. Одне запитання може містити багато відповідей, отриманих або з групи прапорців, групи списку вибору, групи з декількома виборами, або всіх з них, об'єднаних в одну відповідь. Я думав, що буду використовувати цю базу даних нижче, але останнім часом з’ясував, що це не найкращий підхід.

  1. Один клієнт міг мати лише один набір питань: один замовник на 100 питань.
  2. Для старого підходу я не тримаю сумнівів у базі даних, але призначаю як постійне в кодуванні PHP. Проблема в тому, що я повинен порівняти питання в PHP, щоб синхронізувати його з відповіддю в базі даних. Якби одне питання було змінено / видалено / переміщено з PHP, я б точно загубився, щоб відповідати йому відповіді в базі даних анкети. Краще рішення?
  3. Чи можу я зберегти кілька відповідей, отриманих з декількох елементів, у формі в одному полі як одна відповідь? Як я можу отримати це поле і відобразити його знову для перегляду клієнтом форми?
  4. На який варіант внизу мені слід звернутися?

ВАРІАНТ 1: Старий підхід (1 стіл)

ТАБЛИЦЯ: Анкета

  • Ідентифікатор (ПК)
  • CustomerID
  • Статус
  • А1
  • А2
  • А3
  • .
  • .
  • .
  • A100

ВАРІАНТ 2: Новий підхід (2 таблиці)

ТАБЛИЦЯ: Питання

  • QID (ПК)
  • Питання (varchar)

ТАБЛИЦЯ: Відповідь

  • ДОПОМОГА (ПК)
  • CustomerID
  • QID (int)
  • Відповідь (варчар)

Або ВАРІАНТ 3?


Чи можете ви додати більше інформації про програму, будь ласка. - Чи динамічно створюються анкети? І.Є .: у цій анкеті повинні бути ці запитання, в той час як в іншій анкеті повинні бути ці інші запитання. - Чи динамічні запитання для анкетування? IE: Замовник може пізніше додати нові запитання. Незалежно від того, чи це динамічна система або статична система, вам доведеться зберігати результати 1: 1 питання-відповіді інакше, ніж 1: M Питання: Відповіді в БД.
Замбоніллі

Так і Ні відповідно (динамічне запитання може бути пізніше на 2-й фазі, але не зараз.)
Модульний

Я проголосував за закриття цих 100 питань: варіюється від введення, вибору декількох варіантів, прапорців, радіо кнопок, textarea та завантаження файлів просто занадто широкий, щоб бути корисним.
Еван Керролл

Відповіді:


17

Однозначно не важко кодуйте свою анкету. Використовуйте реляційну базу даних або XML-файли. Пропоную наступні таблиці

  • Questionnaire: Загальний опис анкети. Назва, назва опитування, дата випуску анкети, версія тощо.

  • Section: У розділах складається анкета. Номер розділу, назва розділу, опис.

  • Question: Питання, що належать до розділу. Номер запитання, текст запитання, опис, тип питання (текст, вибір з декількома варіантами тощо).

  • Question_Choice: Можливі відповіді, що належать на запитання, відповідні окремим прапорцям, радіо кнопок тощо. Текст вибору, номер вибору, замовлення.

  • Respondent: Особи, які відповідають на запитання. Особисті дані, номер користувача.

  • Interview: Інтерв'ю або тести чи опитування (залежно від характеру анкети), що належать одному респонденту та одному анкетуванню. Якщо респондент завжди може відповісти лише на одну анкету (або якщо опитування є анонімним), ця таблиця застаріла і може бути об'єднана з таблицею респондента. Дата інтерв'ю (або дата тестування або дата опитування), інтерв'юер (якщо це застосовується).

  • Answer: Відповіді, що належать до одного інтерв'ю (або респондента, див. Вище) та одного питання. Текст відповіді (для питань щодо тексту тексту), вибір (для радіо кнопок).

  • Answer_Choice: Вибір, що належить до одного відповіді та одного питання_вибору, коли можна перевірити кілька варіантів.

Це дуже нормалізований підхід; однак, ви можете вирішити об'єднати вибір в один рядок або зберегти їх як бітовий візерунок або спростити його іншим способом залежно від ваших потреб.


6

Вам потрібно кілька таблиць,

1 - Питання (ідентифікатор питання, тип вводу, видимий, тип запитання, текст питання, очікувані відповіді ....)

2 - відповіді (ідентифікатор питання, ідентифікатор користувача, ідентифікатор активності, відповідь ....)

3 - Користувачі (ідентифікатор користувача, ім'я користувача ......)

4 - Таблиця, яка містить активність питання / відповіді (ідентифікатор активності, дані / час, ідентифікатор користувача)

Також вам може сподобатися мати таблицю, яка визначає питання, які слід застосувати для кожної діяльності - або згруповані за користувачем, або, можливо, колекція запитань. Зовнішніми / первинними ключами будуть стовпці, що мають однакове ім’я у кількох таблицях і мають бути індексовані.

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

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

(Порада. Для створення шару презентації вам знадобиться запит, який відображатиме відповідні запитання, потім перебирайте цей набір результатів і викличте метод для надання запитання на екрані. Вибрані методи відповідатимуть презентація цього питання [текстове поле, радіогрупа тощо])


+1 Не впевнений у таблиці №4, але загальна відповідь. Особливо мені подобається зміна назв однини таблиці на множину, тобто запитання >> запитання.
Лі Ріффер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.