Будет ли производительность БД лучше хранить все ответы пользователя в одной или нескольких строках - PullRequest
0 голосов
/ 25 июля 2011

Мне нужно создать таблицу для хранения ответов пользователя на вопрос, и они могут иметь до 12 ответов, какая структура таблицы будет работать лучше всего.Я создал 2 варианта, но если у вас есть идея получше, я открыт для предложений.

Таблица 1 (Сохранить каждый ответ в новой строке) UserId

  • QuestionId
  • Номер ответа
  • Ответ

Таблица 2 (Храните все ответы в одной строке)

  • UserId
  • QuestionId
  • Ответ 1
  • Ответ2
  • Ответ3
  • Ответ4
  • Ответ5
  • Ответ6
  • Ответ7
  • Ответ8
  • Ответ9
  • Ответ10
  • Ответ11
  • Ответ12

Ответы [ 7 ]

1 голос
/ 25 июля 2011

Я бы не рекомендовал ни один дизайн.

Все ответы в одном ряду разбивают первую нормальную форму.

У меня будет таблица вопросов, таблица пользователей и таблица ответов. Пользователю может быть дано много Вопросов; есть один ответ на вопрос.

1 голос
/ 25 июля 2011

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

Если все ваши ответы умещаются на одной странице, и вы ищете эту строку с помощью кластерного индекса, вероятно, решение 2 будет немного быстрее, и у вашего дерева будет меньше листьев, что сделает поиск меньшего набора данных. Вы также избегаете декартовой системы, которая идет с объединением.

Решение 1 будет немного быстрее, если у вас есть разбиение страницы. Пока столбец соединения индексируется, конечно.

Хотя в конечном итоге незначительное увеличение производительности, которое вы могли бы получить с опцией 1 по сравнению с опцией 2, вероятно, будет незначительным по сравнению с затратами на обслуживание плохого дизайна.

1 голос
/ 25 июля 2011

Вам не нужны избыточность и ненужные / неиспользуемые столбцы.От правильного дизайна БД вы должны определенно выбрать первый вариант.Это более нормализовано и добавит ценность, если вы решите масштабировать его в любое время позже.

1 голос
/ 25 июля 2011

Ответ вариант 2 будет работать лучше, потому что вам нужна только одна операция ввода-вывода для получения всех ответов. Однажды я построил хранилище данных с похожим «широким» дизайном, и оно работало на удивление хорошо.

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

С точки зрения дизайна базы данных, лучше использовать одну строку для ответа.
Это потому что:

  • добавление столбцов (чтобы обслужить больше ответов) связано с изменением схемы (намного сложнее), но добавление строк не
  • строки масштабируемы (что, если у кого-то было 1000 ответов - вы собираетесь до 1000 столбцов?)
  • запросы проще - вы должны назвать каждый ответ , если он хранится в столбцах, но в строках вы называете только столбец ответа и используете SQL, чтобы собрать все вместе

Если исходной целью не является необработанная скорость, предпочтите вариант 2 (больше строк), чем вариант 1 (больше столбцов).

1 голос
/ 25 июля 2011

лучше дать каждому ответу свой ряд.поэтому я бы порекомендовал перейти с вашей идеей к таблице 1. таким образом, если вы хотите увеличить предел с 12 до 20, вам не нужно добавлять новый столбец, и вы можете легче считать ответы.

0 голосов
/ 25 июля 2011

Вы должны определенно хранить ответы как отдельные записи.

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

С ответами в отдельных записях легче получить доступ к данным.Рассмотрим, например, что вы хотите получить последний ответ для каждого вопроса и пользователя.Это очень легко, если у вас есть ответы в виде отдельных записей, но очень сложно, если они есть в одной записи.

0 голосов
/ 25 июля 2011

Первый вариант также должен был бы хранить идентификатор пользователя несколько раз.
Я бы выбрал второй вариант, особенно если вы можете установить для него жесткое ограничение, например 12. Это также требует только одной записиоперация для базы данных.
Что это за 12 вещей ... месяцев?

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