关闭 - 您很可能需要以下内容:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true 不是严格要求的,它取决于让一个人与产品多次关联是否有意义。我会说,如果您不确定,您可能确实想要:unique 标志。
索引结构的原因是所有现代数据库都可以使用第一个索引对 person_id 和 product_id 执行查询无论查询中指定的顺序如何。例如
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
被视为相同,并且数据库足够智能以使用第一个索引。
同样,仅使用 person_id 的查询也可以使用第一个索引运行。多列 b 树索引可以使用比从原始声明左侧指定的列更少的列。
对于仅使用 product_id 的查询,不能针对第一个索引执行此操作(因为该索引是用 person_id 在最左边的位置定义的)。因此,您需要一个单独的索引来单独启用对该字段的查找。
多列 b 树索引属性还扩展到具有更多列数的索引。如果您在 (person_id, product_id, favorite_color, shirt_size) 上有索引,则可以使用该索引运行使用 person_id、(person_id, product_id) 等的查询,只要顺序与定义匹配即可。