Sluiten - u wilt waarschijnlijk het volgende:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
De :unique => true
is niet strikt vereist en het hangt ervan af of het zinvol is om een persoon meerdere keren aan een product te koppelen. Ik zou zeggen dat als je het niet zeker weet, je waarschijnlijk wel wil de :unique
vlag.
De reden voor de indexstructuur is dat alle moderne databases query's kunnen uitvoeren op zowel person_id als product_id met behulp van de eerste index ongeacht de volgorde die is opgegeven in een query . Bijv.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
worden als hetzelfde behandeld en de database is slim genoeg om de eerste index te gebruiken.
Evenzo kunnen zoekopdrachten met alleen person_id
kan ook worden uitgevoerd met behulp van de eerste index. B-tree-indexen met meerdere kolommen kunnen minder kolommen gebruiken dan ze hebben opgegeven, op voorwaarde dat ze worden opgegeven aan de linkerkant van de oorspronkelijke declaratie.
Voor vragen met alleen product_id
, kan dit niet worden uitgevoerd tegen de eerste index (aangezien die index is gedefinieerd met person_id in de meest linkse positie). Daarom heb je een aparte index nodig om alleen op dat veld opzoekingen mogelijk te maken.
De eigenschap b-tree index met meerdere kolommen is ook van toepassing op indexen met een groter aantal kolommen. Als je een index had op (person_id, product_id, favorite_color, shirt_size)
, kunt u die index gebruiken om zoekopdrachten uit te voeren met behulp van person_id
, (person_id, product_id)
, etc, zolang de volgorde overeenkomt met de definitie.