Как в БД организовать хранение учета проданных товаров?

Добрый день

Цель:
Возникла необходимость хранить в БД учет проданных товаров.

Для чего:
В каждой категории (пример: телевизор, бытовая техника, сотовые телефоны) выводить самый продаваемый товар данной категории. Т.е. при просмотре каталога с телевизорами, блок "хит продаж" будет отображать самый продаваемый товар этой категории, т.е. самый продаваемый телевизор и т.д. по категориям.

Структура таблицы:

id (autoincrement)
product_id (id проданного товара, это торговое предложение) (int)
parent_product_id (id родительского товара) (int)
category_id (id категории товара) (int)
qty (количество проданного товара) (int)

Вопрос:
Как лучше сделать? Каждый раз делать запрос в БД или хранить общие данные по product_id в другой таблице? И по cron один раз в день пересчитывать количество проданных товаров?
  • Вопрос задан
  • 3829 просмотров
Решения вопроса 2
xaver
@xaver
Цифровой кочевник
Приведу пример как было с нашим магазином.
Сначала у нас было 10 000 ед. продукции и проблем не составляло при каждом заходе посетителя обращаться в базу и брать оттуда актуальные данные о том, что лучше продается.

Однако когда товаров стало 2млн и проект перешел почти что в high-load, было принято решение раз в полдня залазить в базу, для каждой группы товаров искать там наиболее продаваемый и сразу же строить кеш для отображения.

Так что всё зависит от того, какие системы вы используете, какую нагрузку, какое масштабирование. В каждом случае решения хороши по своему.
Ответ написан
Сделать запрос после продажи. Допустим 1 раз вы взяли самый продаваемый товар и сохранили в каком то файле. После этого если не было не одного продажей нет смысла еще раз делать запрос поскольку ответ будет таким же. После продажи какого либо товара следует еще раз сделать запрос и .т.д.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Что-то вроде

SELECT  *
FROM    (SELECT category_id,
                ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY qty DESC) AS RowNumber
         FROM   table_name
        ) AS a
WHERE   a.RowNumber = 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы