Индекс по нескольким столбцам в Ruby on Rails - PullRequest
83 голосов
/ 29 мая 2011

Я реализую функциональность, чтобы отслеживать, какие статьи прочитал пользователь.

  create_table "article", :force => true do |t|
    t.string   "title"
    t.text     "content"
  end

На данный момент это мой переход:

create_table :user_views do |t|
  t.integer :user_id
  t.integer :article_id
end

Таблица user_views всегда будет запрашиватьсяищите обе колонки, а не только одну.Мой вопрос в том, как должен выглядеть мой индекс.Есть ли разница в порядке этих таблиц, если есть еще какие-то варианты или что-то еще.Моя целевая база данных - Postgres.

add_index(:user_views, [:article_id, :user_id])

Спасибо.

ОБНОВЛЕНИЕ:
Потому что может существовать только одна строка, содержащая одинаковые значения в обоих столбцах (поскольку, зная, что user_id прочитал article_id), я должен рассмотреть: уникальный вариант?Если я не ошибаюсь, это означает, что мне не нужно выполнять какую-либо проверку самостоятельно и просто вставлять каждый раз, когда пользователь посещает статью.

Ответы [ 2 ]

186 голосов
/ 29 мая 2011

Порядок имеет значение при индексации.

  1. Сначала поместите наиболее селективное поле, т. Е. Поле, которое сужает число строк быстрее всего.
  2. Индекс будет использоваться толькопоскольку вы используете его столбцы в последовательности , начиная с начала .т. е. если вы индексируете по [:user_id, :article_id], вы можете выполнить быстрый запрос по user_id или user_id AND article_id, но НЕ по article_id.

Ваша строка миграции add_index должна выглядеть примерно такthis:

add_index :user_views, [:user_id, :article_id]

Вопрос о «уникальной» опции

Самый простой способ сделать это в Rails - это использовать validates в вашей модели с областью действия uniqueness следующим образом( документация ):

validates :user, uniqueness: { scope: :article }
20 голосов
/ 02 апреля 2014

Просто предупреждение о проверке уникальности во время проверки по сравнению с индексом: последнее выполняется базой данных, а учебник для начинающих - моделью.Поскольку одновременно может быть запущено несколько экземпляров модели, проверка зависит от условий гонки, что означает, что в некоторых случаях она может не обнаружить дубликаты (например, отправить дважды одну и ту же форму в одно и то же время).

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