我有一个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个“评分”的X值不变,并每天使用cronjob对每个餐厅SELECT AVG(rating_value)进行排名?


3.或者我应该只在提交新的“评分”时运行SELECT AVG(rating_value)吗?

最佳答案

听起来您想保持数据库负载轻便,除非该餐厅提交新的评分,否则该值不会改变。

我建议将这些信息缓存在诸如memcache或redis之类的文件中,因为在数据库中复制此平均值是多余的。然后,您可以对此设置一个过期时间(例如一小时),如果该值不在缓存解决方案中,则仅向DB获取该值。

如果您需要一个实时解决方案,则应加入评论提交逻辑以刷新餐厅的缓存平均值。这将确保您的应用程序始终显示最准确的平均评分。

如果要将数据存储到数据库中,那么我建议使用数据库触发器来更新存储该平均评分字段的表,或者像使用缓存解决方案一样,提交审阅钩子以更新该值。

关于mysql - Mysql:处理诸如餐厅平均评分等数据的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37216095/

10-10 04:55