主键的选择,应该是业务有意义还是业务无意义,应该是逻辑主键还是业务主键
2010-01-24 02:58
393 查看
主键的选择,应该是业务有意义还是业务无意义,应该是逻辑主键还是业务主键呢?我发现有很多支持主键应该都是无意义的,不要和业务相关。我很疑惑,疑惑为什么说应该 无意义呢,这个应该无意义有什么根据呢?
首先我google了一下该类问题,发现大多数人都持有这种观点,甚至出现了“
主键应对用户无意义的原则
”,“主键应该业务无意义的原则”等
所谓的金科玉律。说到原则,问题就大了,我翻阅《database system concepts》这本权威书籍以求证。里面提到主键的定义是表中唯一的标识,“应该选择从不变化或极少变化的属性”
,我想大家对这个观点都没有异议。但是书中没有指明主键应该业务无意义,倒是举了些例子,比如美国社会保障号,企业唯一标识符均应该作为主键,因为他们从不变化或极少变化。我们可以看出,这两个例子中,主键都是选择了业务有意义作为主键
。
接着,我们来看看 “主键应对用户无意义的原则
”这个观点是否站得住脚
。
赞成这个观点的人会把“中国身份证”作为主键的设计,在升号时带来的麻烦作为反例。但实际上身份证作为主键设计是没有问题的。用身份证作为主键,对其他数
据的引用带来了好处,数据完整性得到保证。升号属于几十年才可能有的事情(也许接下来几十年都不会再升号),这属于极少变化的属性。虽然升级时带来了麻
烦,可是否不用身份证作为主键的升级就不麻烦了吗?其实无论选择什么属性作为主键,升级的工作量都是相当的。
最后,我举一个例子,说明选择业务有意义的属性作为主键的好处。
比如气象信息数据,有两张表:
一
张是记录世界所有观测站信息的表StationInfo(简称SI),SI(stationcode(pk),stationname,经度,维
度...)。里面的站号是规定好的,基本上不会变化,但有可能会撤销某站号或增加某站号,这里选择了stationcode这个业务有意义的属性作为主
键。
另一张是记录所有气象站点观测气象要素的表StationRecord(简SR),SR(id(pk),
stationcode(fk),temp,humidity,wind,time,...)。所有站点插入这张表时,只插入站号和该站的气象要素,其他什么站名,经纬度均不知道。
两表的关系如图一:
![](http://images.cnblogs.com/cnblogs_com/petitlen/abc.png)
图一
试想,如果按照“主键应对用户无意义的原则”来设计主键,那么表SI中FStationCode就不能作为主键了,需要增加一个自增字段作为主键,这样一来,表SR中使用什么作为外键和表SI相连?
总
结:对于设计,没有真正的银弹,有些设计方法适合这样的应用,有些适合其他的应用,像“主键应对用户无意义”这种设计方法是适合部分应用的,但同时却不适
合某些应用。所以无论从权威书籍还是实际应用,都告诉我们“主键应对用户无意义的原则”根本算不上一种原则,如果迷信这种原则,对数据库设计会带来弊端。
对于甲方,数据就是命根子,使用业务主键,数据的完整性,关联性清楚明了,上层业务系统怎么改数据都不会乱,但可能工作量大些(相对)。
对于乙方,总是希望工作量越小越好,所以一般选择逻辑主键,也不管你企业的数据存储空间如何,不管你数据今后好不好升级,不管有没有垃圾数据,只要保证在我的维护期内能搞定即可。
但请注意,在数据大批量修改时,使用业务主键 工作量会大些,但约束使你不会出错;使用逻辑主键,貌似工作量小,但必须很小心,万一出错了,可能数据就会大面积错乱,也许无法弥补。
本文的意思并不是说所有主键都应该使用业务主键,但我同样反对所有表都使用逻辑主键,也就是反对“主键应该业务无意义的原则”,因为这不是原则,是需要根据实际应用来考虑的。
我的观点是:
大多数增长型和变更型表应该使用逻辑主键,比如例子中的SR表。
大多数基准型表应该使用业务主键,比如例子中的SI表。
当然,实际问题还需实际分析。
首先我google了一下该类问题,发现大多数人都持有这种观点,甚至出现了“
主键应对用户无意义的原则
”,“主键应该业务无意义的原则”等
所谓的金科玉律。说到原则,问题就大了,我翻阅《database system concepts》这本权威书籍以求证。里面提到主键的定义是表中唯一的标识,“应该选择从不变化或极少变化的属性”
,我想大家对这个观点都没有异议。但是书中没有指明主键应该业务无意义,倒是举了些例子,比如美国社会保障号,企业唯一标识符均应该作为主键,因为他们从不变化或极少变化。我们可以看出,这两个例子中,主键都是选择了业务有意义作为主键
。
接着,我们来看看 “主键应对用户无意义的原则
”这个观点是否站得住脚
。
赞成这个观点的人会把“中国身份证”作为主键的设计,在升号时带来的麻烦作为反例。但实际上身份证作为主键设计是没有问题的。用身份证作为主键,对其他数
据的引用带来了好处,数据完整性得到保证。升号属于几十年才可能有的事情(也许接下来几十年都不会再升号),这属于极少变化的属性。虽然升级时带来了麻
烦,可是否不用身份证作为主键的升级就不麻烦了吗?其实无论选择什么属性作为主键,升级的工作量都是相当的。
最后,我举一个例子,说明选择业务有意义的属性作为主键的好处。
比如气象信息数据,有两张表:
一
张是记录世界所有观测站信息的表StationInfo(简称SI),SI(stationcode(pk),stationname,经度,维
度...)。里面的站号是规定好的,基本上不会变化,但有可能会撤销某站号或增加某站号,这里选择了stationcode这个业务有意义的属性作为主
键。
另一张是记录所有气象站点观测气象要素的表StationRecord(简SR),SR(id(pk),
stationcode(fk),temp,humidity,wind,time,...)。所有站点插入这张表时,只插入站号和该站的气象要素,其他什么站名,经纬度均不知道。
两表的关系如图一:
![](http://images.cnblogs.com/cnblogs_com/petitlen/abc.png)
图一
试想,如果按照“主键应对用户无意义的原则”来设计主键,那么表SI中FStationCode就不能作为主键了,需要增加一个自增字段作为主键,这样一来,表SR中使用什么作为外键和表SI相连?
总
结:对于设计,没有真正的银弹,有些设计方法适合这样的应用,有些适合其他的应用,像“主键应对用户无意义”这种设计方法是适合部分应用的,但同时却不适
合某些应用。所以无论从权威书籍还是实际应用,都告诉我们“主键应对用户无意义的原则”根本算不上一种原则,如果迷信这种原则,对数据库设计会带来弊端。
对于甲方,数据就是命根子,使用业务主键,数据的完整性,关联性清楚明了,上层业务系统怎么改数据都不会乱,但可能工作量大些(相对)。
对于乙方,总是希望工作量越小越好,所以一般选择逻辑主键,也不管你企业的数据存储空间如何,不管你数据今后好不好升级,不管有没有垃圾数据,只要保证在我的维护期内能搞定即可。
但请注意,在数据大批量修改时,使用业务主键 工作量会大些,但约束使你不会出错;使用逻辑主键,貌似工作量小,但必须很小心,万一出错了,可能数据就会大面积错乱,也许无法弥补。
本文的意思并不是说所有主键都应该使用业务主键,但我同样反对所有表都使用逻辑主键,也就是反对“主键应该业务无意义的原则”,因为这不是原则,是需要根据实际应用来考虑的。
我的观点是:
大多数增长型和变更型表应该使用逻辑主键,比如例子中的SR表。
大多数基准型表应该使用业务主键,比如例子中的SI表。
当然,实际问题还需实际分析。
相关文章推荐
- 关于数据库表应该采用逻辑主键还是业务主键的讨论
- 逻辑主键还是业务主键?
- 业务主键、逻辑主键的选择
- 数据库主键不应该具有任何业务意义
- 关于业务主键和逻辑主键
- 开发一个业务逻辑复杂的系统,应该怎么样设计才能使项目的扩展性更好
- MSSQL - 逻辑主键、业务主键和复合主键
- React 还是 Vue: 你应该选择哪一个Web前端框架?NG就暂时NG了吧
- 业务层应该返回DataSet/DataTable,还是对象/对象集合?
- 笔记:oracle关于使用代理主键还是逻辑主键的好?
- 大龄程序员的发展方向应该根据自己的实际情况选择做管理还是技术
- 你应该选择哪一个Web前端框架?,选Vue还是React?
- 业务逻辑>表现层>列表控件 数据选择>手动绑定到数据源
- 艾伟_转载:[一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理
- 技术人员究竟应该选择大公司还是小公司
- 零基础应该选择学习 java、php、前端 还是 python?
- [No000053]我25岁了,是应该继续挣钱,还是选择自己的爱好?--正好庆祝自己25岁生日
- 业务逻辑实现方式选择
- 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
- (转)张颖:创业应该选择群殴还是选择单干 (转)