У нас есть несколько офисов, и в каждом офисе есть несколько отделов (в некоторых отделах есть сотрудники в нескольких отделениях). У нас есть две существующие системы, которые по-разному идентифицируют сотрудников: в одной из них сотрудники IDA идентифицируют сотрудников; в других сотрудников определены IDB.
В тех случаях, когда сотрудник идентифицируется сотрудником IDA, нам необходимо указать руководителя этого сотрудника, если таковой имеется, в SUPERVISOR_IDA.
Мой стол выглядит так:
IDA
IDB
SUPERVISOR_IDA
OFFICE
DEPARTMENT
Сотрудники могут иметь должности в более чем одном офисе или в более чем одном отделе, поэтому одна и та же IDA или IDB может существовать более одного раза, но с другим офисом, отделом или обоими.
Проблема в том, что IDA может иметь значение NULL (и если это так, то IDB не равен NULL) или IDB может иметь значение NULL (а если это так, то IDA не имеет значение NULL), или оба могут присутствовать.
Я пытаюсь настроить уникальные и / или первичные ключи и ограничения для обеспечения целостности базы данных.
Итак, я создал уникальный ключ (IDA, IDB, OFFICE, DEPARTMENT).
Вот моя проблема:
Мне нужно убедиться, что сотрудники ссылаются на своих руководителей. Я хотел иметь внешний ключ с собственной ссылкой, чтобы удаление супервизоров не оставляло записи о работниках-сиротах с ненулевым SUPERVISOR_IDA. Но поскольку я должен был включить IDB в свой уникальный ключ в этой таблице, если я создаю этот внешний ключ, мне необходимо включить IDB как таковой:
local PARENT_IDA -> reference IDA
local OFFICE -> reference OFFICE
local DEPARTMENT -> reference DEPARTMENT
**local IDB -> reference IDB**
Это проблема, потому что IDB сотрудника НЕ должен совпадать с IDB супервизора.
Я знаю, что, кажется, я пытаюсь сделать слишком много вещей в одной таблице, возможно, но в действительности мой домен довольно сложно описать, и поэтому я создал сотрудника / офис / отдел в качестве примера, чтобы проиллюстрировать свои проблемы. Я действительно не могу разделить IDA и IDB на отдельные таблицы, так как они связаны между собой некоторыми проблемными способами, и наличие одной, другой или обеих частей имеет какое-то важное значение, которое нельзя отделить.
Сначала я хотел установить уникальный ключ (IDA, OFFICE, DEPARTMENT) в дополнение к вышеупомянутому уникальному ключу, но в отличие от уникальных ключей, состоящих из одного столбца, составные уникальные ключи будут обрабатываться (null, ' A ') и (null,' A ') как дубликаты вместо разрешения пустого столбца, чтобы избежать нарушения ограничения уникальности.