这是个老话题,人们在做数据库设计时常常按照个人偏好或一些技术文档上的简单推荐来选择它们二者,但是世上没有放之四海而皆准的东西,所以它们两者一定会相对更适合应用于不同的环境。下面对两者各种的优势加以说明。
优势和不足
下文中提到的“业务编号”是可以唯一确定一条记录的有意义的内容,也就是业务主键。
业务主键优势
业务主键
代理主键
1
具有更好的检索性能。同时基于主键检索更加方便。
因为使用业务主键来查询关联表时,可以减少连接主表的几率,减小I/O量。
连接开销只能通过增加冗余来解决,即在子表中保存主表的“业务编号”。但是这样做的话,使用代理主键的意义就失去了很多。因为,它会引起使用冗余数据后存在的所有问题,可是又没有解决代理主键的许多不足。
2
更好可读和便于理解。
3
合并相同业务实体更加容易(不同实体的主键编码不同)。
举例:两个分公司的订单,每月汇入总公司的数据库表。如果前期已经分公司订单编号区分开了,则合并数据就可以直接COPY。
如果代理主键是numeric类型的,那么前期必须定义各个分公司的订单表及子表使用不同的范围取值的代理主键。这虽然无需修改应用,但是增加了系统实施和后期维护的工作。如果代理主键是UUID或GUID这样的对象,那么则不需要。
业务主键的这一优势只限前期对不同分公司的业务主键的编码做了区分,如果没有,那么做数据合并时将更加麻烦。相反,代理主键此时反倒更具优势,因为数据
优势和不足
下文中提到的“业务编号”是可以唯一确定一条记录的有意义的内容,也就是业务主键。
业务主键优势
业务主键
代理主键
1
具有更好的检索性能。同时基于主键检索更加方便。
因为使用业务主键来查询关联表时,可以减少连接主表的几率,减小I/O量。
连接开销只能通过增加冗余来解决,即在子表中保存主表的“业务编号”。但是这样做的话,使用代理主键的意义就失去了很多。因为,它会引起使用冗余数据后存在的所有问题,可是又没有解决代理主键的许多不足。
2
更好可读和便于理解。
3
合并相同业务实体更加容易(不同实体的主键编码不同)。
举例:两个分公司的订单,每月汇入总公司的数据库表。如果前期已经分公司订单编号区分开了,则合并数据就可以直接COPY。
如果代理主键是numeric类型的,那么前期必须定义各个分公司的订单表及子表使用不同的范围取值的代理主键。这虽然无需修改应用,但是增加了系统实施和后期维护的工作。如果代理主键是UUID或GUID这样的对象,那么则不需要。
业务主键的这一优势只限前期对不同分公司的业务主键的编码做了区分,如果没有,那么做数据合并时将更加麻烦。相反,代理主键此时反倒更具优势,因为数据