因此,我最近看到多次提到代理键,但我不太确定它是什么以及它与主键有何不同。
我总是假设 ID 是表中的主键,如下所示:
Users
ID, Guid
FirstName, Text
LastName, Text
SSN, Int
然而,维基百科将代理键定义为“数据库中的代理键是建模世界中的实体或数据库中的对象的唯一标识符。代理键不是从应用程序数据派生的."
根据维基百科,看起来 ID 是我的代理键,而我的主键可能是 SSN+ID?这是正确的吗?这是一个糟糕的桌子设计吗?
假设表设计是合理的,对于数据没有任何独特之处的表来说,这样的事情会很糟糕吗?
LogEntry
ID, Guid
LogEntryID, Int [sql identity field +1 every time]
LogType, Int
Message, Text
不,您的 ID 可以是代理键(这仅意味着它不是“从应用程序数据派生”,例如人工密钥),and它也应该是您的主键。
主键用于唯一且安全地标识表中的任何行。它必须稳定、唯一且 NOT NULL——“人工”ID 通常具有这些属性。
我通常建议不要使用“自然”或真实数据作为主键 - 不是REALLY 150%当然是NEVER会改变吗?例如,瑞士的社会保障号(SSN)在女性每次结婚(或离婚)时都会发生变化——这并不是一个理想的候选人。而且也不能保证是唯一的......
为了避免所有这些痛苦,只需使用系统定义的、唯一的、永远不会改变且永远没有任何应用程序意义(除了作为您的唯一 ID 之外)的代理(人工)ID。
Scott Ambler 在这里发表了一篇非常好的文章,其中包含所有各种键及其含义的“词汇表” - 您会发现自然键、代理键、主键等等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)