Следующая базовая схема содержит сведения о сотрудниках и менеджерах.Данные, которые являются общими как для сотрудников, так и для менеджеров, хранятся в таблице «Люди», а таблицы «Сотрудники» и «Менеджеры» имеют в качестве внешнего ключа People.Id.
People
======
Id: int
FirstName: varchar(50)
Surname: varchar(50)
Employees
=========
Id: int
PersonId: int (links to Person.Id)
EmployeeRef: varchar(12)
Managers
========
Id: int
PersonId: int (links to Person.Id)
ManagerRef: varchar(12)
Теперь мне нужно записать отсутствие сотрудников.Только сотрудник может иметь запись об отсутствии, но запись об отсутствии может быть подана либо самим сотрудником, либо руководителем.Вот где я застрял с моделированием стола.При запросе с EF Core я хотел бы знать (в одном обращении к базе данных), для кого это отсутствие и кто его поднял.
Именно здесь я застрял на том, как лучше всего смоделировать отсутствие.структура данных.
Вариант 1:
Absences
========
Id: int
EmployeeId: int
AbsenceDate: datetime
RaisedByEmployeeId: int null (links to Employees.Id)
RaisedByManagerId: int null (links to Managers.Id)
Таким образом, либо RaisedByEmployeeId, либо RaisedByManagerId будет содержать внешний ключ для соответствующей таблицы.
Проблемы: это непростой запрос для Entity Framework, поскольку необходимо проверить оба навигационных свойства, чтобы узнать, какое из них имеет связанные данные.
Вариант 2:
Absences
========
Id: int
EmployeeId: int
AbsenceDate: datetime
PersonId: int
PersonId ссылается на таблицу Person.
Проблемы: при запросе с EF запрос должен проверять все таблицы, с которыми связан PersonId, чтобы увидеть, какая из них содержит данные.
Вариант 3:
Есть ли лучшийспособ моделировать это?Ни одно из вышеперечисленных решений не кажется таким элегантным.Также возможно добавление большего количества ролей, что означает более сложные проверки для каждого запроса, просто чтобы выяснить, к какой роли принадлежит внешний ключ.