假设我有一组产品,每个产品都有一组评论。每条评论都有一个分数。我需要更多的平均分数,然后我需要实际的评论。是否有任何最佳实践/干净的方法来预先计算平均值并将其存储在休眠中。
我目前正在考虑将评论计数和评论总和列添加到产品表中,并操纵添加评论方法来更新计数和总和。
我很高兴听到一种更清洁的方式来做到这一点。
假设我有一组产品,每个产品都有一组评论。每条评论都有一个分数。我需要更多的平均分数,然后我需要实际的评论。是否有任何最佳实践/干净的方法来预先计算平均值并将其存储在休眠中。
我目前正在考虑将评论计数和评论总和列添加到产品表中,并操纵添加评论方法来更新计数和总和。
我很高兴听到一种更清洁的方式来做到这一点。
我建议不要在您的父表上保留总和列。如果两个相互竞争的请求尝试更新 sum 列,一个会失败,或者您可能会因为过时的读取而破坏 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使用投影查询。如果这还不够快,那么我会研究二级缓存和查询缓存。
打开show_sql
并 TestTestTest 以确保休眠只访问数据库一次,并且当添加/更新新项目时,您的缓存无效。
我认为有一个更好的方法,一个不时运行的后台进程,并根据评论表对产品表中的评分计数和总分进行更新。
另一个想法是在评论/评级表中有更新时使用触发器,它将考虑(使用时间戳)并更新产品表。
休眠查询缓存可能是要走的路。否则,请按照您的原始想法进行。