Объединение таблиц в ActiveRecord Миграции - PullRequest
0 голосов
/ 12 октября 2018

Я читал Руководства по Rails и обнаружил новый синтаксис для создания таблиц соединений:

class CreateJoinTableCustomerProduct < ActiveRecord::Migration[5.0]
  def change
    create_join_table :customers, :products do |t|
      # t.index [:customer_id, :product_id]
      # t.index [:product_id, :customer_id]
    end
  end
end

Возможно, этот вспомогательный метод create_join_table является новым в Rails 5 и генерирует соответствующую таблицу соединений в schema.rb.Но именно эта часть меня взволновала:

  # t.index [:customer_id, :product_id]
  # t.index [:product_id, :customer_id]

Обычно, если вы хотите добавить индекс к столбцу, вы делаете что-то вроде этого:

add_index :products, :product_id 

Но почему в этоммиграция есть два индекса, с теми же двумя столбцами?Чем объясняется этот синтаксис?

1 Ответ

0 голосов
/ 12 октября 2018

Индексы базы данных не ограничиваются одним столбцом.

t.index [:customer_id, :product_id]

Передача массива создает составной индекс, который индексирует комбинацию из двух столбцов, что и является таблицей соединений.

Это может, например, использоваться для обеспечения уникальности комбинации значений:

t.index [:user_id, :coupon_id], unique: true

Или просто ускорить запросы.

Причина, по которой Rails создает два отдельных индекса:

# t.index [:customer_id, :product_id]
# t.index [:product_id, :customer_id]

Означает ли это, что порядок на самом деле имеет значение для производительности? Грубое простое правило для индексов b-дерева заключается в том, что вы должны поместить наиболее селективный столбец первым.Вы должны выбрать лучший составной индекс для своего варианта использования.

См .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...