Blisko - najprawdopodobniej chcą następujące:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
nie jest bezwzględnie wymagane i to zależy od tego, czy posiadanie osoby stowarzyszonej ma sens ed z produktem wiele razy. Powiedziałbym, jeśli nie jesteś pewien, prawdopodobnie do chcesz flaga :unique
.
Powodem konstrukcji indeksu jest to, że wszystkie nowoczesne bazy danych mogą wykonywać kwerendy na obu person_id i PRODUCT_ID używając pierwszego indeksu niezależnie od kolejności podanej w zapytaniu. Na przykład.
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 korzystające tylko z person_id
mogą być również uruchamiane przy użyciu pierwszego indeksu. Wielokolumnowe indeksy B-drzewa mogą wykorzystywać mniej kolumn niż pod warunkiem, że są określone po lewej stronie oryginalnej deklaracji.
Dla zapytań używających tylko product_id
, nie można tego dokonać wobec pierwszego indeksu (ponieważ ten indeks jest zdefiniowany z person_id w skrajnej lewej pozycji). Dlatego potrzebny jest osobny indeks, aby umożliwić wyszukiwanie tylko w tym polu.
Właściwość indeksu wielu drzewiastych indeksów b także obejmuje indeksy o większej liczbie kolumn. Jeśli masz indeks na (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)
itd., O ile zamówienie jest zgodne z definicją.
Rozumiem, że jeśli zapytanie zostanie wysłane przez "id_produktu", a następnie "id_osobisty", nie będzie używać indeksu w obu kolumnach, które masz powyżej. – sscirrus