代理键与自然键

DBK*_*DBK 5 database-design best-practices surrogate-key natural-key

我有一个叫做设备的表。将存储在此表中的大多数设备都可以通过其序列号和部件号进行唯一标识。但是有些设备类型没有分配给它们的序列号和部件号。相反,它们可以由另一个字段(内部 ID)唯一标识。

我应该为此表创建代理键,还是应该创建复合主键(序列号、零件号、内部 ID)并在未提供序列号和零件号列时插入默认值?现在没有部件号和序列号的设备类型将在未来版本中分配给它们编号(可能是 5 年后)。在这种情况下,我应该创建代理键还是复合键?或者使用三个唯一属性,我应该在程序中创建一个哈希并将其用作表的代理键吗?

Vér*_*ace 4

暂时使用代理键作为主键。当自然键可用时,使它们成为不可为空的唯一约束。

根据YAGNI原则,您应该只针对“现实生活”中的当前需求进行编码 -可能(或可能不会)在 5 年内到达的主键现在不值得考虑!

代理键在实践中使用非常广泛,这让纯粹主义者感到恐惧:我们其他人只是使用它们!请参阅此 Stack Overflow 答案(以及该线程的其余部分)。


归档时间:

查看次数:

1054 次

最近记录:

8 年,3 月 前