Должен ли я дублировать данные в моей БД? - PullRequest
2 голосов
/ 15 ноября 2010

У меня есть БД MySQL, содержащая запись для страниц веб-сайта. Допустим, у него есть такие поля, как:

Table pages:

id  |  title  | content | date | author

Пользователи могут голосовать за каждую страницу, поэтому у меня есть две другие таблицы

Table users:
id  |  name  | etc etc etc

Table votes:
id  |  id_user | id_page | vote

Теперь у меня есть страница, где я показываю список страниц (10-50 за раз) с различной информацией наряду со средним голосом страницы.

Итак, мне было интересно, было бы лучше:

a) Запустите запрос, чтобы отобразить страницы (обратите внимание, что он уже довольно тяжелый, поскольку он запрашивает три таблицы), а затем для каждой записи выполните другой запрос, чтобы вычислить средний голос (или добавить 4-е объединение в основной запрос? ).

или

b) Добавить столбец «среднего голоса» в таблицу страниц, который я буду обновлять (вместе с таблицей голосования), когда пользователь будет голосовать за страницу.

Nico

Ответы [ 3 ]

6 голосов
/ 15 ноября 2010

Используйте базу данных для того, для чего она предназначена;вариант А, безусловно, ваш лучший выбор.Стоит отметить, что ваш запрос на самом деле не очень тяжелый, объединяя три таблицы;SQL действительно превосходен в таких вещах.

Будьте осторожны с попытками такого рода преждевременной оптимизации SQL;SQL гораздо более эффективен в том, что делает, чем думает большинство людей.

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

1 голос
/ 15 ноября 2010

Честно говоря, для этого вопроса я бы порекомендовал избыточную информацию.По моему мнению, несколько голосов за несколько страниц могут создать большую нагрузку на сервер.Если вы рассчитываете на реальный трафик на вашем сайте, конечно ...: -)

1 голос
/ 15 ноября 2010

Вы можете "повторить себя" (нарушить СУХОЙ) ради производительности.Компромиссами являются (а) дополнительное хранилище и (б) дополнительная работа по поддержанию целостности всего в вашей БД.

В обоих случаях есть свои преимущества / недостатки.Впрочем, слишком ранняя оптимизация имеет свои недостатки.

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