有一次用户问我为什么数据表中都要添加一个业务无关的ID字段

这个问题当时真的不知道怎么回答,只是说Hibernate框架就是这么要求的。后来翻了上学时候的书《数据库系统设计 实现与管理》(第六版)第73页3.3节“表3-4 完整性规则”中要求:
1. 实体完整性
1.1 要求:所有主键标实体都是惟一的,而且主键标的任何部分不可以是空值;
1.2 目的:保证每一个实体会有惟一的标识,并且确保外键标值可以正确的引用主键标值;
1.3 示例:没有发票可以具有重复的编号,也不可以是空值。总之,所有发票由它们的发票编号惟一的标识。

用户发难:人员表中工号是唯一的,为什么不用工号作为主键?
回答:分析了需求后,发现,人员表中工号存在“回收复用”的情况。比如,局长的工号永远都是00001,今年是李局长,明年李局长升迁了、退休了,张局长赴任,工号还是00001。如果用工号作为主键,那么子表引用人员表工号字段,就会出现以下情况:

1、2008年工号为00001的用户操作了100条业务,该工号00001代表李局长;
2、2009年工号为00001的用户操作了80条业务,该工号00001代表张局长。

最后统计工号为00001的用户一共操作了多少业务的时候,会得到工号为00001的张局长操作了180条业务。

因此,工号虽然在库表中唯一,但是他违背了“所有主键标实体都是惟一的”这一完整性要求,因此,不能将工号作为主键。

posted on 2009-10-21 10:55 Rick Qin 阅读(542) 评论(0)  编辑  收藏 所属分类: DB


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

留言簿(2)

随笔分类(3)

随笔档案(6)

文章分类

文章档案(3)

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜