У меня есть две сущности: Location
и Employee
.Каждый сотрудник работает в одном месте одновременно.Для любого данного момента времени модель выглядит следующим образом:
Однако требуется также хранить историческую информацию для всех местоположений исотрудники на каждый конец месяца.Я могу добиться этого, добавив атрибут Month
PK в обе сущности, но: как мне обработать отношение в этом случае?
Внешний ключ должен ссылаться на составной PK вего полнотаНа ум приходит несколько альтернатив:
Опция 1: повторите атрибут Month
в сущности Employee
, чтобы получить полный PK в качестве атрибутов FK.Это чувствует себя немного излишним?Если работник существовал в определенном месяце, он, безусловно, должен работать в каком-либо месте в том же месяце, т. Е. Два атрибута Month
должны всегда иметь одинаковое значение:
Опция 2: повторно использовать атрибут Month
в PK объекта Employee
в качестве внешнего ключа, ссылающегося на Location
.Я даже не знаю, разрешено ли это (примечание: в конечном итоге я собираюсь использовать SQL Server, если это имеет значение)?
Вариант 3: создать отдельный объект моста, который хранит историю отношений Location-Employee.Это выглядит довольно аккуратно, но опять же у меня есть некоторые сомнения относительно того, могу ли я использовать один атрибут Month
здесь или мне нужно два из них.Кроме того, это позволило бы установить отношения «многие ко многим» (сотрудник в нескольких местах в течение определенного месяца), что в данном случае не должно происходить, и я хотел бы иметь возможность применять это в модели данных.
Я что-то упускаю здесь очевидное?Что такое «правильное» и правильно нормированное решение?Или я должен просто оставить ограничения FK?