假设我有一组产品,每个产品都有一组评论。每个评论都有一个分数。我需要更多的平均分数,然后我需要实际的评论。是否有任何最佳实践/清洁方法来预先计算平均值并将其与休眠一起存储。
我目前正在考虑将审核计数和审核总和列添加到产品表中,并绑定添加审核方法以更新计数和总和。
我很高兴听到更清洁的方式。
答案 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可能是要走的路。否则,请按照你原来的想法。