`
cprogrammer
  • 浏览: 10406 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论
  • 375: 业务需要积累的,也需要你能坚持。
    ...
  • protti: jkfzero 写道不是说BOSS的网际结算业务流程相当的繁琐 ...
    ...
  • cprogrammer: acd79258 写道正在体验BOSS中。。感觉如下: 以前 ...
    ...
  • yuxie: 人云亦云罢,俺做过BOSS,也做过财务、人力资源一方面的一些软 ...
    ...
  • jkfzero: 不是说BOSS的网际结算业务流程相当的繁琐么?没有人介绍下。 ...
    ...

业务主键和代理主键的比较

阅读更多

这是个老话题,人们在做数据库设计时常常按照个人偏好或一些技术文档上的简单推荐来选择它们二者,但是世上没有放之四海而皆准的东西,所以它们两者一定会相对更适合应用于不同的环境。下面对两者各种的优势加以说明。

优势和不足
下文中提到的“业务编号”是可以唯一确定一条记录的有意义的内容,也就是业务主键。

业务主键优势


业务主键
代理主键

1
具有更好的检索性能。同时基于主键检索更加方便。


因为使用业务主键来查询关联表时,可以减少连接主表的几率,减小I/O量。
连接开销只能通过增加冗余来解决,即在子表中保存主表的“业务编号”。但是这样做的话,使用代理主键的意义就失去了很多。因为,它会引起使用冗余数据后存在的所有问题,可是又没有解决代理主键的许多不足。

2
更好可读和便于理解。



3
合并相同业务实体更加容易(不同实体的主键编码不同)。


举例:两个分公司的订单,每月汇入总公司的数据库表。如果前期已经分公司订单编号区分开了,则合并数据就可以直接COPY。
如果代理主键是numeric类型的,那么前期必须定义各个分公司的订单表及子表使用不同的范围取值的代理主键。这虽然无需修改应用,但是增加了系统实施和后期维护的工作。如果代理主键是UUID或GUID这样的对象,那么则不需要。


业务主键的这一优势只限前期对不同分公司的业务主键的编码做了区分,如果没有,那么做数据合并时将更加麻烦。相反,代理主键此时反倒更具优势,因为数据合并时,只需要过滤分公司的主键而使用总公司的主键,无需修改业务编号,例如:单号、产品号。

4
数据迁移更加容易。


对于numeric类型的代理主键,在不同数据库间迁移数据时,需要重新计算被迁移实体的代理主键。



5
复杂性低和存储量少。


使用代理主键需要增加格外的索引,从而导致增加了insert的负担和需要更多的存储。



6
代理主键不是SQL的标准,不同数据库系统实现不一。因为不同数据库系统在此实现不一,导致应用跨数据库平台不方便。
可以在系统中使用ORM框架,例如:hibernate或EJB。虽然现在的ORM框架在不断完善,但是也依然有许多限制。

7
代理主键无法保证相同业务的数据被重复插入。因为代理主键是无意义的,有意义的是业务编号,当使用代理主键时,业务编号就可能重复,这破坏了关系模型。
可以为使用代理主键的实体中的“业务编号”字段添加唯一索引。

8
代理主键不能被改变。




代理主键优势


代理主键
业务主键

1
在业务发生变化时,适应性更强一些。

举例:产品编码规则发生变化。此时,产品编码不是主键,所以只需要按照新的编码规则更改产品实体表内的“业务编号”,而不会影响到其他实体。
因为产品编码是产品实体的主键,所以产品编码内容在其他实体中会作为外键,此时需要更多的工作,才能完成升级。如果那些实体已经备份到外面了,那还需要导入数据修改等工作。


当然,业务发生变化带来的升级不会仅仅update几个字段就解决的,它必然带来更多系统的考虑,比如:兼容性。

2
保证系统的一致性和系统可操作型。


举例:订单表和订单子表,订单使用“订单号”作为业务主键,订单子表使用“订单号”和序列号作为复合的业务主键。一旦订单子表的记录被其他单据引用,希望调整订单子表记录的序列号的先后次序就很麻烦了。
可以为订单子表添加一些“排序次序号”之类的字段,但是这样的字段与序列号语义上是一样的。

3
数据表连接和更新的性能更高。


举例:订单表和订单子表,订单使用“订单号”作为业务主键,订单子表使用“订单号”和序列号作为复合的业务主键。
通过业务主键做关联时,连接的开销将比代理主键大很多,而且随着业务主键(CHAR型)位数增加,性能会不断降低。相反代理主键的连接开销将相对固定,只与数据量有关,而与业务约束有关。

另外业务主键时常是复合主键,这进一步拉低了连接和更新的性能。例如更新订单子表一个记录,需要使用订单的业务编号和子项的序列号作为where条件。

4
存在主从关系时候,业务主键更新不方便。

举例:在实际应用环境中,用户也许会出错,录入错误的单号、产品号等,等发现时这些业务主键已经被多处地方使用作为外键,这时需要修改这些错误信息就会增加工作量。



5
适合与现在JAVA的ORM框架配合使用,例如Hibernate。

Hibernate的数据对象中的OID对象可以直接映射为代理主键,同时OID的新建也可以使用数据库的原生机制,从而可以被hibernate有效管理。



6
在并发环境下,更容易实现唯一的ID。

因为在代理主键是numeric类型时,可以直接使用数据库的auto increment类型的字段或依靠sequence对象产生内容。



7
系统占用的存储空间更省。


例如:CHAR(7)的业务主键和INT型的代理主键。在百万行的数量下,代理主键上的索引容量=业务主键索引存量×80%,代理主键字段存储容量=业务主键索引存储容量/2。
虽然从单表看,因为多了代理主键,所以需要更多的存储开销(代理主键字段和PK索引),但是从系统角度看,其他实体的numeric的外键将比CHAR类型的外键节省更多的空间。










总结
从关系数据库理论角度说,主键是由设计者选定的在同一实体集中区别不同实体的候选码。从这个角度看,主键的选择是客观中带有主观的,那么用有意义的实体属性还是一个无意义GUID去标识实体本没有差别,毕竟世间万物都可以给一个全世界唯一的GUID去唯一限定,只要人愿意这么做。因此,对业务主键和代理主键的取舍,更多的是需要从系统、应用环境、实体属性与关系、开发效率、系统性能和维护成本等多方面去思考。
分享到:
评论

相关推荐

    实体、范式、业务代理复合主键、关系理解分析

    在IT行业中,数据库设计是构建高效、稳定系统的关键部分,其中实体、范式、业务代理复合主键以及关系的理解和分析至关重要。以下是对这些概念的详细解析。 首先,"实体"是数据库设计中的基本概念,它代表现实世界中...

    MySQL数据库分表批量主键查询代理-mysql-partitions-proxy.zip

    这个开源工具旨在优化数据库的查询效率,尤其在面对分表场景下的主键批量查询时,它能提供一个代理服务,有效地协调和管理这些查询。 首先,让我们理解一下什么是数据库分表。当单个表的数据量过大,为了提高查询...

    常用Hibernate主键生成策略

    主键可以分为两种类型:自然主键和代理主键。 1. **自然主键**:指使用具有业务逻辑含义的字段作为表的主键。例如,在用户信息表中,可以采用用户的身份证号码作为主键。这种方式的优势在于主键本身具有业务意义,...

    跟着铁哥学Java,MyStore项目 CH02 用户模块实现

    物理主键,也称业务主键,是指具有业务意义的字段,如用户名,但在实际应用中,由于业务需求变更可能导致主键值变动,所以通常不推荐使用。逻辑主键,又称代理主键,是一种与业务逻辑无关的主键,如自增ID,它降低了...

    数据仓库 代理键 使用方法

    数据仓库中的代理键(Surrogate Key)是一种在维度表中使用的特殊主键,它通常是一个自动递增的整数,不具有业务含义,主要用于解决维度数据变化时的维护问题。在传统的数据库设计中,主键通常是业务上的唯一标识,...

    旅行代理数据库设计

    在这个项目中,首先需要了解旅行代理业务流程,确定需要存储的数据类型和它们之间的关系。 3. **ER图(实体关系图)**:ER图是描述实体及其相互关系的图形工具。在旅行代理数据库中,可能的实体包括旅客、航班、...

    Choosing a Primary Key.doc

    本文将探讨自然键和代理键这两种主要的主键策略,以及如何根据实际情况做出最佳选择。 1. 常见的键术语 - 关键(Key):由一个或多个数据属性组成,可以唯一地识别一个实体。在物理数据库中,键通常是由表中一列或...

    中国邮政代理保险总设-数据库设计说明书.

    这涉及到数据表的设计,包括字段选择、数据类型定义、主键和外键的设定,以及合理的索引策略,以优化查询性能。 其次,数据库的正常运行还需要完善的事务管理和并发控制机制。由于保险业务往往涉及到多用户同时操作...

    业务驱动的技术架构

    4. **OBProxy反向代理**:OceanBase使用OBProxy作为反向代理,它具有百万级别的处理能力,可以实现路由转发、轻量级SQL解析等功能,并且无状态,便于扩展和维护。 #### 三、来自业务的挑战和需求 随着业务的快速...

    03数据库名5.10

    在给定的信息中,我们可以看到一系列与数据库设计和管理相关的数据表。这些表涉及了不同类型的实体,如代理商(T_...通过这些表的设计,可以实现对各类数据的有效存储、查询和操作,便于业务流程的管理和数据分析。

    数据建模资产管理数据库设计报告.pdf

    5. 服务代理表:详细列出服务代理的信息,代理编号为主键,代理名字、电话和传真为替换键。 6. 资产状态表:描述资产的状态,状态编号为主键。 7. 估价表:记录估价信息,估价编号为主键,资产编号和员工编号为外键...

    保险系统业务文档20070420

    - 用户角色:保险系统涉及到不同的用户群体,如投保人、保险公司员工、代理人等,了解他们的需求和操作权限至关重要。 2. **系统架构**: - 分层架构:保险系统可能采用典型的三层架构(表示层、业务逻辑层、数据...

    武汉理工大学大数据库问题详解汇总情况.doc

    在某些情况下,主键可以是代理键,即不直接反映业务含义,仅作为识别记录的标识符。在这个例子中,StudentNumber可以被视为代理键。 5. 表之间的关系 "STUDENT"表和"GRADE"表通过StudentNumber建立联系,"GRADE"表...

    OceanBase业务驱动的技术架构.pdf

    5. 如何规避分布式数据库的种种限制,如分区键和主键的绑定关系。 6. 如何解决非分区维度查询的问题。 7. 如何解决业务数据量膨胀之后的冷热数据问题。 OceanBase业务驱动的技术架构是解决支付宝的弹性大促问题的...

    2.3-PostgreSQL数据库关系操作实践.ppt

    代理键(Surrogate Key)是一种额外的主键,通常用自动递增的数字来标识记录,如`CoursePlanID`和`CourseRegID`,这可以避免主键因业务规则变化而更改。 6. **定义实体完整性** 实体完整性通过设置主键约束来实现...

    【ssm项目源码】超市收银业务系统.zip

    10. **部署与运维**:项目部署可能需要Tomcat、Jetty等应用服务器,配合Nginx等反向代理服务器进行负载均衡和静态资源处理。监控工具如Log4j、JMX等用于系统状态监控和日志记录。 综上所述,【ssm项目源码】超市...

    数据库-第5章数据库物理模型.ppt

    概念模型是基于业务理解和需求,逻辑模型则是将概念模型进一步规范化和抽象,而物理模型则是针对特定数据库管理系统(DBMS)的实际存储和访问方式进行设计。 在模型转换中,我们通常有两种方案。第一种是从概念模型...

    hibernate测试题

    4. **主键与代理主键**:表的主键用于确保记录的唯一性,应避免具有业务含义,通常使用自动增长ID字段作为代理主键。 5. **ORM(对象关系映射)**:ORM模式如Hibernate解决了对象与关系数据之间的映射问题,使得...

    MyCat测试报告(单机MyCAT对比多机MyCAT)1

    在选择MyCat集群规模和代理策略时,应考虑实际业务需求、系统负载和资源利用率。Lvs作为轻量级代理,更适合简单代理场景,而增加MyCat节点则有利于提升大规模并发下的性能。对于大型分布式数据库系统设计,这样的...

Global site tag (gtag.js) - Google Analytics