自然键与 auto_increment 键作为主键

nature key vs auto_increment key as the primary key

我的问题是关于自然键和 auto_increment 整数作为主键。

例如,我有 tables ABA_B_relation。 A和B可能是某个对象,A_B_realtion记录A和B的多对多关系

A和B都有自己的全局唯一id,比如UUID。 UUID 对用户可用,这意味着用户可以通过 UUID 查询 A 或 B。

有两种方法可以设计table的主键。

  1. 使用 auto_increment 整数。 A_B_relation 将整数引用为 FK。
  2. 使用 UUID。 A_B_relation 将 UUID 引用为 FK。

比如用户想通过A的UUID查询所有与A关联的B的信息。

对于第一种情况,查询流程是这样的:

First, query A's integer primary key by UUID from `A`.

And then, query all the B's integer primary key from `A_B_relation`.

At last, query all the B's info from `B`.

对于后一种情况,流程如下:

Query all the B's UUID from the `A_B_relation` by A's UUID.

Query all the B's info from `B`.

所以我认为,后一种情况更方便。这是正确的吗?后一种情况有什么不足?

根据我的看法,使用自增键或自然键的便利性取决于您提供的程序解决方案。这两种方法各有利弊。因此,最好的解决方案是正确理解这两种键类型,分析您要提供的业务解决方案类型以及 select 适当的主键类型。

自然键是一个列或一组列,我们可以用来唯一标识table中的一条记录。这些列包含与 table.

的其余列有关系的真实数据 自动递增键,也称为代理键是一个单table列包含可用于唯一标识 table 中的单行数据的唯一数值。这些值是在 运行 时生成的,当记录被插入到 table 并且与行的其余数据没有关系时。

使用自然键的主要优点是它有自己的含义,并且需要与其他 table 的连接更少,就像我们使用代理键一样,我们需要连接到外键 table 得到我们用自然键得到的结果。
但是假设我们无法从单个 table 获取所需的所有数据,而必须与另一个 table 连接才能获取所需的所有数据。然后使用代理键而不是自然键很方便,因为大多数时候自然键是字符串并且比代理键的大小更大,并且使用更大的值连接 table 将花费更多时间。

自然键有其自身的含义。因此,在搜索记录时,使用自然键比代理键更有优势。但是随着时间的推移,我们的程序逻辑发生了变化,我们必须改变自然键值。这将很困难,并且会对所有外键关系产生级联效应。我们可以使用代理键来解决这个问题。由于代理键与行的其余值没有关系,因此逻辑的更改不会影响代理键。

同样,正如我所看到的,完全基于您提供的解决方案使用代理键或自然键的便利和不便。