Chiudi:molto probabilmente desideri quanto segue:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
Il :unique => true
non è strettamente richiesto e dipende dal fatto che abbia o meno senso avere una persona associata più volte a un prodotto. Direi che se non sei sicuro, probabilmente fai vuoi il :unique
bandiera.
Il motivo della struttura dell'indice è che tutti i database moderni possono eseguire query sia su person_id che su product_id utilizzando il primo indice indipendentemente dall'ordine specificato in una query . Es.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
sono trattati allo stesso modo e il database è abbastanza intelligente da utilizzare il primo indice.
Allo stesso modo, le query utilizzano solo person_id
può essere eseguito anche utilizzando il primo indice. Gli indici b-tree a più colonne possono utilizzare un minor numero di colonne rispetto a quelle specificate a sinistra della dichiarazione originale.
Per le query che utilizzano solo product_id
, questo non può essere eseguito sul primo indice (poiché quell'indice è definito con person_id nella posizione più a sinistra). Quindi è necessario un indice separato per abilitare le ricerche solo su quel campo.
La proprietà dell'indice b-tree a più colonne si estende anche agli indici con un numero maggiore di colonne. Se avevi un indice su (person_id, product_id, favorite_color, shirt_size)
, puoi utilizzare quell'indice per eseguire query utilizzando person_id
, (person_id, product_id)
, ecc, purché l'ordine corrisponda alla definizione.