閉じる - ほとんどの場合、次のものが必要です。
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
これ:unique => true
は厳密には必須ではなく、人を製品に複数回関連付けることが理にかなっているかどうかによって異なります。よくわからない場合は、おそらく:unique
フラグが必要です。
インデックス構造の理由は、最新のデータベースはすべて、クエリで指定された順序に関係なく、最初のインデックスを使用して person_id と product_id の両方でクエリを実行できるためです。例えば
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
は同じものとして扱われ、データベースは最初のインデックスを使用するのに十分スマートです。
同様に、only を使用したクエリperson_id
は、最初のインデックスを使用して実行することもできます。複数列の B ツリー インデックスは、元の宣言の左側から指定されている場合よりも少ない列を使用できます。
のみを使用するクエリの場合product_id
、最初のインデックスに対してこれを実行することはできません (そのインデックスは、一番左の位置に person_id で定義されているため)。したがって、そのフィールドだけでルックアップを有効にするには、別のインデックスが必要です。
複数列の B ツリー インデックス プロパティは、列数の多いインデックスにも適用されます。にインデックスがある場合、順序が定義と一致する限り、そのインデックスを使用して、、などを(person_id, product_id, favorite_color, shirt_size)
使用してクエリを実行できます。person_id
(person_id, product_id)