数据库设计以绩效为重点

时间:2013-07-09 15:05:17

标签: mysql sql ruby-on-rails database

背景

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

问题:

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

尝试Post.reputation的解决方案:

a)在每个请求中单独读取所有联接。那将是阅读巨大的连接表并计算连接数。这是否会创建一个大的服务器负载,因为它加载了很多条目或者这不是一个问题,因为它基本上只有一个表?

b)根本不使用联接,但是将信誉总和存储在actual(类似于+1,类似于+0.1)和potential(+1对类似或不喜欢,+ 0.1对子类或次类不喜欢)。然后Post.reputation将是actual/potential。与此同时,我仍然需要使用users_posts的联接来限制每个帖子的1票。在我看来,这将是具有最佳性能的解决方案,但有没有办法用额外的变量实现100票数限制?因为看起来我几乎放弃了关于投票顺序的信息,这对此很重要。

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

问题:

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

1 个答案:

答案 0 :(得分:1)

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

附加说明:

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

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