PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Hai bisogno di due indici su una tabella di join HABTM?

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.