我们正在试图为我们正在创建的assets资源 系统制定一个编号系统,办公室里对这个话题进行了一些激烈的讨论,所以我决定请教SO的专家.

考虑下面的数据库设计会是更好的 Select .

ALT Text

Example 1:使用自动代理键.

=================   ==================
Road_Number(PK)     Segment_Number(PK)
=================   ==================
 1                   1

Example 2:使用程序生成的主键

=================   ==================
Road_Number(PK)     Segment_Number(PK)
=================   ==================
 "RD00000001WCK"     "00000001.1"

(00000001.1表示这是道路的first段.这increases表示每次添加新路段时,例如00000001.2)

Example 3:同时使用两者(添加新列)

=======================    ==========================
ID(PK) Road_Number(UK)     ID(PK)  Segment_Number(UK)
=======================    ==========================
 1     "RD00000001WCK"       1       "00000001.1"

只是一点背景信息,我们将在报告和其他文件中使用Road NumberSegment Number,所以它们必须是unique.

我一直喜欢保持简单,所以我举了prefer个例子1,但是我一直在读到,您不应该在报告/文档中公开您的主键.因此,现在我更多地按照示例3的思路思考.

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

你认为我们应该怎么做?

谢谢你.

编辑:感谢大家的精彩回答,对我帮助很大.

推荐答案

这实际上是关于代理(也称为技术的或合成的)与自然主键的讨论,这个主题已经被广泛地讨论过了.我用了Database Development Mistakes Made by AppDevelopers美元覆盖了这件事.

自然关键点是基于

我认为你应该always美元

自动编号字段是可行的.如果您的密钥在数据库之外有意义(如assets资源 编号),则这些密钥很可能会更改,更改密钥是有问题的.只需在相关表中使用这些内容的索引即可.

Database相关问答推荐

MongoDB根据嵌套文档中的值匹配数组

Pocketbase 中的 SQLite 数据库可以根据自己的喜好进行修改吗?

什么时候需要手动重新分析 PostgreSQL 中的表?

在保持抽象的同时将格式化文本存储在数据库中

java嵌入式库磁盘键值数据库

任何用于存储过程的静态代码分析工具?

什么是Open Schema的数据库?

如何使用错误消息中指定的 tbspaceid tableid 在 DB2 中查找表和列

在 MongoDB 中模拟关系

数据库内部—从哪里开始?

Membase 和 Couchbase 有什么区别?

使用脚本语言动态数据库

从数据库行在 Golang 中创建map

如何将mysql的默认端口从3306更改为3360

用 SQL 进行条件插入?

如何在每个 SQLite 行中插入唯一 ID?

复式记账的关系数据模型

对于 N:M 关系,在 MongoDB 中推荐的级联删除等效项是什么?

如何使用 PL/SQL Developer 连接到远程 Oracle DB?

是否有用于 postgresql 的数据可视化工具,它也能够显示模式间关系?