6

この構造を持つPostgreSQLデータベースを備えたRubyonRailsアプリがあります。

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が2つしかないので、ActiveRecordクエリにかなり時間がかかることです。Cのテーブルに数千万の行がある場合、クエリは永久にかかります。

データベースを水平方向にスケーリングすることを考えています(つまり、Aごとに1つのテーブル、Bごとに1つのテーブル、Aごとに1つのCのテーブル)。しかし、私はそれを行う方法がわかりません。これは一種のシャーディングだと思いますが、テーブルがどのA imを操作しているかに依存している場合、DBテーブルを動的に作成し、ActiveRecordを使用してデータにアクセスする方法を理解できません。

どうもありがとうございます。

4

2 に答える 2

2

数行だけ、または数百万行でさえパフォーマンスの懸念がある場合は、ソリューションの雰囲気を設計する前に、一歩下がる必要があります。あなたが説明している問題は、索引付けによって非常に簡単に解決されます。追加の物理テーブルを作成することに利点はなく、信じられないほど複雑になります。

@ mu-is-too-shortですでに述べたように、クエリプランに注意してください。ツールを使用してパフォーマンスを分析します。

そうは言っても、テーブルパーティショニングを使用して、データのストレージをさまざまなシャーディングテーブルに物理的かつ透過的に格納できます。これは、非常に高速に成長するが、特定のタイムボックス(1か月など)でのみ役立つデータに特に役立ちます。また、アーカイブビットフラグ列を使用してこれを実行し、古いレコードまたは削除されたレコードを低速のストレージ(たとえば、回転する錆で構成される標準RAID)にシャトルし、アクティブなレコードを高速のストレージ(SSDのRAIDなど)に保持することもできます。

于 2012-11-30T04:06:02.310 に答える
0

ですから、あなたは木のような構造をしているようです。ある種の相互参照方法でデータベースからそれらを引き出す必要が本当にない場合、Aはまさに「ドキュメント」のプロパティを持っています。MongoDBを見てください。AはすべてのBと一緒に保存され、Cは1つのレコードに保存されます。

http://www.mongodb.org/

ORMをお探しの場合は、次を確認してください

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

于 2012-11-30T09:25:45.010 に答える