IT

루비 온 레일즈의 여러 열에 대한 보안

lottoking 2020. 9. 13. 10:56
반응형

루비 온 레일즈의 여러 열에 대한 보안


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

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

감사합니다.

Update :
두 열에 동일한 값을 포함하는 행이 하나만 적합한 수 있기 때문에 (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 }

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

참고 URL : https://stackoverflow.com/questions/6169996/index-on-multiple-columns-in-ruby-on-rails

반응형