再论主键(一)

关于主键本来一直觉得这没什么好说的,很简单的内容,也没怎么太在意并强调。
但最近在看了公司的数据库设计之后,发现问题还真不小。[@more@]

在公司所有的数据库设计中,每个表都定义一个ID列作为主键 int类型,该列采用自增或者使用sequence。
问其原因,答曰“主键要具有业务无关性”。同时baidu一把,乖乖不得了,网上铺天盖地的文章在强调主键一定要与业务无关。
看看好几篇文章写的内容应该是工作了一定时间后才有的心得。

我在给别人讲技术内容的时候总是喜欢先讲基础理论,然后讲应用。很多人不喜欢看基础理论,认为基础理论没什么用。
基础理论到底有多少作用呢?个人认为,可能在我们刚开始工作时帮助确实不大,但在工作一段时间之后作用就显现出来了。工作了一段时间之后每个人都会总结一些心得,但这些总结是否正确呢?个人觉得基础理论理解不清楚的总结很可能就往错误的方向上发展,时间越长甚至偏差越大。
以这个主键选择为例,为何如此多的人会说“主键要具有业务无关性”呢?这典型的就是数据库基础理论不清楚。

什么是表?表描述的是一个实体或者实体间的关系。
什么是列?列是实体的属性或者是实体间关系的属性。

比如,订单可以作为一个实体,订单有:编号,时间,金额,支付方,等属性。
那么订单这是实体就可以转成一个表,其属性就转化为表中的列。
如果我们增加一个“业务无关”的ID列,那么这个列是表描述实体的属性吗?既然是“业务无关”那肯定不是。

提出“主键要业务无关性”观点的人有一个重要的论据:主键不能被更改,只有业务无关才能保证主键不被更改。
看了这个真是有点崩溃,只要是符合主键属性的列在业务中一般不会有更改的需求,但有些情况中是可能更改的。但更改了又如何?主键更改是“罪大恶极”的吗?

再退一步讲,这个“业务无关”的主键那肯定是在业务中用不到的,定义这么一个没用的列除了增加了存储空间,减慢了数据更新的速度,浪费了这个宝贵的数据库属性之外还有什么用呢?

在数据库中主键的地位是非常特殊并宝贵的,数据库优化器针对主键通常有更好的优化算法。甚至在有的数据库中主键的数据结构与普通index都不一样。
通过主键访问通常都是最快的,至少绝不会比普通index慢。

只有在极少数的情况中需要在没用主键的表中增加一个主键,这一般都是数据库管理上的需要,并非是业务上的需要。
比如在以前DB2 SQL复制或Q复制需要表一定要有主键才能对表进行复制。类似这些情况是很罕见的。

如果就是想不通那么不妨再这样考虑一下我们“创造”的主键是否合适:假如去掉这个“主键”后有任何影响吗?
如果没有任何影响那么这个“主键”还有存在的必要吗?

最后再强调一下:主键是实体或实体间关系的一个属性或者几个属性的组合;主键是从现有属性中分析出来的;主键并非一定要存在,更不要“创造”主键。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/598443/viewspace-1056397/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/598443/viewspace-1056397/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值