Ruby on Rails의 여러 열에 대한 인덱스


97

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

  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 옵션을 고려해야합니까? 제가 착각하지 않았다면 제가 직접 확인하지 않아도되며 사용자가 기사를 방문 할 때마다 삽입 만하면됩니다.


"user_views 테이블은 항상 하나의 열이 아닌 두 열을 모두 찾기 위해 쿼리됩니다." - "이 사용자가 본 모든 기사 찾기"또는 "이 기사를 본 모든 사용자 찾기"쿼리가 없을 것입니까? 나는 그게 놀랍다.
— David Aldridge 2015 년

답변:


212

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

  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 }

7
순서는 인덱싱에서 매우 중요합니다. where 절을 왼쪽에 배치하고 순서 열이 오른쪽에있는 인덱스를 완성합니다. stackoverflow.com/questions/6098616/dos-and-donts-for-indexes
— Denis de Bernardy

1
그 주 validates_uniqueness_of(, 그것의 사촌 validates uniqueness:) 경쟁 조건에 경향이있다
— 벤 어빈에게

1
위의 주석과 stackoverflow.com/a/1449466/5157706 및 stackoverflow.com/a/22816105/5157706 에서 언급했듯이 데이터베이스에도 고유 인덱스를 추가하는 것을 고려하십시오.
— Akash Agarwal

25

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


그래서 어느 것이 더 낫습니까? 데이터베이스 측 또는 validates_uniqueness_of?
— WM

9
양자 모두. validates_uniqueness_of는 예를 들어 양식이 저장 될 때 응용 프로그램에서 오류 메시지를 정상적으로 표시하는 데 사용할 수 있습니다. 데이터베이스 제약 조건은 모델에 유효성 검사가 지정되어 있음을 알더라도 중복 레코드로 끝나지 않도록합니다. 또한 ActiveRecord 예외를 복구하고 사용자에게 멋진 메시지를 표시 할 수도 있습니다.
— Uģis Ozols

5
@WM 하나를 선택해야하는 경우 데이터베이스 제약 조건을 따릅니다. 이것은 RoR이 아닌 다른 응용 프로그램이 데이터와 상호 작용하는 경우에도 작동하며 장기적으로 일관성을 보장합니다.
— mooreds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.