当前位置:  开发笔记 > 后端 > 正文

选择最好的主键+编号系统

如何解决《选择最好的主键+编号系统》经验,为你挑选了3个好方法。

我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向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 NumberSegment Number报告和其他文档,因此它们必须是唯一的.

我总是喜欢保持简单,所以我更喜欢示例1,但我一直在阅读,你不应该在报告/文档中公开你的主键.所以现在我更多地考虑示例3.

我也倾向于示例3,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.

您认为我们应该怎么做?

谢谢.

编辑:谢谢大家的好评,给了我很多帮助.



1> cletus..:

这实际上是关于代理(也称为技术或合成)与自然主键的讨论,这是一个被广泛涵盖的主题.我在AppDevelopers制作的数据库开发错误中介绍了这一点.

自然键是基于(表面上)唯一的外部有意义数据的键.常见的例子是产品代码,双字母州代码(US),社会安全号码等.代理或技术主键是那些在系统外绝对没有意义的主键.它们纯粹是为了识别实体而发明的,通常是自动递增字段(SQL Server,MySQL,其他)或序列(最着名的是Oracle).

在我看来,你应该总是 使用代理键.这些问题出现了这个问题:

你觉得你的主键怎么样?

表中主键的最佳实践是什么?

在这种情况下,您将使用哪种格式的主键.

代理比.自然/商业钥匙

我应该有一个专用的主键字段吗?

自动编号字段是要走的路.如果您的密钥在数据库之外具有意义(如资产编号),则很可能会发生变化,更改密钥会出现问题.只需将这些内容的索引用于相关表格即可.


我不能同意这一点.我已经被项目经理多次烧伤,他们发誓,发誓,SWORE用户生成的代理键是独一无二的,但后来发现有一些模糊的案例,其中数字是重复的.以后修理很痛苦.
我完全同意.我也避免让用户看到你的代理主键.如果你这样做,最终他们会为它分配一些意义,并决定他们想改变什么,你又回到了这里.

2> TheTXI..:

我个人会说保持简单,并使用自动增量主键.如果你需要在程序中显示更多"可读"的东西,那么可能是你的其他想法之一,但我认为这只会给主键字段增加不必要的复杂性.



3> sipwiz..:

我也非常强烈地使用"不要使用主键作为有意义的数据"阵营.每次我违反这项政策,它都会流下眼泪.有意义的数据迟早需要改变,如果这意味着你必须改变一个主键,它会变得很痛苦.主键可能会在外键约束中使用,您可以花费多年时间尝试对其进行排序,以便进行简单的数据更改.

我总是在我创建的每个表中使用GUID/UUID作为我的主键,但这只是个人偏好系列或类似的也很好.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有