【发布时间】:2018-08-22 14:03:45
【问题描述】:
我有以下实体:
post_id | post_title | post_body
-------------------------------------
1 | First post | Hello, world!
并想在帖子上注册评分,如下所示:
rating_id | rating_user_id | rating_post_id | rating_rating
1 | 23 | 1 | 3.5
我主要关心/问题是,我应该如何检索帖子的平均评分。我知道我可以使用这样的 SQL 查询来做到这一点:
SELECT AVG(rating_rating) FROM post_ratings WHERE rating_post_id = 2;
但是我每次都必须调用这个查询$post->getAverageRating() - 这是一个很大的性能问题吗? (请记住,每个帖子可能有数千个评分)
另一种方法是将平均评分存储在posts 表的新列中,并让 cron 作业计算平均值或其他什么?
最好的方法是什么?
【问题讨论】:
-
这真的取决于用例的细节.. 数据库调用很昂贵,所以你想尽量减少它。一种方法是保留一个应用程序缓存,该缓存每 X 分钟进入数据库并加载新数据(或从头开始的所有数据)并在内存中计算,或加载已经计算的平均值,但是,您每 X 分钟执行一次而不是在每个帖子请求上。
-
我在一个评论网站上工作,我们有一个每天运行 4 次的 cron,它按照你的建议运行,唯一的区别是最终评级是用 php 计算的
-
没有。它不是。当它成为一个大的性能问题时,会发生两件事之一。要么你足够有钱,可以花钱请人来解决你的性能问题,要么你太有钱了。
-
我认为每次运行它都不是问题,除非它是一个具有高负载和访问权限的大型站点。如果是这种情况,只需每小时或每 6 小时运行一次 cron 作业并创建/更新缓存。