sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Necesita dos índices en una tabla de combinación HABTM?

Cerrar:lo más probable es que desee lo siguiente:

add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id

El :unique => true no es estrictamente necesario y depende de si tiene o no sentido asociar a una persona con un producto varias veces. Diría que si no está seguro, probablemente quiero el :unique bandera.

El motivo de la estructura del índice es que todas las bases de datos modernas pueden ejecutar consultas tanto en person_id como en product_id utilizando el primer índice independientemente del orden especificado en una consulta . Por ejemplo

SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1

se tratan como iguales y la base de datos es lo suficientemente inteligente como para usar el primer índice.

Del mismo modo, las consultas que utilicen solo person_id también se puede ejecutar utilizando el primer índice. Los índices de árbol b de varias columnas pueden usar menos columnas de las que tienen, siempre que se especifiquen desde la izquierda de la declaración original.

Para consultas usando solo product_id , esto no se puede ejecutar contra el primer índice (ya que ese índice se define con person_id en la posición más a la izquierda). Por lo tanto, necesita un índice separado para habilitar las búsquedas solo en ese campo.

La propiedad de índice de árbol b de varias columnas también se extiende a índices con un mayor número de columnas. Si tuviera un índice en (person_id, product_id, favorite_color, shirt_size) , podría usar ese índice para ejecutar consultas usando person_id , (person_id, product_id) , etc., siempre que el orden coincida con la definición.