2017-11-22 8 views
0

그래서 this question, 대답 및 주석을 읽었지 만 열의 경우 수행 할 작업 인 내 사례에 응답하지 않습니다. 외래 키? ACCOUNT_ID 이후Rails 5.1 & Postgres - 외래 키일 때 두 개의 열에 고유 한 제약 조건 추가

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 

가 foreign_key (그리고 고객을 식별)이이 테이블에 거의 모든 (99 %) 쿼리 나타납니다

여기에 문제의 테이블을 만들 수있는 내 원래의 마이그레이션입니다.

는 지금은 이름이 계정에 고유해야한다고 결정했습니다, 그래서 모델이 업데이트되었습니다

validates_uniqueness_of :name, scope: [:account] 

을 그래서 공동 인덱스 추가하면 :

add_index :templates, [:name, :account_id], unique: true 

내가 삭제해야을 account_id에 대한 색인?

add_index :templates, [:account_id, :name], unique: true 
: 나는 때문에 SQLLite ( this 참조)에 문의

, 대답은 내가 ACCOUNT_ID에 단일 인덱스를 필요로하지 않고 첫 번째 위치에 ACCOUNT_ID 내 새로운 인덱스를 만들 수 있다는 것 같다

나는 postgres를 사용하고 있으므로 같은 생각이 적용됩니까?

답변

1

첫 번째 색인이 아닌 경우 추가 색인을 추가해야합니다.

당신이 그렇다면이 :

add_index :templates, [:name, :account_id], unique: true

가 두 번째 인덱스이기 때문에 다음, 원래 :account_id 외래 키 인덱스를 삭제해서는 안된다.

인덱스 구현에 대해 읽어 보는 것이 좋습니다. 그것은 꽤 흥미 롭고 당신은 그것으로부터 많은 것을 배울 수 있습니다.

+0

그러면 Postgres는 연결된 SQLite 예제와 같은 방식으로 작동합니다. 즉, account_id foreign_key 인덱스를 삭제하고 account_id를 첫 번째 인덱스로 사용하여 새로운 합성을 생성 할 수 있다는 것을 의미합니다. 데이터베이스에서 하나의 인덱스 만 업데이트해야하기 때문에 삽입 성능이 약간 향상 될 것입니다. – rmcsharry

+0

그렇게 할 수는 있지만 코드에서 사용하는 방법에 따라 다릅니다. 먼저 'account_id'를 기반으로 검색 한 다음 코드의 어디서나 이름을 기반으로 한 다음 삭제할 수 있습니다. –

+0

설명해 주셔서 감사합니다. – rmcsharry