[ruby-on-rails] Ruby on Rails의 여러 열에 대한 인덱스

사용자가 읽은 기사를 추적하는 기능을 구현하고 있습니다.

  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 테이블은 항상 하나만 검색하는 것이 아니라 두 열을 모두 찾기 위해 쿼리됩니다. 내 질문은 내 색인이 어떻게 생겼는지입니다. 이 테이블에 더 많은 옵션이 있거나 무엇이든이 테이블의 순서에 차이가 있습니까? 내 대상 DB는 Postgres입니다.

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

감사.

업데이트 :
두 열에 동일한 값을 포함하는 행이 하나만 존재할 수 있기 때문에 (user_id가 article_id를 읽었는지 알기 때문에) : unique 옵션을 고려해야합니까? 제가 착각하지 않았다면 제가 직접 확인하지 않아도되며 사용자가 기사를 방문 할 때마다 삽입 만하면됩니다.



답변

순서는 인덱싱에서 중요합니다.

  1. 가장 선택적인 필드, 즉 행 수를 가장 빨리 좁히는 필드를 먼저 넣으십시오.
  2. 인덱스는 처음부터 순서대로 열을 사용하는 경우에만 사용됩니다 . 즉에서 인덱싱 [: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( documentation ).

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


답변

유효성 검사 시점과 인덱스에서 고유성을 확인하는 것에 대한 경고 일뿐입니다. 후자는 데이터베이스에서 수행하고 프라이머는 모델에서 수행합니다. 동시에 실행되는 모델의 여러 인스턴스가 동시에 실행될 수 있기 때문에 유효성 검사는 경합 조건의 영향을받습니다. 즉, 일부 경우 중복을 감지하지 못할 수 있습니다 (예 : 정확히 같은 시간에 동일한 양식을 두 번 제출).


답변