gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:51 24 4
gpt4 key购买 nike

我有一个 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 的表)。但我不知道该怎么做。我猜这是一种分片,但我无法弄清楚如何动态创建数据库表并使用 ActiveRecord 访问数据(如果该表取决于我正在使用的 A)。

非常感谢。

最佳答案

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

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

也就是说你可以使用 table partitioning以物理和透明的方式将数据存储到不同的分片表中,这对于增长非常快但仅在给定时间盒(如一个月)内有用的数据特别有用。您还可以使用存档位标志列来执行此操作,将旧的或已删除的记录传送到一些较慢的存储设备(例如,由旋转锈 eclipse 组成的标准 RAID),同时将事件记录保存在更快的存储设备(如 SSD 的 RAID)上。

关于ruby-on-rails - Ruby on Rails 中的水平数据库扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13638333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com