Đóng - bạn rất có thể muốn những điều sau:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
là không bắt buộc nghiêm ngặt và việc một người liên kết với sản phẩm nhiều lần có hợp lý hay không. Tôi sẽ nói nếu bạn không chắc, có thể bạn làm muốn :unique
cờ.
Lý do cho cấu trúc chỉ mục là tất cả các cơ sở dữ liệu hiện đại có thể thực thi truy vấn trên cả person_id và product_id bằng cách sử dụng chỉ mục đầu tiên bất kể thứ tự được chỉ định trong truy vấn . Ví dụ:
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
được coi như nhau và cơ sở dữ liệu đủ thông minh để sử dụng chỉ mục đầu tiên.
Tương tự như vậy, các truy vấn chỉ sử dụng person_id
cũng có thể được chạy bằng cách sử dụng chỉ mục đầu tiên. Các chỉ mục b-tree nhiều cột có thể sử dụng ít cột hơn chúng đã cung cấp với điều kiện chúng được chỉ định từ bên trái của khai báo ban đầu.
Đối với các truy vấn chỉ sử dụng product_id
, điều này không thể được thực thi đối với chỉ mục đầu tiên (vì chỉ mục đó được xác định với person_id ở vị trí ngoài cùng bên trái). Do đó, bạn cần một chỉ mục riêng để chỉ cho phép tra cứu trên trường đó.
Thuộc tính chỉ mục cây b-cây nhiều cột cũng mở rộng đến các chỉ mục có số cột cao hơn. Nếu bạn có một chỉ mục trên (person_id, product_id, favorite_color, shirt_size)
, bạn có thể sử dụng chỉ mục đó để chạy các truy vấn bằng person_id
, (person_id, product_id)
, v.v., miễn là thứ tự phù hợp với định nghĩa.