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 sí 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.