Подтвердить что ты не робот

Индекс по нескольким столбцам в RoR

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

  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])

Спасибо.

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

4b9b3361

Ответ 1

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

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

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

add_index :user_views, [:user_id, :article_id]

Вопрос относительно уникальной опции

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

validates :user, uniqueness: { scope: :article }

Ответ 2

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