Rails 5.1& Postgres - 当两个列是外键时,在两列上添加唯一约束

时间:2017-11-22 20:15:37

标签: ruby-on-rails postgresql indexing foreign-keys

所以我读了this question,回答和评论,但它没有回答我的情况,当列是外键时该怎么办?

以下是我创建相关表格的原始迁移:

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 个答案:

答案 0 :(得分:2)

如果它不是第一个索引,你必须添加额外的索引。

所以如果你有这个:

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

那么你不应该删除原来的:account_id外键索引,因为它是第二个索引。

我建议你阅读索引实现。这非常有趣,你可以从中学到很多东西。