一、关系型数据库设计范式
范式:Normal Format,符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度
-
范式是离散数学里的概念
-
范式目标是在满足组织和存储的前提下使数据结构冗余最小化
-
范式级别越高,表的级别就越标准
-
目前数据库应用到的范式有以下几层
-
第一范式:1NF
-
第二范式:2NF
-
第三范式:3NF
-
逆规范化
-
示例
1、一张员工表
工号 |
姓名 |
部门 |
入职时间 |
0001 |
杨戬 |
武装部 |
0001-01-01 |
0002 |
李白 |
书院部 |
1500-12-12 |
2、每个员工都是与部门挂钩的,但是部门不可能很多,所以上述表中会有很多数据重复,此时应该将部门单独维护出来,减少数据冗余
部门编号 |
部门名称 |
1 |
武装部 |
2 |
书院部 |
工号 |
姓名 |
部门编号 |
入职时间 |
0001 |
杨戬 |
1 |
0001-01-01 |
0002 |
李白 |
2 |
1500-12-12 |
N个1和N个武装部占用的磁盘空间肯定是不一样的
小结
1、范式是一种数学理论,在关系型数据库上用来减少数据冗余
2、满足的范式越多,越符合高标准表设计
3、范式一共有6层,但是数据库的设计通常只要求满足3层即可
1、第一范式1NF
目标:了解第一范式的原理,掌握第一范式的实际应用
概念
第一范式:1NF,数据字段设计时必须满足原子性
-
1NF要求字段数据是不需要拆分就可以直接应用
-
如果数据使用的时候需要进行拆分那么就违背1NF
步骤
1、设计的字段是否在使用的时候还需要再拆分?
2、将数据拆分到最小单位(使用),然后设计成字段
3、满足1NF
示例
1、设计一张学生选修课成绩表
学生 |
性别 |
课程 |
教室 |
成绩 |
学习时间 |
张三 |
男 |
PHP |
101 |
100 |
2月1日,2月28日 |
李四 |
女 |
Java |
102 |
90 |
3月1日,3月31日 |
张三 |
男 |
Java |
102 |
95 |
3月1日,3月31日 |
当前表的学习时间在使用的时候肯定是基于开始时间和结束时间的,而这种设计就会存在使用时的数据拆分,不满足原子性也就是1NF
2、满足1NF的设计:字段颗粒度应用层最小(不需要拆分)
学生 |
性别 |
课程 |
教室 |
成绩 |
开始时间 |
结束时间 |
张三 |
男 |
PHP |
101 |
100 |
2月1日 |
2月28日 |
李四 |
女 |
Java |
102 |
90 |
3月1日 |
3月31日 |
张三 |
男 |
Java |
102 |
95 |
3月1日 |
3月31日 |
小结
1、1NF就是要字段数据颗粒度最小,保证数据取出来使用的时候不用再拆分
2、1NF是满足数据表设计的最基础规范
2、第二范式2NF
目标:了解第二范式的原理,掌握第二范式的实际应用
概念:
第二范式:2NF,字段设计不能存在部分依赖
-
部分依赖:首先表存在复合主键,其次有的字段不是依赖整个主键,而只是依赖主键中的一部分
-
部分依赖解决:让所有非主属性都依赖一个候选关键字
-
最简单方式:取消复合主键(一般选用逻辑主键替代,但是本质依然是复合主键做主&#x
-