范式概念
在关系型数据库中,设计数据库时要考虑遵循一定的规则,这种规则就是范式。
实际上,数据库一共有六种范式,但一般设计数据库的时候,只需要遵守到3NF(第三范式)即可。
1NF 2NF 3NF BCNF 4NF 5NF
第一范式 1NF
第一范式主要强调原子性,即数据库的每一列都是一个不可再分割的基本数据项。
例:下表不满足第一范式
学号 | 姓名 | 家庭电话及住址 |
---|---|---|
23333 | 马猴烧酒 | 166 xxxx xxxx,唐辛子星 |
修改后即可满足第一范式
学号 | 姓名 | 家庭电话 | 住址 |
---|---|---|---|
23333 | 马猴烧酒 | 166 xxxx xxxx | 唐辛子星 |
第二范式 2NF
第二范式主要强调唯一性,即数据表中每行都必须可以被唯一地区分,主要是为了防止数据重复,通常是使用一个主键来唯一标识一条记录。
满足第二范式就肯定满足第一范式。
- 完全依赖、部分依赖:
因为主键可以由多列共同组成,
当且仅当该行数据由主键中所有列共同确定时,我们说这条数据完全依赖于主键。
当该行数据仅需要主键中的部分列即可确定时,我们说这条数据部分依赖于主键。
例:完全依赖
学号(主键) | 科目(主键) | 分数 |
---|---|---|
23333 | 数学 | 99 |
分数完全依赖于学号和科目,二者缺一不可。
例:部分依赖
学号(主键) | 姓名(主键) | 科目(主键) | 分数 |
---|---|---|---|
23333 | 张三 | 数据库原理及应用 | 88 |
分数部分依赖于上述三个主键,原因:学号就可以确定出某位学生的姓名,分数依赖于科目和(学号或姓名)在没有重名的情况下。
第三范式 3NF
非主属性之间不能相互依赖,必须直接依赖候选关键字。
例:下表不满足第三范式
学号(主键) | 姓名 | 班级 | 学生电话 | 班主任姓名 | 班主任电话 |
---|---|---|---|---|---|
23333 | 张三 | 985211 | 168 xxxx xxxx | 李四 | 189 xxxx xxxx |
23334 | 王五 | 985211 | 199 xxxx xxxx | 李四 | 189 xxxx xxxx |
班主任的姓名、班主任的电话跟主键学号没有直接的关系,只有间接的关系(可以通过学生的班级了解到班主任的姓名电话)。故该表的非主属性班主任姓名、班主任电话依赖该表的非主属性班级,且间接依赖关键字学号。
修改后满足第三范式:
学号(主键) | 姓名 | 班级 | 学生电话 |
---|---|---|---|
23333 | 张三 | 985211 | 168 xxxx xxxx |
23334 | 王五 | 985211 | 199 xxxx xxxx |
班级 | 班主任姓名 | 班主任电话 |
---|---|---|
985211 | 李四 | 189 xxxx xxxx |
- 直接依赖、传递依赖(函数依赖、间接依赖):
a依赖b,b依赖c,则a肯定依赖c,这就是传递依赖。
例:
学号 | 姓名 | 班级 | 班主任姓名 |
---|---|---|---|
23333 | 张三 | 985211 | 李四 |
班主任姓名依赖于班级,班级依赖于学号,所以班主任姓名传递依赖学号,直接依赖班级。