Zamknij — najprawdopodobniej potrzebujesz:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
nie jest ściśle wymagane i zależy od tego, czy wielokrotne kojarzenie osoby z produktem ma sens. Powiedziałbym, że jeśli nie masz pewności, prawdopodobnie tak chcesz :unique
flaga.
Powodem struktury indeksu jest to, że wszystkie nowoczesne bazy danych mogą wykonywać zapytania zarówno na person_id, jak i product_id przy użyciu pierwszego indeksu niezależnie od kolejności określonej w zapytaniu . Np.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
są traktowane tak samo, a baza danych jest wystarczająco inteligentna, aby użyć pierwszego indeksu.
Podobnie zapytania używające tylko person_id
można również uruchomić przy użyciu pierwszego indeksu. Wielokolumnowe indeksy b-drzewa mogą wykorzystywać mniej kolumn niż podano, pod warunkiem, że są one określone z lewej strony oryginalnej deklaracji.
W przypadku zapytań używających tylko product_id
, nie można tego wykonać względem pierwszego indeksu (ponieważ indeks jest zdefiniowany z person_id na skrajnej lewej pozycji). Dlatego potrzebujesz osobnego indeksu, aby umożliwić wyszukiwanie tylko w tym polu.
Właściwość indeksu wielokolumnowego b-drzewa rozciąga się również na indeksy z większą liczbą kolumn. Jeśli masz indeks (person_id, product_id, favorite_color, shirt_size)
, możesz użyć tego indeksu do uruchamiania zapytań przy użyciu person_id
, (person_id, product_id)
itp., o ile kolejność jest zgodna z definicją.