Поскольку вы не опубликовали свою схему как SQL DDL, у меня возникают проблемы с просмотром, как эти таблицы могут работать на практике. Вот моя попытка:
Казалось бы, справедливое предположение, что работник должен быть человеком, так что это достаточно просто (угадывание типов данных и правил домена):
CREATE TABLE NaturalPersons
(
PersonId INTEGER NOT NULL UNIQUE
);
CREATE TABLE Employees
(
PersonId INTEGER NOT NULL UNIQUE
REFERENCES NaturalPersons (PersonId),
EmployeeID CHAR(3) NOT NULL UNIQUE
CHECK (EmployeeID LIKE '[A-Z][0-9][0-9]')
);
Имя таблицы «PersonData» мало что показывает, но из имен элементов данных кажется, что что-то передается от одного человека / сотрудника другому:
CREATE TABLE Transfers
(
FromPersonId INTEGER
REFERENCES NaturalPersons (PersonId),
FromEmployeeID CHAR(3)
REFERENCES Employees (EmployeeID),
ToPersonId INTEGER
REFERENCES NaturalPersons (PersonId),
ToEmployeeID CHAR(3)
REFERENCES Employees (EmployeeID)
);
Хм, все NULL
способные столбцы означают, что у нас не может быть PRIMARY KEY
, но мне интересно, есть ли вообще ключ ...?
Нам нужен только один тип идентификатора для «от» и «до» соответственно:
ALTER TABLE Transfers ADD
CONSTRAINT only_one_from_ID
CHECK (
(FromPersonId IS NULL AND FromEmployeeID IS NOT NULL)
OR
(FromPersonId IS NOT NULL AND FromEmployeeID IS NULL)
);
ALTER TABLE Transfers ADD
CONSTRAINT only_one_to_ID
CHECK (
(ToPersonId IS NULL AND ToEmployeeID IS NOT NULL)
OR
(ToPersonId IS NOT NULL AND ToEmployeeID IS NULL)
);
Мы также хотим, чтобы бизнес-правила «здравого смысла» предотвращали переводы от одного и того же лица / сотрудника:
ALTER TABLE Transfers ADD
CONSTRAINT FromPersonId_cannot_be_ToPersonId
CHECK (FromPersonId <> ToPersonId);
ALTER TABLE Transfers ADD
CONSTRAINT FromEmployeeId_cannot_be_ToEmployeeId
CHECK (FromEmployeeId <> ToEmployeeId);
Это лучшее, что мы можем сделать, но у нас есть пара проблем:
INSERT INTO NaturalPersons (PersonId) VALUES (1), (2), (3), (4);
INSERT INTO Employees (PersonId, EmployeeID) VALUES (1, 'A11'), (2, 'B22');
-- transfer to same entity - oops!:
INSERT INTO Transfers (FromPersonId, ToEmployeeID) VALUES (1, 'A11');
-- Duplicate transfer - oops!:
INSERT INTO Transfers (FromEmployeeId, ToPersonID) VALUES (1, 'B1'); -- duplicate
INSERT INTO Transfers (FromPersonId, ToEmployeeID) VALUES ('A1', 2); -- duplicate
Другими словами, смешивание PersonId и EmployeeID в одной таблице затрудняет написание основных правил данных.
Если я правильно понимаю, что работник - это человек, почему бы не использовать только PersonID?
Если сотрудник не человек, вы можете опубликовать свою схему (тип данных, ограничения и т. Д.), Пожалуйста?