Затваряне - най-вероятно искате следното:
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)
, и т.н., стига редът да съответства на определението.