在具有n:m关系的表中为每个用户创建唯一约束

时间:2014-05-29 14:19:58

标签: ruby postgresql database-design unique-constraint sequel

我刚才问了一个问题create unique constraints per user,答案非常简单。

为了在列上创建唯一索引,但是基于每个用户,我所要做的就是:

unique [:user_id, :name] # SQL syntax: UNIQUE (user_id, name)

但是用户表和引用user_id的表之间的关系是1:n(用户到位置),所以我在foreign_key表中有一个location参考user_id。这个问题是关于两个表之间的n:m关系,并在其中一个表上添加唯一约束。

Sequel.migration do
    change do

        Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'

        create_table :customer do
            String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)


            DateTime :created_at
            DateTime :updated_at


            index :id, :unique => true
        end
    end
end

Sequel.migration do
    change do

        Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'

        create_table :role do
            String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)


            String :name, :unique => true, :null => false # TODO: unique, per customer


            DateTime :created_at
            DateTime :updated_at


            unique [:customer_id, :name]

            index :id, :unique => true
            full_text_index :name, :index_type => :gist
        end
    end
end

上面的代码说明了我提到的两个表有一个n:m关系(客户到角色),下表说明了连接表和两个表的外键:

Sequel.migration do
    change do

        Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'

        create_table :customer_role do
            String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)

            foreign_key :customer_id, :customer, :type => :uuid
            foreign_key :role_id, :role, :type => :uuid

            index :id, :unique => true
        end
    end
end

我想要做的是在UNIQUE (customer_id, :name)表上声明一个唯一约束,例如role。但我不能这样做,那么我该如何以另一种方式实现呢?

1 个答案:

答案 0 :(得分:1)

  

我想要做的是宣布一个独特的约束,例如   角色表上的UNIQUE(customer_id,:name)。但我不能这样做,   那么我该如何以另一种方式实现呢?

您的问题的本质似乎是列role.customer_id不存在。事实上,我很确定列不应该存在,因此该部分实际上是好的。

至少,你需要

unique [:customer_id, :role_id]
“customer_role”中的