为什么数据表中都要添加一个业务无关的ID字段
来源:互联网 发布:linux 脚本修改密码 编辑:程序博客网 时间:2024/06/05 05:09
这个问题当时真的不知道怎么回答,只是说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字段
- 为一个有数据没有主键id的数据表添加主键字段
- 业务需求:一张数据表中有自增字段,插入一条数据以后返回自增的ID值
- 数据表字段的删除或添加语句
- 一个与业务无关的java多线程实现方法
- OpenX数据表添加字段
- 删除数据表字段删除ID
- 无特殊需求下Innodb建议使用与业务无关的自增ID作为主键
- MySQL建立一个数据库中有多张表,每个表中都有id作为主键,为什么第一张表会报错?
- SQL语句添加数据表字段
- sql为数据表添加字段
- oracle中数据表字段的添加和移除
- SQL 数据表的创建 删除 添加字段 删除整表
- 数据表中有字段ID,fatherID即可存储一个树,下面说说如何遍历这个树
- 如何得到一个数据表的所有数字型字段???
- hibernate char 字段的数据表只查出一个字符 问题解决
- 替换mysql数据表中一个字段的部分值
- mysql删除数据表内容后id 自动递增字段不是从1开始的解决办法
- Android中用Java代码模拟鼠标指针(可显示于整个系统界面之上)
- hadoop LOG 学习
- log4j输出多个自定义日志文件,动态配置路径
- Flex blazeds channelset深度解析
- KMP 算法
- 为什么数据表中都要添加一个业务无关的ID字段
- 合并两个有序链表 递归和非递归的形式
- make_request
- path sumII
- request
- 面试笔试系列4-二维数组和指向指针的指针
- 关于C语言编程中include的用法
- 一个fork的面试题
- stay hungry,stay foolish(来自coolshell)