0

背景:

我正在尝试在 RoR 中优化一个完整的 Ajax 驱动论坛。由于 RoR 已经不是完整 ajax 站点的最佳平台,我正在尝试优化我的 sql 请求和存储。

问题:

帖子的声誉基于简单的喜欢/不喜欢从 0-100% 变化,而主要只有最后 100 票应计入所有其他帖子的声誉的 10%,这些帖子引用/回答了该帖子。现在,将该值存储在我的数据库中以便快速读取的最有效方法是什么?

尝试过的解决方案Post.reputation

a) 在每个请求上分别读取所有连接。那将是读取巨大的连接表并计算连接。这是否会产生很大的服务器负载,因为它加载了许多条目,或者这不是问题,因为它基本上只有 1 个表?

b) 根本不使用连接,而是将信誉总和存储在actual(+1 on like, +0.1 on sub-like)和potential(+1 on like or dislike, +0.1 on sub-like or sub-dislike)。那么Post.reputation将是actual/potential. 同时,我仍然必须使用 joinsusers_posts来限制每个帖子的 1 票。在我看来,这将是性能最好的解决方案,但是有没有办法通过额外的变量来实现 100 票计数限制?因为似乎我几乎放弃了有关投票顺序的信息,这对此很重要。

c) 基本上像a)一样存储所有连接,但另外在数据库中存储信誉值,以便在添加引用连接时读取和计算 + 写入它。在数据库中多次存储相同信息是一种错误的方式吗?

问题:

哪种解决方案最聪明地将该信息存储在我的数据库中并快速/经常访问它?

4

1 回答 1

1

最好的方法是(c)。很多时候,在 RDBMS 中,我们确实将冗余信息存储为缓存以提高性能。

补充笔记:

  • 确保连接表在 [post_id, id] 上有索引。这将加快从连接表中选择第 100 条记录的速度。
  • 进行更新的好地方是连接表模型的回调。这将确保更新在事务中。
  • 在 Post 的 has_many 定义中,将 :order 指定为首先给出最新 user_post 的标准(很可能是 id desc)。这将简化其他查询。

如果您需要一些原理图代码,请告诉我。

于 2013-07-11T16:34:16.737 回答