Ruby on Rails 中的水平数据库扩展



我有一个Ruby on Rails应用程序,其中包含一个具有以下结构的PostgreSQL数据库:

class A < ActiveRecord::Base
   has_many :B
end
class B < ActiveRecord::Base
    has_many :C
end
class C < ActiveRecord::Base
    attr_accessible :x, :y :z
end

只有几个A,而且增长缓慢(比如一个月5个)。每个 A 有数千个 B,每个 B 有数万个 C(因此每个 A 都有数百万个 C)。

A

是独立的,来自不同 A 的 B 和 C 永远不会需要在一起(即在同一查询中)。

我的问题是,现在我只有几个A,ActiveRecord查询需要很长时间。当 C 的表有数千万行时,查询将永远花费。

我正在考虑水平扩展数据库(即 A 的表、B 的一个表和每个 A 的一个 C 表)。但我不知道该怎么做。我想这是一种分片,但是如果表取决于哪个 A im 使用,我无法弄清楚如何动态创建数据库表并使用 ActiveRecord 访问数据。

谢谢。

如果您只有几行甚至几百万行有性能问题,则需要在尝试对解决方案进行大气工程之前退后一步。您描述的问题很容易通过索引解决;创建额外的物理表没有任何优势,而且会引入令人难以置信的复杂性。

正如@mu太短已经说过的那样:注意你的查询计划。使用工具分析性能。

话虽如此,您可以使用表分区在物理上和透明地将数据存储到不同的分片表中,这对于增长非常快但仅在给定时间框(如一个月)内有用的数据特别有用。您还可以使用存档位标志列来执行此操作,以将旧的或删除的记录运送到一些较慢的存储(例如,由旋转锈迹组成的标准 RAID),同时将活动记录保存在更快的存储上(如 SSD 的 RAID)。

所以看起来你有一个树状的结构。如果真的不需要以某种交叉引用的方式将它们从数据库中提取出来,那么你的 A 完全具有"文档"的属性,看看 MongoDB。A 将与所有 B 一起保存,C 将保存在单个记录中。

http://www.mongodb.org/

如果您正在寻找ORM,请检查

http://mongoid.org/en/mongoid/index.html

最新更新