2017-11-22 7 views
0

this question、回答とコメントを読んでいますが、それは私のケースに答えることはできません。外来キー?ここでRails 5.1&Postgres - 外部キーであるときに2つの列にユニークな制約を追加

は、問題のテーブルを作成するために、私のオリジナルの移行です:

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%)のクエリに表示されます。

validates_uniqueness_of :name, scope: [:account] 

だから私は関節のインデックスを追加すると::

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

私は削除する必要があります今では名前がアカウントに一意であるべきであると決められているので、モデルが更新されている

account_idのインデックス?

SQLLite(thisを参照)で、答えは、私はACCOUNT_IDに単一のインデックスを必要としないし、第一の位置にACCOUNT_IDと私の新しいインデックスを作成することになりそうなので、私は尋ねる:

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

私はpostgresを使用しているので、同じ考えが適用されますか?

答えて

1

最初のインデックスでない場合は、追加のインデックスを追加する必要があります。

あなたが持っているそうだとすれば、この:

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

それは2番目のインデックスがあるので、あなたは、元:account_id外部キーのインデックスを削除しないでください。

インデックスの実装についてお読みください。それはかなり興味深く、あなたはそれからたくさん学ぶことができます。

+0

それで、Postgresは私がリンクしているSQLiteの例と同じように動作すると言っています。つまり、account_id foreign_keyインデックスを削除し、最初のインデックスとしてaccount_idを持つ新しいコンポジットを作成することができます。これは、dbが1つのインデックスのみを更新する必要があるため、挿入時のパフォーマンスが向上します。 – rmcsharry

+0

あなたはそれを行うことができますが、あなたのコードがそれをどのように使用するかによって異なります。 'account_id'に基づいて最初に検索し、あなたのコードのどこにある名前に基づいていても、それを削除することができます。 –

+0

ご清聴ありがとうございました。 – rmcsharry

関連する問題