PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Benötigen Sie zwei Indizes für eine HABTM-Join-Tabelle?

Schließen - Sie möchten höchstwahrscheinlich Folgendes:

add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id

Der :unique => true ist nicht unbedingt erforderlich und hängt davon ab, ob es sinnvoll ist, eine Person mehrfach mit einem Produkt zu verknüpfen. Ich würde sagen, wenn Sie sich nicht sicher sind, tun Sie es wahrscheinlich wollen den :unique Flagge.

Der Grund für die Indexstruktur ist, dass alle modernen Datenbanken Abfragen sowohl auf person_id als auch auf product_id ausführen können, indem sie den ersten Index unabhängig von der in einer Abfrage angegebenen Reihenfolge verwenden . Z. B.

SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1

werden gleich behandelt und die Datenbank ist intelligent genug, um den ersten Index zu verwenden.

Ebenso Abfragen, die nur person_id verwenden kann auch mit dem ersten Index ausgeführt werden. Mehrspaltige B-Tree-Indizes können weniger Spalten verwenden, als sie angegeben haben, vorausgesetzt, sie werden links von der ursprünglichen Deklaration angegeben.

Für Abfragen, die nur product_id verwenden , kann dies nicht gegen den ersten Index ausgeführt werden (da dieser Index mit person_id ganz links definiert ist). Daher benötigen Sie einen separaten Index, um Suchen nur für dieses Feld zu ermöglichen.

Die mehrspaltige B-Tree-Indexeigenschaft erstreckt sich auch auf Indizes mit einer höheren Anzahl von Spalten. Wenn Sie einen Index für (person_id, product_id, favorite_color, shirt_size) hatten , könnten Sie diesen Index verwenden, um Abfragen mit person_id auszuführen , (person_id, product_id) , etc, solange die Reihenfolge mit der Definition übereinstimmt.