За последние 24 часа нас посетили 20824 программиста и 1135 роботов. Сейчас ищут 395 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем 118_64, 15 янв 2021.

  1. 118_64

    118_64 Активный пользователь

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

    Подхода два:

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

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

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

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Второй вариант нормальный, хоть и называется "денормализация", но надо руками всегда следить за столбцом 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
     
    Вероломство и 118_64 нравится это.
  3. Дюран

    Дюран Активный пользователь

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