Luk - du vil højst sandsynligt have følgende:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
er ikke strengt påkrævet, og det afhænger af, om det giver mening at have en person tilknyttet et produkt flere gange. Jeg vil sige, at hvis du ikke er sikker, så gør du det vil have :unique
flag.
Årsagen til indeksstrukturen er, at alle moderne databaser kan udføre forespørgsler på både person_id og product_id ved hjælp af det første indeks uanset rækkefølgen angivet i en forespørgsel . F.eks.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
behandles som det samme, og databasen er smart nok til at bruge det første indeks.
Ligeledes forespørgsler, der kun bruger person_id
kan også køres ved hjælp af det første indeks. B-træindekser med flere kolonner kan bruge færre kolonner, end de har, forudsat at de er angivet til venstre for den oprindelige erklæring.
For forespørgsler, der kun bruger product_id
, kan dette ikke udføres mod det første indeks (da det indeks er defineret med person_id i positionen længst til venstre). Derfor har du brug for et separat indeks for at aktivere opslag på det felt alene.
Egenskaben for b-træindeks med flere kolonner udvides også til indekser med højere antal kolonner. Hvis du havde et indeks på (person_id, product_id, favorite_color, shirt_size)
, kan du bruge det indeks til at køre forespørgsler ved hjælp af person_id
, (person_id, product_id)
osv., så længe rækkefølgen matcher definitionen.