为什么数据表中都要添加一个业务无关的ID字段
2013-04-19 20:37
447 查看
这个问题当时真的不知道怎么回答,只是说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条业务。
因此,工号虽然在库表中唯一,但是他违背了“所有主键标实体都是惟一的”这一完整性要求,因此,不能将工号作为主键。
1. 实体完整性
1.1 要求:所有主键标实体都是惟一的,而且主键标的任何部分不可以是空值;
1.2 目的:保证每一个实体会有惟一的标识,并且确保外键标值可以正确的引用主键标值;
1.3 示例:没有发票可以具有重复的编号,也不可以是空值。总之,所有发票由它们的发票编号惟一的标识。
用户发难:人员表中工号是唯一的,为什么不用工号作为主键?
回答:分析了需求后,发现,人员表中工号存在“回收复用”的情况。比如,局长的工号永远都是00001,今年是李局长,明年李局长升迁了、退休了,张局长赴任,工号还是00001。如果用工号作为主键,那么子表引用人员表工号字段,就会出现以下情况:
1、2008年工号为00001的用户操作了100条业务,该工号00001代表李局长;
2、2009年工号为00001的用户操作了80条业务,该工号00001代表张局长。
最后统计工号为00001的用户一共操作了多少业务的时候,会得到工号为00001的张局长操作了180条业务。
因此,工号虽然在库表中唯一,但是他违背了“所有主键标实体都是惟一的”这一完整性要求,因此,不能将工号作为主键。
相关文章推荐
- 为一个有数据没有主键id的数据表添加主键字段
- ASP.NET MVC3 快速入门-第七节 在Movie(电影)模型与数据表中添加一个字段(转)
- SqlServer FOR XML PATH 将查询的每一行数据添加到一个字段中
- 原因分析如下: 遇到这种情况,很有可能是把一个int型业务数据的 设置setText()或者类似的方法中, 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所
- oracle对没有主键表的新增主键修改表数据操作(没有主键字段,则新增一个主键字段,然后赋值,然后再添加主键)
- 数据表中有字段ID,fatherID即可存储一个树,下面说说如何遍历这个树
- 向数据报表添加一个合计字段
- 业务需求:一张数据表中有自增字段,插入一条数据以后返回自增的ID值
- Mysql InnoDB为什么要添加跟业务无关的自增主键
- SQL 在已有很多数据的表中添加一个必填字段的方法,且不影响正常删除字段的方法
- 有2个表,结构相似,有一个字段关联,现在怎么把A表的数据添加到B表中,条件是A表不在B表的数据?? 请各位高手多多指点,是oracle的数据库
- 菜单分类多维数组中.每个数组添加一个id字段.可使用引用
- HTTTP协议头中,添加某一个字段,获取返回数据中头信息的某一个字段。
- 数据表中有字段ID,fatherID即可存储一个树,下面说说如何遍历这个树
- Mysql InnoDB为什么要添加跟业务无关的自增主键
- ASP.NET MVC3 快速入门-第七节 在Movie(电影)模型与数据表中添加一个字段
- 在数据表中添加一个字段的SQL语句怎么写
- 为一个有数据没有主键id的数据表添加主键字段
- 如何给已经有数据的表添加一个新的ID