Я бы не советовал хранить столбец суммы в родительской таблице. Если два конкурирующих запроса попытаются обновить столбец суммы, один не удастся, или вы рискуете засорять сумму устаревшим чтением (если система не имеет большого трафика ...).
Запросы, которые вам требуются, довольно просты, и любая достойная база данных должна давать хорошую производительность на некоторое время (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 попадает в базу данных только один раз, и что ваш кэш становится недействительным при добавлении / обновлении новых элементов.