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/5157706stackoverflow.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.