6

我有一个带有 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

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

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

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

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

非常感谢。

4

2 回答 2

2

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

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

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

于 2012-11-30T04:06:02.310 回答
0

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

http://www.mongodb.org/

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

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

于 2012-11-30T09:25:45.010 回答