Tutup - kemungkinan besar Anda menginginkan yang berikut ini:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
tidak sepenuhnya diperlukan dan itu tergantung apakah masuk akal untuk memiliki seseorang yang terkait dengan suatu produk beberapa kali. Saya akan mengatakan jika Anda tidak yakin, Anda mungkin melakukannya ingin :unique
bendera.
Alasan struktur indeks adalah bahwa semua database modern dapat mengeksekusi kueri pada person_id dan product_id menggunakan indeks pertama terlepas dari urutan yang ditentukan dalam kueri . Mis.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
diperlakukan sama dan database cukup pintar untuk menggunakan indeks pertama.
Demikian juga, kueri hanya menggunakan person_id
juga dapat dijalankan menggunakan indeks pertama. Indeks b-tree multi-kolom dapat menggunakan lebih sedikit kolom daripada yang disediakan, jika ditentukan dari kiri deklarasi asli.
Untuk kueri hanya menggunakan product_id
, ini tidak dapat dijalankan terhadap indeks pertama (karena indeks itu ditentukan dengan person_id di posisi paling kiri). Oleh karena itu, Anda memerlukan indeks terpisah untuk mengaktifkan pencarian di bidang itu saja.
Properti indeks b-tree multi-kolom juga meluas ke indeks dengan jumlah kolom yang lebih tinggi. Jika Anda memiliki indeks di (person_id, product_id, favorite_color, shirt_size)
, Anda dapat menggunakan indeks itu untuk menjalankan kueri menggunakan person_id
, (person_id, product_id)
, dll, selama urutannya sesuai dengan definisi.