Как я могу обеспечить соблюдение правил уникальности, которые включают более одной таблицы?

#sql-server #database-design

#sql-server #база данных-дизайн

Вопрос:

Например, наличие таблиц:

 Companies (CompanyID)
Workers (WorkerID, CompanyID)
Users (WorkerID, Username)
  

При правильно определенных связях, как мне обеспечить выполнение утверждения о том, что имя пользователя пользователя уникально в компании, в которой работает его сотрудник?

Ответ №1:

Для этого можно использовать индексированное представление

 CREATE VIEW dbo.EnforceConstraint
WITH SCHEMABINDING
AS
SELECT CompanyID, Username
FROM dbo.Users u 
    JOIN dbo.Workers w ON w.WorkerID = u.WorkerID

GO

CREATE UNIQUE CLUSTERED INDEX ix ON dbo.EnforceConstraint(CompanyID, Username)
  

Существуют определенные SET параметры, которые должны быть включены для модификации базовых таблиц индексированных представлений, но если вы используете SQL Server 2005 , они включены по умолчанию.

Ответ №2:

Вы не можете напрямую, но у вас есть пара вариантов:

  1. Немного денормализуйте таблицу Users и добавьте в нее идентификатор компании.

  2. Используйте триггер вставки / обновления для выполнения проверки.

Ответ №3:

Вы также можете рассмотреть:

введите описание изображения здесь

и убедиться, что WorkerNo это уникально в компании:

 alter table Workers
add constraint un_co_wrk unique (CompanyID, WorkerNo) ;