使用Hibernate计算和存储预先计算的平均值

时间:2011-03-28 02:36:48

标签: java hibernate hibernate-annotations

假设我有一组产品,每个产品都有一组评论。每个评论都有一个分数。我需要更多的平均分数,然后我需要实际的评论。是否有任何最佳实践/清洁方法来预先计算平均值并将其与休眠一起存储。

我目前正在考虑将审核计数和审核总和列添加到产品表中,并绑定添加审核方法以更新计数和总和。

我很高兴听到更清洁的方式。

3 个答案:

答案 0 :(得分:2)

我建议不要在父表上保留一个sum列。如果两个竞争请求尝试更新sum列,那么一个会失败,或者您冒险使用过时读取来破坏总和(除非系统没有高流量......)。

你需要的查询非常简单,任何像样的db都应该提供一段时间的良好性能(懒惰的伪造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 objects使用投影查询。如果那还不够快,那么我会调查second level caching and query caching

启用show_sql和TestTestTest以确保hibernate仅访问数据库一次,并且在添加/更新新项目时缓存无效。

答案 1 :(得分:0)

我认为有一种更好的方法,一个不时运行的后台流程,并根据评论表对产品表中的计数和总评分进行更新。

另一个想法是在审核/评级表中有更新时使用触发器,它会将其考虑在内(使用时间戳)并更新产品表。

答案 2 :(得分:0)

Hibernate query caching可能是要走的路。否则,请按照你原来的想法。