Проектирование базы данных для обследования [закрыто]
Мне нужно создать опрос, где ответы хранятся в базе данных. Мне просто интересно, что было бы лучшим способом реализовать это в базе данных, в частности, необходимые таблицы. Опрос содержит различные типы вопросов. Например: текстовые поля для комментариев, вопросы с множественным выбором и, возможно, вопросы, которые могут содержать более одного ответа (т. е. проверить все, что применимо).
Я придумал два возможных решения:
создать гигантскую таблицу, которая содержит
ответы на каждый опрос
подчинение. Каждый столбец будет
соответствует ответ от
обследование. т. е. SurveyID, Answer1,
Ответ2, Ответ3
Я не думаю, что это лучший способ
так как вопросов очень много
в этом опросе и не очень
гибкий, если опрос должен измениться.
другая вещь, о которой я думал, была
создание таблицы вопросов и ответов
стол. Этот таблица вопросов будет
содержат все вопросы
обследование. Таблица ответов будет содержать
индивидуальные ответы из опроса,
каждая строка связана с вопросом.
простой пример:
tblSurvey: SurveyID
tblQuestion: QuestionID, SurveyID, QuestionType, Question
tblAnswer: AnswerID, имя пользователя,QuestionID, Ответ
tblUser: Идентификатор Пользователя, Имя Пользователя
моя проблема в том, что там
может быть тонны ответов, которые будут
сделайте таблицу ответов довольно огромной.
Я не уверен, что это так здорово, когда он
приходит на спектакль.
Я бы признателен за любые идеи и предложения.
11 ответов:
Я думаю, что ваша модель № 2 в порядке, однако вы можете взглянуть на более сложную модель, которая хранит вопросы и готовые ответы (предлагаемые ответы) и позволяет им повторно использоваться в различных опросах.
- один опрос может иметь много вопросов; один вопрос может быть (повторно)использован во многих опросах.
- один (предварительно сделанный) ответ может быть предложен для многих вопросов. На один вопрос может быть предложено много ответов. Вопрос может иметь различные ответы, предлагаемые в различных опросах. Один ответ может быть предложен на различные вопросы в различных опросах. По умолчанию существует" другой " ответ, если человек выбирает другого, его ответ записывается в ответ.Другой текст.
- один человек может участвовать во многих опросах, один человек может ответить на конкретный вопрос в опросе только один раз.
мой дизайн показан ниже.
последний сценарий создания находится в https://gist.github.com/durrantm/1e618164fd4acf91e372
сценарий и инструментальных средств СУБД MySQL.файл mwb также доступен по адресу
https://github.com/durrantm/survey
определенно вариант #2, Также я думаю, что у вас может быть надзор в текущей схеме, вам может понадобиться другая таблица:
+-----------+ | tblSurvey | |-----------| | SurveyId | +-----------+ +--------------+ | tblQuestion | |--------------| | QuestionID | | SurveyID | | QuestionType | | Question | +--------------+ +--------------+ | tblAnswer | |--------------| | AnswerID | | QuestionID | | Answer | +--------------+ +------------------+ | tblUsersAnswer | |------------------| | UserAnswerID | | AnswerID | | UserID | | Response | +------------------+ +-----------+ | tblUser | |-----------| | UserID | | UserName | +-----------+каждый вопрос, вероятно, будет иметь определенное количество ответов, которые пользователь может выбрать, а затем фактические ответы будут отслеживаться в другой таблице.
базы данных предназначены для хранения большого количества данных, и большинство масштабируются очень хорошо. Там нет реальной необходимости для пользователя меньше нормальная форма просто для экономии места больше.
Как правило, изменение схемы на основе того, что пользователь может изменить (например, добавление вопроса в опрос), должно считаться довольно вонючим. Есть случаи, когда это может быть уместно, особенно при работе с большими объемами данных, но знайте, что вы получаете, прежде чем погружаться. Наличие только таблицы "ответы" для каждого опроса означает, что добавление или удаление вопросов потенциально очень дорого, и очень сложно делать аналитику в вопросе-агностике путь.
Я думаю, что ваш второй подход лучше, но если вы уверены, что у вас будет много проблем с масштабом, одна вещь, которая работала для меня в прошлом, - это гибридный подход:
- создайте подробные таблицы ответов для хранения ответов на вопросы, как описано в разделе 2. Эти данные, как правило, не запрашиваются непосредственно из приложения, а используются для создания сводных данных для таблиц отчетов. Вы, вероятно, также хотите реализовать некоторые форма архивирования или удаления для этих данных.
- также при необходимости создайте таблицу ответов из 1. Это можно использовать всякий раз, когда пользователи хотят видеть простую таблицу результатов.
- для любой аналитики, которая должна быть выполнена для целей отчетности, запланируйте задания для создания дополнительных сводных данных на основе данных из 1.
Это абсолютно намного больше работы для реализации, поэтому я действительно не советовал бы этого, если вы не знаете наверняка, что эта таблица придется столкнуться с масштабными проблемами.
второй подход лучше.
Если вы хотите нормализовать его дальше, вы можете создать таблицу для типов вопросов
простые вещи, чтобы сделать это:
- поместите базу данных и войдите на свой собственный диск, а не на C по умолчанию
- создайте базу данных как можно больше, чтобы у вас не было пауз, пока база данных растет
У нас были таблицы журналов в таблице SQL Server с 10 миллионами строк.
нет 2 выглядит нормально.
для таблицы только с 4 столбцами это не должно быть проблемой, даже с несколькими миллионами строк. Конечно, это может зависеть от того, какую базу данных вы используете. Если его что-то вроде SQL Server, то это не будет проблемой.
вы, вероятно, захотите создать индекс в поле QuestionID, в таблице tblAnswer.
конечно, вам нужно указать, какую базу данных вы используете, а также предполагаемые объемы.
выглядит довольно полным для обследования smiple. Не забудьте добавить таблицу для "открытых значений", где клиент может предоставить свое мнение через текстовое поле. Свяжите эту таблицу с внешним ключом к вашему ответу и поместите индексы на все ваши реляционные столбцы для повышения производительности.
число 2 Правильно. Используйте правильный дизайн до тех пор, пока не обнаружите проблему с производительностью. Большинство СУБД не будет иметь проблем с узкой, но очень длинной таблицей.
наличие большой таблицы ответов, само по себе, не является проблемой. Пока индексы и ограничения хорошо определены, вы должны быть в порядке. Ваша вторая схема выглядит хорошо для меня.
учитывая правильный индекс, ваше второе решение нормализуется и хорошо подходит для традиционной системы реляционных баз данных.
Я не знаю, насколько огромен огромен, но он должен держать без проблем пару миллионов ответов.
вы можете сохранить всю форму в виде строки JSON.
Не уверен, о вашем требовании, но этот подход будет работать в некоторых случаях.


Comments