我有一个Engagement
包含四个字段的 Access 表:
Emp_id, Year, Week, Act_id
它记录员工何时/正在从事某项活动。每个字段都是数字,每个字段都构成复合主键的一部分。该应用程序的语义是每个条目(每个Emp_id
- Year
- Week
-Act_id
组合)必须是唯一的。也就是说,虽然员工通常会有不同的年周和不同的活动,但员工有时可以在不同的年周从事相同的活动,甚至在同一年的周内从事不同的活动。不允许使用空值。一切正常。
现在我需要扩展/修改语义,以允许与任何给定员工活动相关联的未知(或者更恰当地说,未公开)年-周值。当然,尝试输入带有空 Year-Week 的行会导致“索引或主键不能包含 Null 值”。所以我需要改变桌子的设计。
我尝试的一件事是通过在“索引”窗口中关闭主键(并保持唯一键打开)将主键索引转换为非主索引。这可以正确防止 Year-Week 值为非空的重复记录 - 但它允许 Year-Week 为空的重复记录。
例如,使用上述非主唯一索引,允许以下数据:
Emp_id Year Week Act_id
7 2014 12 31 } Same activity,
7 2015 22 31 } different dates.
7 2015 33 32
7 2015 40 33 } Same dates,
7 2015 40 34 } different activities.
7 2016 2 36
7 38 } Different activities,
7 39 } undisclosed dates.
随后不允许进行以下任何添加:
Emp_id Year Week Act_id
7 2014 12 31 } Both records are
7 2015 33 32 } duplicates of above.
到目前为止一切顺利(行为符合要求)。但是,随后允许但不应该允许以下两种添加:
Emp_id Year Week Act_id
7 38 } Both records are
7 39 } duplicates of above.
这是为什么?
有什么好的方法可以解决这个问题,一方面允许 Year 和 Week 等效于 null ,另一方面限制每个Emp_id
- Year
- Week
-Act_id
组合是唯一的?
我可以想到另外两个(未尝试过的)解决方案:
- 选择一个等效于空的数值,例如零或 -1,并以某种方式向用户解释这一点。
- 将 Year-Week 字段类型从 Number 转换为 Text 并简单地使用 ""(空字符串)作为 null。
根据您的经验,在这种情况下有什么好的解决方案?
我知道复合主键中的可为空列有什么问题?和多列主键中的 NULL 值,它解释了某些事情,但不提供解决方案。