Схемата, която описахте, ще бъде много ефективна за вида заявка, която ви интересува, при условие че поставите правилните индекси на вашите таблици. Базите данни не се държат като списъци:задаването на въпроса „В кои сделки е участвал 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
Има още много неща, които принадлежат към тези миграции (напр. трябва да добавите ненулеви ограничения, ограничения за уникалност и т.н.). Но въпросът е, че наличието на тези индекси прави операциите с базата данни, които описвате, изключително бързи.