mysql : Best way to deal with data like average rating of restaurants etc?

标签 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 |

我有每家餐厅的餐厅简介网页,其中显示用户对餐厅的“数据”,例如“平均评分”

用户每天可以对餐厅进行评论和评分,但次数有限,因此一家餐厅每天可能会收到来自一个用户的许多新评分行。

我的问题是:

  1. 我应该每天(或每周?)运行一个 cronjob 来SELECT AVG( rating_value) 每家餐厅来更新餐厅的“评级”,这会消耗大量内存吗?

  2. 我是否应该保留 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/

相关文章:

mysql - ActiveRecord - 非法混合排序规则

php - 是否可以获得cpanel mysql数据库前缀?

java - 为什么这个PreparedStatement会抛出mysql错误?

python - 数据库中的 Zlib - Django

php - 我做错了吗,或者在使用数组作为字段名称时 CodeIgniter 表单验证库中是否存在错误?

php - 没有从 htaccess 中的 SetEnv 变量获取 $_SERVER 中的值

php - 循环遍历 MySQL 数据库直到字段 = 'specified value'

database - Oracle SELECT - 双引号还是没有双引号?

php - 通过 HTML 链接启动表单来更改 MySQL 数据?

php - 循环 DATETIME 并在 DATETIME 内保留 DATES