【问题标题】:Mysql : Best way to deal with data like average rating of restaurants etc?Mysql:处理餐厅平均评分等数据的最佳方法?
【发布时间】:2016-05-13 17:34:03
【问题描述】:

我有一个 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.或者我应该只在提交新的“评级”时运行SELECT AVG(rating_value)

【问题讨论】:

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


    【解决方案1】:

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

    我建议将此信息缓存在 memcache 或 redis 之类的东西中,因为在数据库中复制此平均值是多余的。然后,您可以为此设置一个过期时间(比如一小时),并且只有在缓存解决方案中没有该值时才去数据库获取该值。

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

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

    【讨论】:

      【解决方案2】:

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

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

      第二个:-

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

      第三:-

      在添加新评级时,您可以通过 cronjob 每小时运行该查询 并将其保存在缓存中,从而减少对数据库的负载。

      谢谢

      【讨论】:

        猜你喜欢
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 2019-08-20
        • 2019-10-27
        • 2011-06-23
        • 1970-01-01
        相关资源
        最近更新 更多