自然键与 auto_increment 键作为主键
nature key vs auto_increment key as the primary key
我的问题是关于自然键和 auto_increment 整数作为主键。
例如,我有 tables A
和 B
和 A_B_relation
。 A和B可能是某个对象,A_B_realtion
记录A和B的多对多关系
A和B都有自己的全局唯一id,比如UUID。 UUID 对用户可用,这意味着用户可以通过 UUID 查询 A 或 B。
有两种方法可以设计table的主键。
- 使用 auto_increment 整数。
A_B_relation
将整数引用为 FK。
- 使用 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 将花费更多时间。
自然键有其自身的含义。因此,在搜索记录时,使用自然键比代理键更有优势。但是随着时间的推移,我们的程序逻辑发生了变化,我们必须改变自然键值。这将很困难,并且会对所有外键关系产生级联效应。我们可以使用代理键来解决这个问题。由于代理键与行的其余值没有关系,因此逻辑的更改不会影响代理键。
同样,正如我所看到的,完全基于您提供的解决方案使用代理键或自然键的便利和不便。
我的问题是关于自然键和 auto_increment 整数作为主键。
例如,我有 tables A
和 B
和 A_B_relation
。 A和B可能是某个对象,A_B_realtion
记录A和B的多对多关系
A和B都有自己的全局唯一id,比如UUID。 UUID 对用户可用,这意味着用户可以通过 UUID 查询 A 或 B。
有两种方法可以设计table的主键。
- 使用 auto_increment 整数。
A_B_relation
将整数引用为 FK。 - 使用 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 将花费更多时间。
自然键有其自身的含义。因此,在搜索记录时,使用自然键比代理键更有优势。但是随着时间的推移,我们的程序逻辑发生了变化,我们必须改变自然键值。这将很困难,并且会对所有外键关系产生级联效应。我们可以使用代理键来解决这个问题。由于代理键与行的其余值没有关系,因此逻辑的更改不会影响代理键。
同样,正如我所看到的,完全基于您提供的解决方案使用代理键或自然键的便利和不便。