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

Nic*_*las 6 ruby postgresql activerecord ruby-on-rails

我有一个带有PostgreSQL数据库的Ruby on Rails应用程序,该数据库具有以下结构:

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
Run Code Online (Sandbox Code Playgroud)

只有几个A,它们生长缓慢(比如每月5个).每个A有数千个B,每个B有数万个C(因此每个A有数百万个C).

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

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

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

非常感谢你.

cfe*_*uke 2

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

正如 @mu-is-too-short 已经说过的:注意你的查询计划。使用您的工具来分析性能。

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