Stäng - du vill troligen ha följande:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
är inte strikt obligatoriskt och det beror på om det är vettigt att ha en person kopplad till en produkt flera gånger. Jag skulle säga att om du inte är säker så gör du det vill ha :unique
flagga.
Anledningen till indexstrukturen är att alla moderna databaser kan köra frågor på både person_id och product_id med det första indexet oavsett vilken ordning som anges i en fråga . T.ex.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
behandlas som samma och databasen är smart nog att använda det första indexet.
På samma sätt, frågor som endast använder person_id
kan också köras med det första indexet. B-trädindex med flera kolumner kan använda färre kolumner än de har förutsatt att de anges från vänster om den ursprungliga deklarationen.
För frågor som endast använder product_id
, kan detta inte köras mot det första indexet (eftersom det indexet är definierat med person_id i positionen längst till vänster). Därför behöver du ett separat index för att möjliggöra uppslagningar enbart på det fältet.
Multi-column b-tree index-egenskapen sträcker sig också till index med högre antal kolumner. Om du hade ett index på (person_id, product_id, favorite_color, shirt_size)
, kan du använda det indexet för att köra frågor med person_id
, (person_id, product_id)
, etc, så länge som ordningen matchar definitionen.