在设计表时,我养成了一个习惯,就是让一个列是唯一的,并且我制作了主键.这取决于要求以三种方式实现:
数字3将用于相当小的查找,主要是可能具有唯一静态长度字符串代码的读取表,或者诸如年份或其他数字的数字值.
在大多数情况下,所有其他表将具有自动递增整数或唯一标识符主键.
我最近开始使用没有一致行标识符的数据库,主键目前在各个列上进行聚类.一些例子:
这有一个有效的案例吗?我总是会为这些案例定义一个标识或唯一标识符列.
此外,还有许多表没有主键.这有什么正当理由?
我试图理解为什么桌子的设计原样,对我来说这似乎是一个很大的混乱,但也许有充分的理由.
第三个问题可以帮助我解释答案:在使用多列构成复合主键的情况下,这种方法与代理/人工密钥相比有特定的优势吗?我主要考虑的是性能,维护,管理等方面?
在我的团队的一个相当生气勃勃的讨论中,我被认为是大多数人喜欢的主键.我们有以下小组 -
什么是PK的最佳方法?如果你可以证明你的意见,这将是很棒的.上面有没有更好的方法?
编辑:任何人都有一个简单的样本/算法来生成可扩展的行的人类可读标识符?
algorithm ddl database-design primary-key relational-database
我们正在努力为我们正在创建的资产系统提出一个编号系统,在办公室里对这个主题进行了一些激烈的讨论,所以我决定向SO的专家们询问.
考虑到下面的数据库设计,什么是更好的选择.
示例1:使用自动代理键.
================= ==================
Road_Number(PK) Segment_Number(PK)
================= ==================
1 1
Run Code Online (Sandbox Code Playgroud)
例2:使用程序生成的PK
================= ==================
Road_Number(PK) Segment_Number(PK)
================= ==================
"RD00000001WCK" "00000001.1"
Run Code Online (Sandbox Code Playgroud)
(该00000001.1
指它的第一个道路段,这增加了每次你添加一个新的细分如00000001.2
)
示例3:使用两者(添加新列)
======================= ==========================
ID(PK) Road_Number(UK) ID(PK) Segment_Number(UK)
======================= ==========================
1 "RD00000001WCK" 1 "00000001.1"
Run Code Online (Sandbox Code Playgroud)
只是一些背景信息,我们将使用Road Number
和Segment Number
报告和其他文档,因此它们必须是唯一的.
我总是喜欢保持简单,所以我更喜欢示例1,但我一直在阅读,你不应该在报告/文档中公开你的主键.所以现在我更多地考虑示例3.
我也倾向于示例3,因为如果我们决定更改资产编号的生成方式,则不必对主键进行级联更新.
您认为我们应该怎么做?
谢谢.
编辑:谢谢大家的好评,给了我很多帮助.