Прошу совета по архитектуре БД

118_64

Есть две таблицы: `Products` и `Reviews`, строки которых связаны через внешние ключи.
При выводе списка товаров необходимо указывать количество отзывов о каждом товаре.

Подхода два:

1) при выводе списка из `Products` для каждого товара подсчитать количество отзывов о нём из `Reviews`;
2) заранее в `Products` добавить столбец `count`, и при записи отзыва в `Reviews` увеличивать на единицу поле `count` в `Products`.

В первом варианте преимуществ я не вижу, во втором варианте значительно уменьшается нагрузка на БД.

Прошу совета, какой подход считается общепринятым? Для меня очевиден второй вариант, но хотел бы услышать мнение со стороны, если я ошибаюсь.

 

mkramer

Второй вариант нормальный, хоть и называется «денормализация», но надо руками всегда следить за столбцом count. Только я бы не увеличивал на единицу, а делал запрос

Код (Text):
  1. select count(1) from Reviews where product_id=?

Ещё вариант сделать очень быстрый group by запрос.

Код (Text):
  1. select product_id, count(1) from Reviews group by product_id
 

Дюран

Я б не делал денормализацию, пока это очень жестко не потребовалось(по причине производительности).
Весь этот дублеж даром не проходит.
Потом начнут прилетать задачи типа что review не надо учитывать, пока он не одобрен, пока он не лайкнут, пока он не с черного списка ip, и сиди потом думай как этот count пересчитывать.
Вот к тому запросу что последний в комментарии выше можно приджойнится и профит

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *