O esquema que você descreveu será muito eficiente para o tipo de consulta que você está interessado, desde que você coloque os índices corretos em suas tabelas. Bancos de dados não se comportam como listas:fazer a pergunta "Em quais negócios o XXX participou" não deve examinar a tabela inteira, porque uma tabela indexada corretamente saberá exatamente onde encontrar todos os negócios do XXX.
Para configurar isso corretamente, veja como serão suas migrações:
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
Ainda há muito mais que pertence a essas migrações (por exemplo, você deve adicionar restrições não nulas, restrições de exclusividade etc.). Mas o ponto é que ter esses índices torna as operações de banco de dados que você está descrevendo extremamente rápidas.