我有一个 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 |
我有每家餐厅的餐厅简介网页
,其中显示用户对餐厅的“数据”,例如“平均评分”
。
用户每天可以对餐厅进行评论和评分,但次数有限,因此一家餐厅每天可能会收到来自一个用户的许多新评分行。
我的问题是:
我应该每天(或每周?)运行一个 cronjob 来
SELECT AVG( rating_value)
每家餐厅来更新餐厅的“评级”,这会消耗大量内存吗?我是否应该保留 X 个最近的“评分”并使用 cronjob 每天为每家餐厅
选择 AVG( rating_value)
?
3.或者我应该只在提交新的“评级”时运行SELECT AVG( rating_value)
?
最佳答案
听起来您希望保持数据库负载较小,除非为该餐厅提交新的评级,否则该值不会更改。
我建议将此信息缓存在 memcache 或 redis 中,因为在数据库中复制此平均值是多余的。然后,您可以为此设置一个过期时间(例如一小时),并且仅在缓存解决方案中没有该值时才前往数据库获取该值。
如果您想要实时解决方案,那么您应该连接评论提交逻辑来刷新缓存的餐厅平均值。这将保证您的应用程序始终显示最准确的平均评分。
如果您想将数据存储到数据库中,那么我建议使用数据库触发器来更新存储此平均评分字段的表,或者像缓存解决方案一样,提交审核 Hook 来更新此值。
关于mysql : Best way to deal with data like average rating of restaurants etc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37216095/