我有一个带有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来访问数据,如果该表依赖于我正在使用的数据库。
非常感谢。
答案 0 :(得分:2)
如果您只有几行,甚至几百万行都有性能问题,那么在尝试大气设计解决方案之前,您需要退一步。通过索引可以很容易地解决您所描述的问题;创建额外的物理表是没有优势的,并且你会引入难以置信的复杂性。
由于@ mu-is-short-short已经说明:注意你的查询计划。使用工具分析性能。
话虽如此,您可以使用table partitioning以物理方式透明地将数据存储到不同的分片表中,这对于增长速度非常快但仅在给定时间内有用的数据非常有用(如一个月) )。您还可以使用存档位标记列将旧的或已删除的记录传送到某些较慢的存储(例如,由旋转生锈组成的标准RAID),同时在更快的存储上保留活动记录(如SSD的RAID)。
答案 1 :(得分:0)
所以看起来你有一个像树一样的结构。如果真的没有必要以某种交叉引用的方式将它们从数据库中拉出来,那么你的A就具有“文档”的属性,看看MongoDB。 A将与他们所有的B一起保存,并且C在单个记录中保存。
如果您正在寻找ORM,请检查