PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Нуждаете се от два индекса в таблица за свързване на HABTM?

Затваряне - най-вероятно искате следното:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. намиране на MAX(db_timestamp) заявка

  2. PostgreSQL:формат на интервала като минути

  3. Как да включите липсващи данни за множество групи в рамките на времевия период?

  4. WAL архив:НЕУСПЕШНО (моля, уверете се, че WAL доставката е настроена)

  5. Как да решим проблема с AWS RDS:psycopg2.OperationalError:FATAL:неуспешно удостоверяване на парола за потребител root