Вычисление и сохранение предварительно вычисленного среднего с Hibernate - PullRequest
5 голосов
/ 28 марта 2011

Скажем, у меня есть набор продуктов, и у каждого продукта есть набор отзывов.Каждый отзыв имеет оценку.Я буду нуждаться в среднем значении баллов гораздо чаще, чем в реальных обзорах.Существуют ли передовые методы / чистые способы предварительного вычисления среднего и сохранения его в режиме гибернации.

В настоящее время я думаю о добавлении столбцов количества отзывов и сумм обзора в таблицу продуктов и настройке метода добавления обзора для обновления счетчикаи сумма.

Я был бы очень рад услышать о более чистом способе сделать это.

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Я бы не советовал хранить столбец суммы в родительской таблице. Если два конкурирующих запроса попытаются обновить столбец суммы, один не удастся, или вы рискуете засорять сумму устаревшим чтением (если система не имеет большого трафика ...).

Запросы, которые вам требуются, довольно просты, и любая достойная база данных должна давать хорошую производительность на некоторое время (lazy psuedo SQL / HQL):

1) Определенная средняя оценка отзыва для продукта:

select sum(score)/count from reviews where product_id = ?

2) Список продуктов и их средние оценки

select product_name, sum(r.score)/count(r.score)
from products p
join reviews r
group by product_name

Для первого запроса убедитесь, что у вас есть какой-то индекс для product_id в таблице отзывов.

Используя hibernate, вы можете использовать проекционные запросы либо через HQL, либо с помощью Criteria объектов . Если это не достаточно быстро, я бы изучил кэширование второго уровня и кэширование запросов .

Включите show_sql и TestTestTest, чтобы удостовериться, что hibernate попадает в базу данных только один раз, и что ваш кэш становится недействительным при добавлении / обновлении новых элементов.

0 голосов
/ 28 марта 2011

Кэширование запросов в спящем режиме . В противном случае следуйте своей оригинальной идее.

0 голосов
/ 28 марта 2011

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

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

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