以下基本架构包含员工和经理的详细信息。员工表和经理表共有的数据保存在人员表中,而员工表和经理表都具有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查询时,我想知道(一次击中数据库)缺席的原因和原因。
这就是我坚持如何最好地对缺勤数据结构建模的地方。
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的直接查询,因为必须检查两个导航属性以查看哪个具有相关数据。
Absences
========
Id: int
EmployeeId: int
AbsenceDate: datetime
PersonId: int
PersonId链接到Person表。
问题:使用EF查询时,该查询必须检查与PersonId关联的所有表,以查看哪个表保存了数据。
是否有更好的方法对此建模?上述两种解决方案似乎都不是那么优雅。还可以想象可以添加更多的角色,这意味着对每个查询进行更复杂的检查只是为了找出外键属于哪个角色。