Skema yang Anda jelaskan akan sangat efisien untuk jenis kueri yang Anda minati, asalkan Anda meletakkan indeks yang benar di tabel Anda. Basis data tidak berperilaku seperti daftar:mengajukan pertanyaan "Kesepakatan mana yang diikuti XXX" tidak boleh memindai seluruh tabel, karena tabel yang diindeks dengan benar akan tahu persis di mana menemukan semua transaksi XXX.
Untuk menyiapkannya dengan benar, seperti inilah tampilan migrasi Anda:
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
Masih banyak lagi yang termasuk dalam migrasi ini (mis. Anda harus menambahkan batasan non-null, batasan keunikan, dll). Tapi intinya adalah memiliki indeks ini membuat operasi database yang Anda gambarkan menjadi sangat cepat.