Как правильно организовать хранение рейтинга в MySql?
Делаю рейтинг, и задался вопросом.
Как лучше хранить рейтинг например для каждого товара?
Каждый голос в новой строке, а при выборки рейтинга выбирать все для нужного товара и потом считать?
Плюсы: что можно записать кто, когда и как проголосовал, но много строк будет для одного товара.
Или для каждого товара одна строка и сначала пересчитывать и потом в нее записывать прибавляя новое значение?
Минус, неизвестно кто как проголосовал, хотя можно сделать еще одну связанную таблицу для юзеров кто и как и когда проголосовал, а в другой конечный рейтинг, что бы постоянно не делать выборку среди миллионов голосов по нужному товару?
Как правильнее, что бы не делать велосипед? Я с рейтингом хранения дело не имел. Какие есть нюансы?
--------------
Смысл простой, зарегистрированный пользователь может голосовать за товар.
Rsa97: Да я думал про тригеры, вы имеете ввиду про хранимые процедуры самой базы? Я не хотел бы делать логику в разных местах, хотелось бы все на стороне фреймворка.
chelkaz: Это будет, скорее, не бизнес логика, а обеспечение целостности данных. Добавили строку в таблицу отзывов - триггер автоматически пересчитал рейтинг. Удалили/изменили строку - триггер снова пересчитал рейтинг.
Rsa97: А как это будет выглядеть примерно? У меня 4 поля в рейтинге для товара, у каждого поля своя оценка. В итоге нужна средняя сумма для каждого поля и количество голосов. Как это просто тригером сделать?
CREATE TRIGGER `votes_after_insert` AFTER INSERT ON `votes` FOR EACH ROW
BEGIN
INSERT INTO `items`
(`id`, `rating1`, `rating2`, `rating3`, `rating4`, `votes_count`)
SELECT `item_id`, AVG(`rating1`), AVG(`rating2`),
AVG(`rating3`), AVG(`rating4`), COUNT(*)
FROM `votes`
WHERE `item_id` = NEW.`item_id`
ON DUPLICATE KEY UPDATE
`rating1` = VALUES(`rating1`), `rating2` = VALUES(`rating2`),
`rating3` = VALUES(`rating3`), `rating4` = VALUES(`rating4`),
`votes_count` = VALUES(`votes_count`);
END
Ну и аналогичные AFTER UPDATE и AFTER DELETE.
Вариант с ON DUPLICATE KEY UPDATE хорош тем, что позволяет сделать всю выборку из `votes` одним запросом SELECT.
Rsa97: Скажите, я правильно понимаю работу тригера?
При добавлении или изменении голоса в таблице votes
происходит подсчет средних значений нужных полей, и количества и после заносятся в таблицу с товаром. Верно?