相关疑难解决方法(0)

每个表都应该有一个单字段代理/人工主键吗?

我了解代理/人工密钥的一个好处 - 它们不会改变,而且非常方便。无论它们是单场还是多场,都是如此——只要它们是“人造的”。

但是,有时将自动递增的整数字段作为每个表的主键似乎是一个策略问题。拥有这样一个单字段键是否总是最好的主意,为什么(或为什么不)?

需要明确的是,这个问题不是关于人工 vs 自然的——而是关于是否所有人工键都应该是单字段的

database-design primary-key surrogate-key

36
推荐指数
3
解决办法
5875
查看次数

什么时候主键才有意义?

请原谅这里任何定义的松散,但我试图探索一个简单的概念。

一个主键唯一标识一行。表中可能还有其他列具有唯一值,因此它们也可以唯一标识一行(候选键),但主键是为任务指定的。

使主键更有用的属性包括:

  • 保证是唯一的;随着表的增长,其他一些唯一的列值可能会重复
  • 不太可能改变;虽然外键约束可以包括级联,但最好不要要求这个
  • 不会被回收;由于某种原因被删除的行不应释放旧的 PK 值以供重用

由于这些原因,我通常建议主键没有内在价值,因此永远没有理由更改或回收值。也就是说,它应该是没有意义的

我见过包含某种代码的主键,例如基于名称的客户端代码。明显的问题是 (a) 如果客户端名称更改,那么 PK 也应该更改,以及 (b) 与具有相似名称的客户端发生冲突的风险太大。

半个例外是使用自动递增的数字,它具有序列号的次要含义。但是,它仍然很稳定。

问题是,在什么情况下,如果有的话,最好使用具有其他实际含义的主键?也就是说,PK应该是任意的,并且你通常可以通过序列号获得的建议有什么问题吗?

database-design primary-key candidate-key

7
推荐指数
1
解决办法
3370
查看次数