Дизайн бази даних для опитування [закрито]


129

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

Я придумав два можливі рішення:

  1. Створіть гігантську таблицю, яка містить відповіді на кожне подання опитування. Кожна колонка відповідала б відповіді з опитування. тобто SurveyID, Answer1, Answer2, Answer3

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

  2. Інше, що я подумав - створити таблицю запитань та таблицю відповідей. Таблиця запитань міститиме всі запитання для опитування. Таблиця відповідей міститиме індивідуальні відповіді з опитування, кожен рядок пов'язаний із запитанням.

    Простий приклад:

    tblОпитування : SurveyID

    tblQuestion : QuestionID, SurveyID , QuestionType, Question

    tblAnswer : AnswerID, UserID , QuestionID , Answer

    tblUser : UserID, UserName

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

Буду вдячний за будь-які ідеї та пропозиції.


Скільки "досить величезно"? Дайте нам оцінку, ми говоримо про мільйон чи тисячу мільйонів?
Хорхе Кордоба

1
Сервери SQL насправді розроблені для роботи з "тонами" даних. У вас не повинно виникнути особливих проблем при роботі зі схемою, про яку ви говорили.
Кріс

Відповіді:


123

Я думаю, що ваша модель №2 чудова, проте ви можете поглянути на більш складну модель, яка зберігає запитання та заздалегідь зроблені відповіді (пропоновані відповіді) і дозволяє їх повторно використовувати в різних опитуваннях.

- Одне опитування може мати багато питань; одне питання може (повторно) використовуватись у багатьох опитуваннях.
- Один (заздалегідь зроблений) відповідь можна запропонувати на багато питань. На одне запитання можна запропонувати багато відповідей. На запитання можуть бути різні відповіді, запропоновані в різних опитуваннях. Відповідь на різні запитання можна запропонувати в різних опитуваннях. Існує відповідь "Інше" за замовчуванням, якщо людина вибирає інших, її відповідь записується у Answer.OtherText.
- Одна людина може брати участь у багатьох опитуваннях, одна людина може відповісти на конкретне питання в опитуванні лише один раз.

огляд_модель_02


1
який інструмент ви використовували для створення схеми бази даних?
AndHeiberg

Я використовую Altova UModel. Це швидко, пропонує широкий вибір моделюючих структур і економить майже кожен формат. Хоча, коштує.
obimod

9
Ви також можете використовувати draw.io Безкоштовно без реєстрації та простий у використанні.
usr4896260

3
Чому ми маємо Survey_Question_Answerі Answer? Не Answerдостатньо просто ?
Абубакар Ахмад

1
Я думаю , що Answerдосить, Survery_question_answerнадлишкова
Batman

62

Мій дизайн показаний нижче.

Останній сценарій створення - за адресою https://gist.github.com/durrantm/1e618164fd4acf91e372

Сценарій та файл mysql workbench.mwb також доступні за посиланням
https://github.com/durrantm/survey введіть тут опис зображення


Привіт, мені подобається твій дизайн. Будь ласка, чи є якісь зразки даних (відвали) для таблиць? Буде дуже вдячний
Емека Мбах

Привіт! По-перше, дякую за вашу роботу, це приголомшливо! Чи розглядали ви ієрахії в одному зі своїх шаблонів, можливо? Користувачі зазвичай дають інформацію про свого лідера, а ці лідери мають інформацію про своїх лідерів тощо. І користувачі працюють у різних розділах (HR, Production), і вони можуть мати ієрархію. Тому під час звітності часто необхідно відрізнятись між цими рівнями організації.
ruedi

@michael: Це дуже корисно. чи є у вас посилання / github-посилання на java за допомогою весни?
Сагар Панда

Я все ще намагаюся з'ясувати , в чому різниця між option_groupsі option_choicesі тим, що випадок використання.
PHPnoob

@PHPnoob Я думаю, що це, як випливає з назви, просто групує варіанти. Тож якщо ви можете, наприклад, оцінювати від 1 до 5, тоді вам option_groupsслід точно дозволити, якщо я отримаю це право.
displayname

18

Однозначно варіант №2, також я думаю, що ви можете мати огляд поточної схеми, можливо, вам потрібна інша таблиця:

+-----------+
| tblSurvey |
|-----------|
| SurveyId  |
+-----------+

+--------------+
| tblQuestion  |
|--------------|
| QuestionID   |
| SurveyID     |
| QuestionType |
| Question     |
+--------------+

+--------------+
| tblAnswer    |
|--------------|
| AnswerID     |
| QuestionID   |
| Answer       |
+--------------+

+------------------+
| tblUsersAnswer   |
|------------------|
| UserAnswerID     |
| AnswerID         |
| UserID           |
| Response         |
+------------------+

+-----------+
| tblUser   |
|-----------|
| UserID    |
| UserName  |
+-----------+

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

Бази даних призначені для зберігання великої кількості даних, і більшість масштабів дуже добре. Немає реальної потреби користуватися меншою нормальною формою, просто економити на просторі більше.


Привіт, у мене питання. Чи не слід також опитувати опитування в таблиці відповідей або позначити часову позначку, що відповідає часу версії опитування? Якщо ви вставили запитання в своє первісне опитування, ідентифікатор питання зміниться, і відповіді стануть непізнаваними. Або якщо це зайве, ви могли б пояснити, як?
Shubham

3

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

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

  1. Створіть детальні таблиці відповідей, щоб зберігати відповіді на запитання, як ви описали у статті 2. Ці дані, як правило, не були б безпосередньо запитані у вашій програмі, але використовувались би для генерації підсумкових даних для таблиць звітів. Напевно, ви також хочете реалізувати певну форму архівації або виводу даних для цих даних.
  2. При необхідності створіть таблицю відповідей з 1. Це можна використовувати, коли користувачі хочуть переглянути просту таблицю результатів.
  3. Для будь-якої аналітики, яку потрібно виконати для цілей звітності, плануйте завдання, щоб створити додаткові зведені дані на основі даних з 1.

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


1

Другий підхід найкращий.

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

Прості речі:

  • Помістіть базу даних і введіть їх на свій власний диск, але не все на C за замовчуванням
  • Створіть базу даних стільки, скільки потрібно, щоб у вас не було пауз, коли база даних зростає

У нас були таблиці журналів у таблиці SQL Server з 10-ти мільйонними рядами.


1

No 2 виглядає добре.

Для таблиці з лише 4 стовпцями це не повинно бути проблемою, навіть з хорошими кількома мільйонами рядків. Звичайно, це може залежати від того, яку базу даних ви використовуєте. Якщо це щось на зразок SQL Server, то це не буде проблемою.

Ви, ймовірно, захочете створити індекс у полі QuestionID у таблиці tblAnswer.

Звичайно, вам потрібно вказати, яку базу даних ви використовуєте, а також орієнтовні обсяги.


0

Виглядає досить повно для опитування посмішки. Не забудьте додати таблицю для "відкритих значень", де клієнт може надати свою думку через текстове поле. Пов’яжіть цю таблицю із зовнішнім ключем до своєї відповіді та поставте індекси у всіх реляційних стовпцях для ефективності.


1
Чи є причина, чому я не міг також помістити коментарі до таблиці відповідей?
Майкл

0

Число 2 правильне. Використовуйте правильний дизайн до тих пір, поки ви не виявите проблеми з продуктивністю. Більшість RDBMS не матимуть проблем із вузькою, але дуже довгою таблицею.


0

Маючи велику таблицю відповідей, сама по собі, це не проблема. Поки показники та обмеження чітко визначені, у вас має бути все добре. Ваша друга схема мені добре виглядає.


0

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

Я не знаю, наскільки величезна велика кількість, але це повинно без проблем отримати пару мільйонів відповідей.


0

Ви можете зберігати всю форму як рядок JSON.

Не впевнений у своїй вимозі, але такий підхід спрацював би за певних обставин.

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