У меня есть следующие таблицы на сервере MySQL:
Companies:
- UID (unique)
- NAME
- other relevant data
Offices:
- UID (unique)
- CompanyID
- ExternalID
- other data
Employees:
- UID (unique)
- OfficeID
- ExternalID
- other data
В каждом из них UID является уникальным идентификатором, созданным базой данных.
Существуют внешние ключи для обеспечения связи между Сотрудником -> Офис -> Компания по UID.
Поля ExternalID в Офисах и Сотрудниках - это идентификатор, предоставленный моему приложению Компанией (фактически, моим клиентом). Клиенты не имеют (и не заботятся) о моих собственных идентификаторах, и все данные, которые мое приложение получает от них, идентифицируются исключительно на основании их идентификаторов (т. Е. ExternalID в моих таблицах).
т.е. запрос от клиента на псевдо-языке похож на «Я Компания X, обнови данные для моего сотрудника Y».
Мне нужно обеспечить уникальность комбинации CompanyID и Employees.ExternalID, поэтому в моей базе данных не будет дубликата ExternalID для сотрудников одной компании.
Я думал о 3 возможных решениях:
Измените схему для сотрудников, включив в нее CompanyID, и создайте уникальное ограничение для двух полей.
Включите триггер, который при обновлении / вставке в Employees проверяет уникальность.
Провести проверку на уровне приложения (т.е. мой сервис получения).
Моя альтернатива-dbadmin-in-me утверждает, что (3) является худшим решением, поскольку оно не защищает базу данных от несогласованности в случае ошибки приложения или чего-то еще, и, скорее всего, будет самым медленным.
Триггерным решением может быть то, что я хочу, но оно может усложниться, особенно если необходимо выполнить несколько вставок / обновлений в одном выражении, и я не уверен насчет производительности по сравнению с (1).
И (1) выглядит самым быстрым и простым подходом, но это противоречит моему пониманию реляционной модели.
Мнение экспертов SO DB о плюсах и минусах каждого из подходов, особенно если есть возможность добавить дополнительный уровень косвенности - например, Компания -> Офис -> Отдел -> Сотрудник, и те же потребности в уникальности быть сохраненным (Компания / Сотрудник).