考虑一个零件库存表 - 如果要在每天结束时存储库存水平,那么part_id和date_of_day上的复合主键就可以了.您可以选择使其成为唯一键并添加合成主键,特别是如果您有一个或多个表使用外键约束引用它,但除此之外没有问题.
所以没有什么不一定的错误,但像其他任何方法一样,它可以像帕特里克的例子那样被错误地使用.
编辑:这是另一个要添加的评论.
我想起了我刚才写的关于数据库中的日期值是真的是自然的还是合成的.日期为"YYYY-MM-DD"的可读表示当然是自然的,但在Oracle内部,它存储为一个数字,只表示Oracle的特定日期/时间.我们可以选择并随时更改该内部值的表示(以不同的可读格式,或完全不同的日历系统)而无需内部值失去其意义在于特定的日期和时间.我认为在此基础上,DATE数据类型介于自然和合成之间.
我同意它作为密钥的一部分,但要补充的是,您还应该有一个自动递增序列号作为 PK 的一部分,并强制将任何日期作为 UTC 写入数据库,下游系统比转换为当地时间。
我工作过的一个系统认为,每当另一个表被触及时,让 Oracle 触发器写入数据库,并使 sysdate 成为没有序列号的主键的一部分,这将是一个伟大的想法。唯一的问题是,如果您运行每秒多次命中该行的更新查询,则会破坏记录更改的表上的主键。