我有一个MySQL表,可以存储餐馆评分:
id | user_id | res_id | rating_value | review_id |
1 | 102 | 5567 | 4.0 | 26 |
2 | 106 | 5543 | 3.5 | 27 |
3 | 112 | 5567 | 3.0 | 31 |
我为每家餐厅Restaurant Profile webpage
显示了数据'和用户的'average rating'
一样。
用户可以查看&每天/每天为餐厅评分次数有限,因此单个餐厅每天只能收到一个新的评级行,仅由一个用户组成。
我的问题是:
我应该每天(或每周?)向每个餐厅的SELECT AVG(rating_value)
运行一个cronjob来更新评级'餐厅会消耗很多记忆吗?
我应该保留X个最近的评分'每个餐厅每天使用cronjob到SELECT AVG(rating_value)
吗?
3.或者我只应在新的评分时运行SELECT AVG(rating_value)
'提交了?
答案 0 :(得分:0)
听起来您希望保持数据库上的负载不会变化,除非为该餐厅提交新的评级,否则该值不会发生变化。
我建议将此信息缓存在memcache或redis之类的内容中,因为在数据库中复制此平均值是多余的。然后,您可以设置此期限(比如一小时),如果它不在您的缓存解决方案中,则仅转到数据库中。
如果您想要一个实时解决方案,那么您应该挂钩您的评论提交逻辑,以刷新餐厅的缓存平均值。这将保证您的应用程序始终显示最准确的平均评级。
如果您想将数据存储到数据库中,那么我建议使用数据库触发器来更新存储此平均评级字段的表,或者像缓存解决方案一样,提交审核挂钩以更新此值。
答案 1 :(得分:0)
有很多方法可以处理这种查询。 像一些人: -
您可以在添加新评级时运行
SELECT AVG(rating_value)
(使列成为索引且唯一以快速获取结果)
第二: -
您可以在添加新评分时运行
SELECT AVG(rating_value)
并将其保存 按餐馆ID或任何其他方式缓存。
第三: -
在添加新评级时,您可以按小时基于cronjob运行该查询 并将其保存在缓存中,这样就减少了对数据库的负担。
由于