Det skema, du har beskrevet, vil være meget effektivt til den type forespørgsel, du er interesseret i, forudsat at du sætter de korrekte indekser på dine tabeller. Databaser opfører sig ikke som lister:At stille spørgsmålet "Hvilke aftaler deltog XXX i" burde ikke scanne hele tabellen, fordi en korrekt indekseret tabel ved præcis, hvor man kan finde alle XXXs tilbud.
For at få denne opsætning korrekt, ser du sådan her dine migreringer vil se ud:
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
Der er stadig meget mere, der hører hjemme i disse migreringer (du bør f.eks. tilføje ikke-nul-begrænsninger, unikke begrænsninger osv.). Men pointen er, at det at have disse indekser gør de databaseoperationer, du beskriver, ekstremt hurtige.