Fechar - você provavelmente deseja o seguinte:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
O
:unique => true
não é estritamente necessário e depende se faz sentido ou não ter uma pessoa associada a um produto várias vezes. Eu diria que, se você não tiver certeza, provavelmente tem quer o :unique
bandeira. A razão para a estrutura do índice é que todos os bancos de dados modernos podem executar consultas em person_id e product_id usando o primeiro índice independentemente da ordem especificada em uma consulta . Por exemplo.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
são tratados como iguais e o banco de dados é inteligente o suficiente para usar o primeiro índice.
Da mesma forma, consultas usando apenas
person_id
também pode ser executado usando o primeiro índice. Os índices de árvore b de várias colunas podem usar menos colunas do que as que têm, desde que sejam especificadas à esquerda da declaração original. Para consultas usando apenas
product_id
, isso não pode ser executado no primeiro índice (já que esse índice é definido com person_id na posição mais à esquerda). Portanto, você precisa de um índice separado para permitir pesquisas apenas nesse campo. A propriedade de índice de árvore b com várias colunas também se estende a índices com números mais altos de colunas. Se você tivesse um índice em
(person_id, product_id, favorite_color, shirt_size)
, você pode usar esse índice para executar consultas usando person_id
, (person_id, product_id)
, etc, desde que a ordem corresponda à definição.