我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向SO的专家们询问.
考虑到下面的数据库设计,什么是更好的选择.
示例1:使用自动代理键.
================= ================== Road_Number(PK) Segment_Number(PK) ================= ================== 1 1
例2:使用程序生成的PK
================= ================== Road_Number(PK) Segment_Number(PK) ================= ================== "RD00000001WCK" "00000001.1"
(该00000001.1
指它的第一个道路段,这增加了每次你添加一个新的细分如00000001.2
)
示例3:使用两者(添加新列)
======================= ========================== ID(PK) Road_Number(UK) ID(PK) Segment_Number(UK) ======================= ========================== 1 "RD00000001WCK" 1 "00000001.1"
只是一些背景信息,我们将使用Road Number
和Segment Number
报告和其他文档,因此它们必须是唯一的.
我总是喜欢保持简单,所以我更喜欢示例1,但我一直在阅读,你不应该在报告/文档中公开你的主键.所以现在我更多地考虑示例3.
我也倾向于示例3,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.
您认为我们应该怎么做?
谢谢.
编辑:谢谢大家的好评,给了我很多帮助.
这实际上是关于代理(也称为技术或合成)与自然主键的讨论,这是一个被广泛涵盖的主题.我在AppDevelopers制作的数据库开发错误中介绍了这一点.
自然键是基于(表面上)唯一的外部有意义数据的键.常见的例子是产品代码,双字母州代码(US),社会安全号码等.代理或技术主键是那些在系统外绝对没有意义的主键.它们纯粹是为了识别实体而发明的,通常是自动递增字段(SQL Server,MySQL,其他)或序列(最着名的是Oracle).
在我看来,你应该总是 使用代理键.这些问题出现了这个问题:
你觉得你的主键怎么样?
表中主键的最佳实践是什么?
在这种情况下,您将使用哪种格式的主键.
代理比.自然/商业钥匙
我应该有一个专用的主键字段吗?
自动编号字段是要走的路.如果您的密钥在数据库之外具有意义(如资产编号),则很可能会发生变化,更改密钥会出现问题.只需将这些内容的索引用于相关表格即可.
我个人会说保持简单,并使用自动增量主键.如果你需要在程序中显示更多"可读"的东西,那么可能是你的其他想法之一,但我认为这只会给主键字段增加不必要的复杂性.
我也非常强烈地使用"不要使用主键作为有意义的数据"阵营.每次我违反这项政策,它都会流下眼泪.有意义的数据迟早需要改变,如果这意味着你必须改变一个主键,它会变得很痛苦.主键可能会在外键约束中使用,您可以花费多年时间尝试对其进行排序,以便进行简单的数据更改.
我总是在我创建的每个表中使用GUID/UUID作为我的主键,但这只是个人偏好系列或类似的也很好.