回答

收藏

表中主键的最佳方法是什么?

技术问答 技术问答 107 人阅读 | 0 人回复 | 2023-09-13

在设计表格时,我养成了一个习惯,一列是唯一的,我把它作为主键。这可以通过三种方式实现,这取决于需求:
8 P$ w5 i. c$ z9 C+ g[ol]标识整数列自动递增。3 x& u( q% K& a0 i1 w
唯一标识符(GUID)
- n6 L7 p+ o$ H- F短字符可用作行标识符列(x)或列出整数(或其他相对较小的数字类型)[/ol]数字3将用于较小的搜索,其中大部分是读取表,它们可能具有唯一的静态长度字符串代码或数字值,如年份或其他数字。
: j6 q  c& ^- d2 e' P. I/ U( b在大多数情况下,所有其他手表都会有自动增加的整数或唯一的标识符键。
9 X9 l. [% }$ ~4 ]7 s问题:-)我最近开始使用没有一致行标识符的数据库,主键目前聚集在个列中。一些例子:1 e* \' c) `; ]. W* P3 P
日期时间/字符7 l% F( j1 f6 y- e, z3 K
日期时间/整数3 A% @  U# m9 m
日期时间/ varchar- x9 ~. C: @' D3 @( [
字符/ nvarchar / nvarchar
有没有有效的理由?在这种情况下,我将始终定义一个标志或唯一的标志符列。
; P* u, K+ p. [" B# A此外,还有许多手表根本没有主键。这样做的有效原因是什么(如果有)?5 K6 d# h7 f/ K! T* f) p
我试图理解为什么手表是按原样设计的,这对我来说似乎是个大麻烦,但也许有充分的理由。: g; L: D, l5 }/ q
第三个问题可以帮助我解释答案:如果使用多列组成复合主键,该方法是否与代理/手动键相比具有特定优势?我主要考虑性能、维护、管理?' j' t: e) Y: y( ^& o5 ]% B
                                                                / f) U: L8 X/ N& x3 f
    解决方案:                                                               
, g) o* z! L% a) Q: b                                                                我遵循一些规则:& m: I* T- s6 }0 i+ n+ z* X
[ol]主键应尽可能小。数字类型是首选,因为数字类型以比字符格式更紧凑的格式存储。这是因为大多数主键将是另一个表中的外键,并用于多个索引。键越小,索引越小,缓存中的页面就越少。
; X+ q; T5 S- |& k3 w$ z) {主键永远不应该改变。总是不可能更新主键。这是因为它最有可能在多个索引中使用并作为外部键。更新单个主键可能会引起更改的连锁反应。9 }6 E: C& T% l8 }' m# |
不要使用您的问题主键作为逻辑模型主键。例如,护照号码、社会保险号码或雇员合同号码,因为这些主键在实际情况下可能会改变。[/ol]关于代理键和自然键,我参考上述规则。如果自然键很小,永远不会更改,它可以用作主键。如果自然键很大或可能会更改,请使用代理键。如果没有主键,我仍然会使用代理键,因为经验表明您将始终向表中添加表,并希望您将主键放在适当的位置。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则