Het schema dat je hebt beschreven zal zeer efficiënt zijn voor het soort zoekopdracht waarin je geïnteresseerd bent, op voorwaarde dat je de juiste indices op je tabellen plaatst. Databases gedragen zich niet als lijsten:het stellen van de vraag "Aan welke deals heeft XXX deelgenomen" zou niet de hele tabel moeten scannen, omdat een correct geïndexeerde tabel precies weet waar alle deals van XXX te vinden zijn.
Om dit correct in te stellen, zien uw migraties er als volgt uit:
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
Er is nog veel meer dat bij deze migraties hoort (u moet bijvoorbeeld niet-null-beperkingen, uniciteit-beperkingen, enz. toevoegen). Maar het punt is dat het hebben van deze indices de databasebewerkingen die je beschrijft extreem snel maakt.