数据库范式
简单学习一下数据库范式 例子中的主键是斜体
第一范式:
规则:有主键,主键不重复,主键不为空,键必须为不可分解项
如表 学号 姓名 学年班级 因为学年班级可以拆分,所以不符合第一范式 ,应该分解为 学号 姓名 学年 班级
1 AA C3G2 1 AA 2 3
第二范式:
规则:在第一范式的基础上,所有的非主键都必须依赖所有主键,不能只依赖部分(只有复合主键才会出现不符合第二范式的情况)
如表1 学生证编号 学生证办理时间 图书证编号 图书证办理时间
表2 学号 课程号 成绩 学分
在这张表中,两个编号作为联合主键,但是学生证办理时间只依赖与学生证编号,和图书证编号没有关系。应该分成学生证表和图书证表才可以
不满足第二范式可能出现很多问题
1.数据冗余 假如一个学生有1个学生证 20个图书证 那么学生证办理时间就会重复20次
2.插入异常 如果有个新来的学生,办理了学生证,但是还没有图书证,作为主键的图书证编号不能为空,就只能等他办理了图书证才能存入他的信息。
3.删除异常 如表2中例子,如果删除了学生信息(目的是删除学号和成绩),会连带删除课程和学分,如果没有其他人选这么课,那么这么课的信息会随着删除而丢失
第三范式:
规则:在第二范式的基础上,所有非主键不依赖于其他非主键
如表1 学生证编号 学生证办理时间 图书证编号 图书证办理时间
表2 工号 员工姓名 部门编号 部门名称 部门信息
表1中的图书证办理时间依赖于图书证编号,所以不符合第三范式
表2中的部门名称部门信息依赖于部门编号,所以不符合第三范式,应该分成员工表(工号 员工姓名 部门编号) 部门表(部门编号 部门名称 部门信息)
不满足第三范式同样存在问题,比如有一个新部门,有编号名称和描述,但是没有员工,就没有办法存入表中,同样删除员工时也会有部门信息遗失的问题
BCNF:
规则:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),
且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存
在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候
选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如
下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情
况:
1.删除异常:当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
2.插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。
3.更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:仓库管理:StorehouseManage(仓库ID, 管理员ID);仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
使用范式目地:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新
原则:遵从概念单一化 "一事一地"原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。
方法:将关系模式投影分解成两个或两个以上的关系模式。
要求:分解后的关系模式集合应当与原关系模式"等价",即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。

浙公网安备 33010602011771号