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