Zavřít – pravděpodobně budete chtít následující:
add_index :person_products, [:person_id, :product_id], :unique => true
add_index :person_products, :product_id
:unique => true
není striktně vyžadováno a záleží na tom, zda má smysl mít osobu spojenou s produktem vícekrát. Řekl bych, že pokud si nejste jisti, pravděpodobně ano chcete :unique
vlajka.
Důvodem struktury indexu je, že všechny moderní databáze mohou provádět dotazy na person_id i product_id pomocí prvního indexu bez ohledu na pořadí zadané v dotazu . Např.
SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1
jsou považovány za stejné a databáze je dostatečně chytrá na to, aby používala první index.
Stejně tak dotazy používající pouze person_id
lze také spustit pomocí prvního indexu. Vícesloupcové indexy b-stromu mohou používat méně sloupců, než kolik za předpokladu, že jsou specifikovány zleva od původní deklarace.
Pro dotazy používající pouze product_id
, nelze to provést proti prvnímu indexu (protože tento index je definován s person_id na pozici zcela vlevo). Proto potřebujete samostatný index, abyste umožnili vyhledávání pouze v tomto poli.
Vlastnost indexu vícesloupcového b-stromu se také vztahuje na indexy s vyšším počtem sloupců. Pokud jste měli index na (person_id, product_id, favorite_color, shirt_size)
, můžete tento index použít ke spouštění dotazů pomocí person_id
, (person_id, product_id)
atd., pokud objednávka odpovídá definici.