回答

收藏

文件/ 数据库ID设计理念、代理键、主键等

技术问答 技术问答 540 人阅读 | 0 人回复 | 2023-09-14

所以最近看过几次代理密钥的提及,但是不确定是什么,和主密钥有什么区别。) P2 M7 I  z$ A# H+ V
我一直以为ID是我在这样的表中的主键:
3 M% c& |) i0 o" K, g1 hUsers    ID,Guid    FirstName,Text    LastName,Text    SSN,Int但维基百科将代理密钥定义为数据库 代理密钥是    建模世界中的实体或数据库中对象的唯一标识符。代理密钥不是从应用程序数据中衍生出来的    。”6 w6 M% u" X4 V9 h
根据Wikipedia的说法,ID这似乎是我的代理密钥,我的主密钥可能是SSN   ID?这是正确的吗?这是一个糟糕的餐桌设计吗?
( I' f: B) Y- {. S. ~/ p/ ^假设表的设计是合理的,那么数据没有独特的表,这样的事情会很糟糕吗?& l# n  g0 b: A! l
LogEntry    ID,Guid    LogEntryID,Int [sql identity field  1 every time]    LogType,Int    Message,Text               
' y$ j  H; [6 K2 b    解决方案:                                                               
& \- M$ \3 |2 D$ V* {# b                                                                不,你的ID可以是代理键(这只意味着人工键不是从应用数据导出),并且    它应该是你的主键,太多了。6 M. Z0 I, Z% |; D6 m
主键用于唯一安全标识表中的任何行。它必须是稳定的,唯一的,不能是空的-“人工” ID通常有这些属性。& G4 s, R6 Y2 L; g# k" c5 i0 j/ C$ t+ f
我通常建议不要对主键使用“自然”或真实数据-并不是 真的有    150%的    把握 永远不会. Y5 S6 q% o4 V6 f  T
改变吗?比如女人结婚(或离婚),瑞士的SSN等效项会发生变化-几乎不是理想的候选人。并不能保证它是唯一的……" H; Y3 t& N+ R5 _
为了避免所有的麻烦,只需使用代理(人工)ID,该ID它是系统定义的,唯一的,永远不会改变,永远不会有任何应用程序意义(除了它是你唯一的ID)。: u: g+ A0 I7 E$ Y: l3 M; d2 e& ~
Scott Ambler这里有一篇包含各种键及其含义的词汇表的好文章-您会发现自然键、代理键、主键等。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则