閉じる-次のものが必要になる可能性があります:
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
は同じものとして扱われ、データベースは最初のインデックスを使用するのに十分スマートです。
同様に、person_id
のみを使用したクエリ 最初のインデックスを使用して実行することもできます。複数列のBツリーインデックスは、元の宣言の左側から指定されている場合よりも少ない列を使用できます。
product_id
のみを使用するクエリの場合 、これは最初のインデックスに対して実行できません(そのインデックスは左端のperson_idで定義されているため)。したがって、そのフィールドのみでルックアップを有効にするには、個別のインデックスが必要です。
複数列のbツリーインデックスプロパティは、列数が多いインデックスにも拡張されます。 (person_id, product_id, favorite_color, shirt_size)
にインデックスがある場合 、そのインデックスを使用して、person_id
を使用してクエリを実行できます 、(person_id, product_id)
、など、順序が定義と一致する限り。