1.数据库的6种常用设计范式
- 第一范式
- 第二范式
- 第三范式
- bc范式
- 第四范式
- 第五范式
通常只使用前 3 种设计范式
2.第一范式:表中的所有字段都是不可分割的原子值
(主要是解决数据查询问题)
学生表
name | address |
张三 | xxx省xxx市xxx县xxx镇xxx村xxx号 |
这里的地址,可能包括省,市,等等,这样就不符合第一范式
实际问题举例:找出某个学生的省份,无法实现。
若分割成:姓名,省,市,县,镇,村, 号。(假设不可再分)
修改后的信息表
name | 省 | 市 | 县 | 村 | 号 |
张三 | xxx | xxx | xxx | xxx | xxx |
每个列的字段,都是不可再分的,这就符合第一范式
3.第二范式:第一范式基础上,非码属性必须完全依赖于候选码
(主要是消除冗余问题)
学生表
学号 | 姓名 | 系名 | 系主任 | 课程名称 | 分数 |
10001 | 张三 | 经济系 | 系主任1 | 高等数学 | 77 |
10002 | 李四 | 法律系 | 系主任2 | 大学英语 | 88 |
这里的候选码是,学号+课程名称,因为这两个可以确定其他所有的字段信息
但,这里的姓名部分依赖于学号,而系名部分依赖于课程名称,系主任依赖于系名
实际问题举例:一个学生有多个课,但每次都得写上姓名,系名,系主任
拆分后的表一:选课表
学号 | 课程名称 | 分数 |
10001 | 高等数学 | 77 |
10002 | 大学英语 | 88 |
拆分后的表二:学生表
学号 | 姓名 | 系名 | 系主任 |
10001 | 张三 | 经济系 | 系主任1 |
10002 | 李四 | 法律系 | 系主任2 |
经过拆分成 2 张表,消除了非主属性对码的部分依赖,这就符合第二范式
4.第三范式:在第二范式基础上,任何非主属性不依赖于其他非主属性
(主要是消除插入,删除问题)
对第二范式拆分的学生表,系名依赖于学号,系主任依赖于系名,构成传递依赖
实际问题举例:没有学生无法添加一个系,学生毕业系也被删除了
二范式的学生表拆分一:学生表
学号 | 姓名 | 系名 |
10001 | 张三 | 经济系 |
10002 | 李四 | 法律系 |
二范式的学生表拆分二:系表
系名 | 系主任 |
经济系 | 系主任1 |
法律系 | 系主任2 |
通过对学生表的拆分,消除了非主属性对码的传递依赖,这就是第三范式