создавать уникальные ограничения для каждого пользователя в таблицах с отношением n:m

Несколько минут назад я задал вопрос: создайте уникальные ограничения для каждого пользователя и ответ было очень просто.

Для создания уникального индекса для столбца, но для каждого пользователя, все, что мне нужно сделать, это:

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. Но я не могу этого сделать, так как же мне добиться этого другим способом?


person Roland    schedule 29.05.2014    source источник
comment
Я думаю, что если вы можете удалить столбец Id из таблицы ролей и иметь составной первичный ключ для {customer_id + role_id}, у вас будет ответ.   -  person Mohsen Heydari    schedule 01.06.2014


Ответы (1)


Что я хотел бы сделать, так это объявить уникальное ограничение, такое как UNIQUE (customer_id, :name) в таблице ролей. Но я не могу этого сделать, так как же мне добиться этого другим способом?

Суть вашей проблемы, похоже, в том, что столбец role.customer_id не существует. На самом деле, я почти уверен, что этот столбец не должен существовать, так что эта часть действительно хороша.

По крайней мере, вам нужно

unique [:customer_id, :role_id]

в "клиент_роль".

person Mike Sherrill 'Cat Recall'    schedule 04.06.2014
comment
Вы правы, Майк, позже я понял, что мне нужно только уникальное ограничение для таблицы соединения customer_role. - person Roland; 05.06.2014