0

我有存储餐厅收视率像MySQL表: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'

用户可以评论&为有限次数的餐厅每天计算一次,因此单个餐馆每天/每天可能会收到许多新的评分行,仅由一名用户单独提供。

我的问题是:

  1. 我应该每天(?或每周)运行一个cronjob到每家餐馆更新餐馆的“评分”的SELECT AVG(rating_value),这会消耗很多的内存?

  2. 我应该只保留最近的'收视率'的X数量,并使用cronjob到SELECT AVG(rating_value)它每天为每家餐厅?

3.或者,当提交新的“评级”时,我应该只运行SELECT AVG(rating_value)

回答

0

听起来好像您希望将数据库中的负载保持为一个不会更改的值,除非为该餐厅提交了新评级。

我建议将这些信息缓存在memcache或redis中,因为在数据库中重复这个平均值是多余的。然后,您可以在此设置过期时间(比如说一个小时),如果该值不在缓存解决方案中,则只能将该值设置到数据库中。

如果你想要一个实时解决方案,那么你应该挂钩你的评论提交逻辑来刷新餐厅的缓存平均值。这将保证您的应用程序始终显示最准确的平均评分。

如果您想要将数据存储到数据库中,那么我会建议使用数据库触发器来更新存储此平均评级字段的表格,或使用缓存解决方案,提交检查挂钩以更新此值。

0

有很多方法可以处理这种查询。 像一些: -

您可以运行在添加新的评价SELECT AVG(rating_value)(使列索引和独特获取快速结果)

二: -

您可以运行SELECT AVG(rating_value)上添加新的评级,并将其保存在 缓存的餐厅ID或任何其他方式。

三: -

添加新的等级,你可以按小时计算 上运行通过的cronjob该查询并将其保存在缓存中,这样的负荷数据库将减少。

谢谢

相关问题