説明したスキーマは、テーブルに正しいインデックスを設定すれば、関心のある種類のクエリに対して非常に効率的です。データベースはリストのように動作しません。「XXXが参加した取引はどれか」という質問をしても、テーブル全体をスキャンするべきではありません。正しくインデックス付けされたテーブルは、XXXのすべての取引を見つける場所を正確に知っているからです。
これを正しく設定するために、移行は次のようになります。
class CreateStandardUsers < ActiveRecord::Migration
def change
create_table :standard_users do |t|
t.string :name
t.timestamps
# More fields go here
end
add_index :standard_users, :name
end
end
class CreateDeals < ActiveRecord::Migration
def change
create_table :deals do |t|
t.references :admin_user
# other fields go here
end
add_index :deals, :admin_user_id
# other indices go here... anything you want to search on efficiently.
end
end
class CreateDealParticipations < ActiveRecord::Migration
def change
create_table :deal_participations do |t|
t.references :standard_user
t.references :deal
t.timestamps
end
add_index :deal_participations, :standard_user_id
add_index :deal_participations, :deal_id
add_index :deal_participations, :created_at
end
end
これらの移行に属するものはまだたくさんあります(たとえば、null以外の制約、一意性の制約などを追加する必要があります)。ただし、重要なのは、これらのインデックスを使用すると、記述しているデータベース操作が非常に高速になるということです。