외래 키 필드에 적용된 인덱스가 응용 프로그램 속도 성능에 얼마나 중요한지에 대해 읽었지만 이를 설정하는 방법에 대한 모순된 설명도 읽었습니다. 아래 내 모델 및 마이그레이션 파일에 표시된 구조에서 :
class Owner < ApplicationRecord
has_many :dogs
end
class Dog < ApplicationRecord
belongs_to :owner
end
create_table :owners do |t|
t.string :full_name
t.string :address
t.timestamps
end
create_table :dogs do |t|
t.string :name
t.string :age
t.string :breed
t.references :owner, foreign_key: true
t.timestamps
end
내 외래키 필드를 선언하는 줄에서 :
t.references :owner, foreign_key: true
이렇게 두면 Rails가 자동으로 데이터베이스 색인을 생성합니까? 아니면 아래 코드를 표시하도록 줄을 수정하여 수동으로 추가해야합니까?
t.references :owner, foreign_key: true, index: true
또는 수동으로 색인을 추가해야하는 경우 별도의 코드 블록에서 add_index 메소드를 사용하여 선언해야합니까? 다음 중 index : true 의 요점은 무엇입니까?
Rails 5.1.4를 사용하고 있습니다.
예, 참조
를 사용하면 색인이 이미 생성되어 있습니다. 이것을 테스트하려면 :
Foo 모델 레일
-
rails g model Bar foo : references
및 생성 된 마이그레이션 살펴보기 :
class CreateBars < ActiveRecord :: 마이그레이션 [ 5.1 ] def 변경 create_table : 바 실행 | t | t . 참조 : foo , foreign_key : 참 t . 타임 스탬프 종료 종료 종료
-
rake db : migrate
-
db / schema.rb
를보십시오 :
ActiveRecord :: 스키마 . 정의 ( 버전 : 20180201075841 < span class = "pun">) 실행 create_table "bars" , force : : 캐스케이드 실행 | t | t . 정수 "foo_id" t . 날짜 시간 "created_at" , null : 거짓 t . 날짜 시간 "updated_at" , null : 거짓 t . 색인 [ "foo_id " ], 이름 : < span class = "pln"> "index_bars_on_foo_id" 종료 create_table "foos" , force : : 캐스케이드 실행 | t | t . 날짜 시간 "created_at" , null : 거짓 t . 날짜 시간 "updated_at" , null : 거짓 종료 종료
색인이 생성되었음을 보여주는 t.index [ "foo_id"], name : "index_bars_on_foo_id"
행이 있음을 알 수 있습니다.
기본 동작 인 경우 index : true
의 요점이 무엇인지 모르지만 여기서 아이디어를 던지면 옵션이있을 수 있으므로 비활성화 할 수 있습니다.