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

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

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

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

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

业务主键

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

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

则查询:

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),然后将拿到的值,再写入相应表中(一般的每个表对应一个序列名)

则查询: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中建立主键的同时自动将字段设为索引,其他数据库要亲自去测试了。@春天说烟火 @程序猿大波

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

  1. mysql表设计原子性_数据库表设计-原子性

    好的数据结构会影响速度.好的数据库表设计会影响数据库操作效率.特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂. SQL是关系数据库中用到的一种语言.所以,为 ...

  2. 数据库名词解释 主键外键检查 非空、唯一性约束 父表 子表

    Oracle数据库中,约束具体包括非空(NOT NULL)约束.唯一键(UNIQUE)约束.主键(PRIMARY KEY)约束.外键(FOREIGN KEY)约束和检查(CHECK)约束五种. 1:主 ...

  3. mongodb如何实现更新一个字段的值为另外一个字段的值?

    转载自   mongodb如何实现更新一个字段的值为另外一个字段的值? db.CargoUserProfiles.find().forEach(function(item){db.CargoUserP ...

  4. ezdml 支付mysql 吗_数据库表设计工具EZDML使用教程

    表结构设计器(EZDML) 这是一个数据库建表的小软件,可快速的进行数据库表结构设计,建立数据模型.类似大家常用的数据库建模工具如PowerDesigner.ERWIN.ER-Studio和Ratio ...

  5. mysql主键干嘛的_数据库表中的主键有什么作用?

    展开全部 数据库主键 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样e69da5e6ba9062616964757a686964616f31333365643534的一列或多列 ...

  6. jmeter--正则提取json串中一个大括号对象里指定字段值的的另一个字段的值

    需要提取如图红框_id的值,整个返回里有多个类似的大括号对象: 里面的第一个id的值,但是整个json串不止这么一个,并且只能匹配quality_level是349的这个大括号里的第一个id的值.下面 ...

  7. SAP ABAP bcset激活时,关联的数据库表条目是如何插入的

    本文介绍SAP ABAP bcset激活时,关联的数据库表条目是如何插入的. 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  8. mysql 字段名称规范_数据库表及字段命名规范

    数据库设计表及字段命名规范(我整理的,望大家多多提建议) 1.数据库表命名规范: (1)表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,前缀全部大写或首字母大写,表名中包含的单词首字母大写 ...

  9. MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现

    1. 问题描述 在使用MyBatis,我们经常会遇到这种情况:SELECT两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value.MyBatis的MapKey虽然很实用,但并 ...

最新文章

  1. java 连接池_初探数据库连接池
  2. ListView使用技巧-更新中
  3. 【大会】5G现象级应用倒计时24个月
  4. 为什么说边缘计算的发展比5G更重要?
  5. 加载的图片还会有未来吗?
  6. 零基础Python学习方法,Python入门必读
  7. 疯狂为《英伟达深度学习学院半日免费初级课程》打Call
  8. Django学习(一)---基本配置及创建项目、应用
  9. 项目中的软件需求说明书的访谈部分
  10. 突击计划——给定三角形边长,求面积
  11. C语言求m以内奇数的和
  12. 游戏必备组件有哪些_抖音直播互动游戏有哪些?直播间热场互动必备的5个小游戏...
  13. 10道经典java面试题_实习生必问(java基础)
  14. setCookie时遇到的问题
  15. 华为防火墙默认密码是什么?
  16. pycharm远程调试的“bug”:/miniconda3/envs/learn/bin/python: can‘t open file ‘//<a2a1d7b1c-6145-4e45-...
  17. python(12)—— 图形用户界面Tkinter
  18. 洛谷 P2184 贪婪大陆
  19. vtkPolyData获取bounds点坐标
  20. andorid6.0 mtk6737平台 ctp调试方法

热门文章

  1. 文本分类入门(三)统计学习方法
  2. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
  3. BZOJ 3119 Book (贪心+数学推导)
  4. 自编码的matlab代码,深度学习自动编码机MATLAB实现
  5. 多参量最优化matlab,fmincon函数优化多个参数
  6. snb处理器hd3000显卡专用extra_一文看懂显卡的GPU,流处理器,显存,位宽,核心频率是啥?...
  7. activiti7 和业务_上市公司区块链业务终于赚钱了!营收增长3886.03%
  8. MESSAGE_TYPE_X dump in RSM_DATASTATE_CHECK -6-
  9. PHP基础3--文件加载-错误处理
  10. 第一百七十二节,jQuery,动画效果