a表两个字段都与b表一个字段关联_数据库表的主键实例分析

主键(PRIMARY KEY):数据库表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。

  • 业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。
  • 逻辑主键(代理主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。
  • 复合主键(联合主键):通过两个或者多个字段的组合作为主键。

这么多的主键,每种主键在表中作用是什么?哪一种可以有效提高查询的效率?

为了表达方便,下面如oracle为例。先定义两个表,如下图

b9344c14ff258dbc9f57513a9b88583b.png

(红色表示采用那种主键)

业务主键

顾名思义,业务主键就是说用业务字段来作为主键。但业务逻辑的改变是不可避免的,因为“永远不变的是变化”,没有任何一个业务是永远不变的。

例如:如果你用客户的编码来作主键,当编码错误修正时,系统中关联该主键的部分表修改将是不可避免的,并且关联的表越多改动越大。

518b186f3876a4657d92e6407cf3e9f3.png

则查询:

SELECT A.CUST_CODE "客户编码",A.CUST_NAME "客户名称",B.SALES_CODE "订单编码",B.ORDER_QTY "订单数量"

FROM DATA0010 A,DATA0060 B

WHERE A.CUST_CODE=B..CUST_CODE

从上面可知道,当业务字段客户编码改变时,查询要同步更新订单表DATA0060中的客户编码,关联的表越多,更新越多。

如果订单表有100万,则多并发运行的时候整个系统就会崩溃。

复合主键

由一个或者两个以上的字段组成,当然的也包含业务字段在里面,这种情况更加不可能用来做主键,但可以作为唯一性的索引约束。它也具备业务主键的弊端 。

逻辑主键

逻辑主键的字段,不会跟着业务的变动而变动。比如自动生成的ID数字,但有时候因为系统编程要拿到这个字段ID值,因此一般情况下都要自定义一个数值字段ID(Oracle用SELECT 序列名.NEXTVAL AS NextNumber FROM DUAL),然后将拿到的值,再写入相应表中(一般的每个表对应一个序列名)

a8153cf7416d321a0a46ef9647c2759d.png

则查询:SELECT A.CUST_CODE "客户编码",A.CUST_NAME "客户名称",B.SALES_CODE "订单编码",B.ORDER_QTY "订单数量"

FROM DATA0010 A,DATA0060 B

WHERE A.RKEY=B.CUSTOMER_PTR

从上面可知道,当业务字段客户编码改变时,查询逻辑永久不变。

使用逻辑主键的主要原因

  • 业务主键一旦错误修改,逻辑主键对应的值不受任务影响。只需要修改相应的业务主键的业务逻辑即可,减少了因为业务主键相关改变对系统的影响范围。
  • 使用逻辑主键的另外一个原因是,业务主键有时用字符字段,速度性能较逻辑字段(数字型)差且存储间大,不利于传输及处理。

结束

当查询连接5个以上的外连接表时候,逻辑主键优于业务主键的性能越来越明显。在oracle中建立主键的同时自动将字段设为索引,其他数据库要亲自去测试了。@春天说烟火 @程序猿大波

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值