схема базы данных для хранения анкет и ответов с несколькими вариантами ответов - PullRequest
0 голосов
/ 04 июля 2018

Нам нужна помощь в разработке схемы базы данных для вопросников и ответов с несколькими вариантами ответов.

Первый вариант - создать таблицу вопросов и таблицу ответов, как показано ниже

 * Question Table
   - question_id    auto integer
   - question       varchar

 * Answer Table
   - user_id        integer
   - question_id    integer
   - answer         integer 

Однако проблема с этим дизайном заключается в том, что, когда пользователь отправляет ответы на вопросники, необходимо вставить несколько строк и, следовательно, как запись, так и извлечение будут выполняться медленнее. Кроме того, стол будет расти очень большой. Тем не менее, преимущество заключается в том, что его можно расширять и легко добавлять новые вопросы.

Другой подход состоит в том, чтобы все ответы были в одной строке, но в другой колонке, например,

 * Answer Table
   - user_id        integer
   - answer_1       integer 
   - answer_2       integer 
   ...
   - answer_n       integer 

Преимущество состоит в том, что за один раз можно написать или получить только одну строку, и, следовательно, это будет намного быстрее, чем при первом подходе. Однако схема будет жесткой, и если будут добавлены какие-либо новые вопросы, схему db придется изменить, чтобы разместить новый столбец.

У нас более 3 миллионов пользователей и несколько анкет на пользователя. Следовательно, скорость, безусловно, является критерием. Исходя из этого критерия, какой вы предпочитаете? Есть ли другие альтернативы?

Спасибо

1 Ответ

0 голосов
/ 11 июля 2018

Предполагаемая денормализация, которую вы предлагаете во втором случае, безусловно, приведет к некоторому приросту производительности. Главный вопрос заключается в том, нужно ли вам эффективно осуществлять поиск по данным - возможно, вам не удастся, скажем, собрать расширенную статистику ответов (т. Е. Сколько людей дали от 3 до 6 ответов).

Если вам не нужна статистика, второй вариант лучше (с точки зрения производительности). Если вы это сделаете, может быть, вы должны придерживаться нормальной формы.

Компромисс - использование JSON вместо столбцов для хранения данных. Результаты могут быть сохранены во что-то вроде столбца jsonb PostgreSQL, который можно легко запросить. Ваш вопрос помечен как mysql, поэтому я не знаю, подходит ли вам этот вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...