数据库设计往往需要遵循一定的规则来设计,此规则就是“范式”,本文主要介绍下范式
第一范式(1NF)
1、 数组的每个属性只能包含一个值
2、 关系中的每个数组必须包含相同数量的值
3、 关系中的每个数组一定不能相同。
示例:
学号 |
姓名 |
年龄 |
001 |
王二 |
20 |
002 |
张三 |
22 |
003 |
李四 |
21 |
004,005 |
赵五,宋六 |
22,23 |
修改后:
学号 |
姓名 |
年龄 |
001 |
王二 |
20 |
002 |
张三 |
22 |
003 |
李四 |
21 |
004 |
赵五 |
22 |
005 |
宋六 |
23 |
第二范式(2NF)
1、 满足1NF
2、 非主属性非部分依赖于主关键字
示例:
学号 |
姓名 |
年龄 |
课程名称 |
成绩 |
学分 |
001 |
王二 |
20 |
数学 |
60 |
3 |
002 |
张三 |
22 |
英语 |
70 |
4 |
由于上表中:(学号+课程名称)---à(姓名,年龄,成绩,学分),即存在组合关键字中的字段决定非关键字的情况
因此将导致以下情况产生:
a) 数据冗余
如果有100个学生同时选择“数学课”,则“学分”将重复99次。
如果有1个学生同时选择了“数学、英语“两门课,则姓名,年龄重复了1次。
b) 更新异常
如果调整了“数学”课的学分,则所有选了“数学”课的学生的学分都将进行更新。
c) 插入异常
假设此时要开设一门新课,此时尚未有学生进行选择,由于缺少“学号”,导致该新增课程插入异常。
d) 删除异常
如果要删除已经完成该课程的学生信息,则此时课程名称和学分信息也被一起删除,这将导致“插入异常”
修改后的表为:
学号 |
姓名 |
年龄 |
|
|
|
课程名称 |
学分 |
|
|
学号 |
课程名称 |
成绩 |
|
|
|
第三范式(3NF)
1、 满足2NF
2、 属性不依赖于其他非主属性
示例:
学号 |
姓名 |
年龄 |
所属学院 |
学院地址 |
学院电话 |
|
|
|
|
|
|
由于上表中:学号--à(姓名,年龄,所属学院,学院地址,学院电话),而学号--à所属学院---à(学院地址,学院电话),不符合属性不依赖于其他非主属性。
因此将导致以下问题产生:
a) 数据冗余
b) 更新异常
c) 插入异常
d) 删除异常
修改后:
学号 |
姓名 |
年龄 |
所属学院 |
|
|
|
|
所属学院 |
学院地址 |
学院电话 |
|
|
|
鲍依斯-科得范式(BCNF)
1、 满足第三范式
2、 数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖
示例:(其中一个仓库只有一个管理员)
仓库ID |
管理员ID |
存储物品ID |
数量 |
|
|
|
|
由于上表中:(仓库ID,存储物品ID)--à(管理员ID,数量),(管理员ID,存储物品ID)--à(仓库ID,数量),即存在关键字决定关键字的情况
因此将导致如下问题产生:
a) 删除异常
当删除存储物品ID信息时,仓库ID和管理员ID信息都被删除
b) 插入异常
当仓库没有存储物品十,无法给仓库分配管理员
c) 更新异常
当仓库换了管理员之后,则表中所有管理员ID都要进行修改
修改后:
仓库ID |
存储物品ID |
数量 |
|
|
|
仓库ID |
管理员ID |
|
|
第四范式(4NF)
1、 满足BCNF
2、 禁止主键列和非主键列之间存在独立的一对多关系
示例:
部门名称 |
部门财产 |
负责人 |
销售部 |
奔驰 |
张三 |
销售部 |
大众 |
|
服务部 |
宝马 |
李四 |
服务部 |
|
王二 |
由于上表空白区域可能有:一对多,多对一的关系,既主键列和非主键列之间存在一对多关系
因此将导致行中产生空白,比如某一车子无人负责,某人不负责任何车子。
修改后:
负责人 |
部门编号 |
张三 |
101 |
李四 |
102 |
王二 |
102 |
部门名称 |
部门编号 |
销售部 |
101 |
服务部 |
102 |
部门财产 |
部门编号 |
奔驰 |
101 |
大众 |
101 |
宝马 |
102 |
结论
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常,因此在我们设计数据库的时候,一定要时刻考虑范式的要求。