关闭 - 您很可能需要以下内容:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
The :unique => true
并不是严格要求的,这取决于让一个人多次与某个产品相关联是否有意义。我想说,如果你不确定,你可能do想要:unique
flag.
索引结构的原因是所有现代数据库都可以使用第一个索引对 person_id 和 Product_id 执行查询无论查询中指定的顺序如何. E.g.
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)
等等,只要顺序与定义匹配即可。