Mysql:处理餐馆平均评级等数据的最佳方式?

时间:2016-05-13 17:34:03

标签: mysql database codeigniter database-design relational-database

我有一个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. 我应该每天(或每周?)向每个餐厅的SELECT AVG(rating_value)运行一个cronjob来更新评级'餐厅会消耗很多记忆吗?

  2. 我应该保留X个最近的评分'每个餐厅每天使用cronjob到SELECT AVG(rating_value)吗?

  3. 3.或者我只应在新的评分时运行SELECT AVG(rating_value)'提交了?

2 个答案:

答案 0 :(得分:0)

听起来您希望保持数据库上的负载不会变化,除非为该餐厅提交新的评级,否则该值不会发生变化。

我建议将此信息缓存在memcache或redis之类的内容中,因为在数据库中复制此平均值是多余的。然后,您可以设置此期限(比如一小时),如果它不在您的缓存解决方案中,则仅转到数据库中。

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

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

答案 1 :(得分:0)

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

  

您可以在添加新评级时运行SELECT AVG(rating_value)(使列成为索引且唯一以快速获取结果)

第二: -

  

您可以在添加新评分时运行SELECT AVG(rating_value)并将其保存   按餐馆ID或任何其他方式缓存。

第三: -

  

在添加新评级时,您可以按小时基于cronjob运行该查询   并将其保存在缓存中,这样就减少了对数据库的负担。

由于