编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

什么是代理主键(逻辑主键)和自然主键(业务主键)?

代理主键(逻辑主键)

与业务无关的,无意义的数字序列,比如自动增长的ID。

最常用的生成方式有2种:自增和UUID

自然主键(业务主键)

事物属性中的自然唯一标识。本身具有一定的含义,是构成记录的组成部分,比如学生的学号,每个人的身份证号,电商系统中的订单号。

优缺点:

1、业务主键一般都是字符串,更浪费空间。

2、业务主键无序,写入时需更长时间组织索引。为了使主键有序,需要进行索引重排,无序的编号需要频繁进行索引重排,降低入库性能(数据移动),而代理主键本身自增,不需要进行索引重排。

3、业务主键如果是字符串,在分库分表时,无法直接取模运算,需要先转换数字,处理更耗时。

4、业务主键在分布式系统中存在高耦合问题,一旦数据本身发生变化,系统极难维护。例如,用户系统、积分系统、账户系统(管理余额),如果用户系统以身份证作为主键,在系统间操作的时候需要传入这个主键,但如果是一个老人,身份证15位,而现在国家要求身份证必须更改为18位,其他系统都需要进行相应的更新,极大的增加了数据维护成本,系统之间耦合度太高。

5、业务主键可能存在冲突。例如如果是以身份证为id,那么在一个员工表中,假设一个员工离职,后因为某种原因又入职,一般的业务处理都是重新创建一条员工记录,但身份证号相同,就会存在主键冲突的问题。

6、如果没有指定自增id 主键,那么该表的第一个唯一非空索引被作为聚集索引。如果这个列是 char 类型的数据,会增加表的插入开销。

7、如果没有指定自增 id,也没有唯一非空索引,那么mysql就会自动生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,这个列值也是自增的。

8、使用代理键可以带来性能上的优势。和自然关键字相比,代理关键字很小,是整型的,可以减小事实表中记录的长度。这样,同样的IO就可以读取更多的事实表记录。另外,整型字段作为外键连接的效率也很高。

未经允许不得转载: 技术文章 » 数据库 » 什么是代理主键(逻辑主键)和自然主键(业务主键)?