假设我有一组产品,每个产品都有一组评论。每条评论都有一个分数。我将更频繁地需要分数的平均值,然后我将需要实际的评论。是否有任何最佳实践/干净的方法来预先计算平均值并将其存储在 hibernate 中。
我目前正在考虑向产品表添加评论计数和评论总和列,并操纵添加评论方法来更新计数和总和。
如果听到更简洁的方法,我会很高兴。
最佳答案
我建议不要在父表中保留总和列。如果两个相互竞争的请求试图更新 sum 列,一个将失败,或者您冒着用过时的读取破坏总和的风险(除非系统没有高流量......)。
您需要的查询非常简单,任何体面的数据库都应该在一段时间内提供良好的性能(惰性伪 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 只访问数据库一次,并且当添加/更新新项目时您的缓存无效。
关于java - 使用 Hibernate 计算和存储预先计算的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454098/