我有两个实体:Location
和Employee
。每位员工一次只能在一个地方工作。对于任何给定的时刻,模型如下:
但是,还需要为每个月末的所有地点和员工存储历史信息。我可以通过在两个实体中添加Month
PK属性来实现此目的,但是:在这种情况下如何处理关系?
外键必须完整引用复合PK。我想到了几种选择:
选项1:重复Month
实体中的Employee
属性,以获得完整的PK作为FK属性。这感觉有点多余?如果员工在某个月内已经存在,那么她肯定必须在同一个月的某个位置工作 - 即两个Month
属性必须始终具有完全相同的值:
选项2:重新使用Month
实体的PK中的Employee
属性作为引用Location
的外键。我甚至不知道是否允许这样做(注意:我最终会使用SQL Server,如果这里重要的话)?
选项3:创建一个单独的桥接实体,用于保存Location-Employee关系的历史记录。这感觉有点整洁,但我再次怀疑我是否可以在这里使用一个Month
属性,或者我是否需要其中两个属性。此外,它将允许多对多关系(在给定月份的几个位置的员工),在这种情况下不应该发生,并且我希望能够在数据模型中强制执行此操作。
我错过了一些明显的东西吗?什么是"正确"和适当规范化的解决方案?或者我应该暂时退出FK约束?