Opisany schemat będzie bardzo wydajny dla rodzaju zapytania, którym jesteś zainteresowany, pod warunkiem, że umieścisz prawidłowe indeksy w swoich tabelach. Bazy danych nie zachowują się jak listy:pytanie „W których transakcjach brało udział XXX” nie powinno skanować całej tabeli, ponieważ poprawnie zaindeksowana tabela będzie dokładnie wiedziała, gdzie znaleźć wszystkie transakcje XXX.
Aby zapewnić prawidłową konfigurację, migracje będą wyglądać tak:
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
W tych migracjach jest jeszcze wiele innych elementów (np. należy dodać ograniczenia niezerowe, ograniczenia unikatowości itp.). Ale chodzi o to, że posiadanie tych indeksów sprawia, że operacje na bazie danych, które opisujesz, są niezwykle szybkie.