PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Potrzebujesz dwóch indeksów w tabeli złączeń HABTM?

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ą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwiększyć klucz podstawowy podczas wstawiania partii postgres COPY?

  2. Pakiety PGLogical 1.1 dla PostgreSQL 9.6beta1

  3. Sekwencja upuszczania i kaskada

  4. Błąd pakietu — Nie można znaleźć biblioteki klienta PostgreSQL (libpq)

  5. Konwertuj datę na dzień juliański w PostgreSQL