5

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

我目前正在考虑将评论计数和评论总和列添加到产品表中,并操纵添加评论方法来更新计数和总和。

我很高兴听到一种更清洁的方式来做到这一点。

4

3 回答 3

2

我建议不要在您的父表上保留总和列。如果两个相互竞争的请求尝试更新 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 以确保休眠只访问数据库一次,并且当添加/更新新项目时,您的缓存无效。

于 2011-03-29T10:39:31.260 回答
0

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

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

于 2011-03-28T02:44:11.627 回答
0

休眠查询缓存可能是要走的路。否则,请按照您的原始想法进行。

于 2011-03-28T02:53:07.890 回答