业务主键与逻辑主键

一般情况下,一张数据表必须要有一个主键字段,这样这个主键字段就可以唯一标识这条记录了。不过采用什么样的字段来做为主键字段还是一个必须解决的问题,目前有两种常用的主键策略:业务主键与逻辑主键。

业务主键是指采用业务数据中的某个字段做为主键,比如在员工档案表中可以用工号来做为主键、在车辆管理系统中可以用车牌号做为主键字段。逻辑主键,也称代理主键,是指不采用任何业务数据做为主键,而是采用一个没有业务意义的不重复值做主键,比如在员工档案表中用一个自动增长的字段来做为主键,这个字段没有任何的业务意义。

使用业务主键是比较简单的,但是会存在潜在的问题,一个是业务主键并不能真正的保证唯一性,第二个是做为主键的数据一旦发生变化就会带来维护的问题。假设在社区人员信息表中使用身份证号码做为主键,由于我国身份证编号制度还存在一定缺陷,所以存在不少的身份证号码重复现象,这样一旦社区中有两个同样身份证号的人员出现,系统将会出现问题;即使能够杜绝身份证号码重复现象,也会存在升级的问题,比如今后出现身份证号码位数升级的问题,那么由于很多表都是通过身份证号码这个主键字段来关联社区人员信息表的,那么不仅要升级社区人员信息表,还要将这些关联表进行升级。因此建议尽量不要用业务字段做主键,而是使用没有业务意义主键。

使用业务主键可以保证主键值的唯一性,并且在业务发生变化时,适应性更强一些。不过使用代理主键也有劣势,那就是主键字段由于没有任何业务意义,所以在使用的时候比较麻烦。不过总的来与业务主键比起来,逻辑主键更有优势,因此除非有特别的理由,否则使用逻辑主键是一个好的习惯。

如果决定采用逻辑主键的话,使用什么样的主键生成策略则是必须考虑的。常用的主键生成策略有:自动增长字段和UUID。使用自动增长字段就是每次向表中插入记录的时候DBMS 自动为主键设定一个自动增长的值;使用UUID 则是为主键字段设置一个UUID 类型的值,这个UUID 值采用UUID 算法来生成,这样可以保证生成的值是绝对唯一的。

使用自动增长字段的优势在于速度比较快,根据统计UUID算法要比自动增长字段的生成速度慢约30倍;使用自动增长字段的劣势在于进行表合并的时候会存在冲突的问题,比如A表和B表的结构完全相同,而且它们都采用自动增长字段来生成主键,如果想将A表和B表合并为一张表的话那么就有可能由于A表中的记录的主键值和B表中的记录的主键值冲突而造成合并失败,而使用UUID 算法则不会有这个问题,因为UUID 算法能够保证两个UUID 值是唯一的。

posted @ 2018-10-22 02:35  尐鱼儿  阅读(3009)  评论(0编辑  收藏  举报