테이블 생성하는 마이그레이션입니다 :레일스 5.1 - primary_key 및 foreign_key에 데이터베이스 인덱스를 만들어야합니까?
class CreateTemplates < ActiveRecord::Migration[5.1]
def change
create_table :templates, id: :uuid do |t|
t.references :account, type: :uuid, foreign_key: true
t.string :name
t.text :info
t.string :title
t.timestamps
end
end
end
가 ACCOUNT_ID은 foreign_key (그리고 고객을 식별)이 테이블에 쿼리의 거의 모든 (99 %)에서 나타납니다 이후를 - 많은 지점이 없다 다른 고객에게 속한 템플리트를 검색 할 때
위의 마이그레이션을 account_id foreign_key에 대해 만든 색인을 삭제하고 대신이 색인을 생성해야합니까?
add_index :templates, [:id, :account_id], unique: false
원본을 유지하고 추가해야합니까?
EDIT은 99 % 사용 사례를 명확히하기 위해 - 나는이 틀렸다 생각합니다. 템플릿을 만들 때 account_id가 항상 삽입되므로 tempaltes_controller의 index 메소드는 항상 account_id를 사용하는 모든 템플릿을 반환하므로 사용자는 자신의 계정에 속한 템플릿 목록 만 볼 수 있습니다. 편집, 업데이트, 삭제의 경우 해당 작업에는 template_id 만 필요합니다. 그래서 내 99 % 추측은 잘못되었습니다! 대부분의 쿼리에는 실제로 나에게 보이는 복합 키가 필요하지 않습니다.
이 답변을 주셔서 감사합니다. 질문에 EDIT 섹션을 추가했습니다. 대부분의 쿼리는 템플릿 테이블의 id 필드를 사용한다고 생각합니다. 인덱스 작업 만 account_id (해당 계정의 템플릿 만 반환)가 필요합니다. 그래서 대부분의 쿼리는 account_id보다는 템플릿 ID가 필요합니다. 그래서 그 논리에 따라 합성 키가 필요 없다고 생각합니다. 맞습니까? – rmcsharry
넵, foreign_key의 인덱스는 나열한 모든 사용 사례를 다루어야합니다. ID 필드는 템플릿의 기본 키이며 이미 색인이 있습니다. – xeon131