PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Precisa de dois índices em uma tabela de junção HABTM?


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.