MySQL范式

范式背景:
1、是为了解决数据冗余
2、是为了数据的优化与存储
3、保存数据之后,可以通过关系得到的数据,不再存储

范式概念:
1、是一种分层结构的规范,分为6层
2、每一层都比上一层更严格
3、若要满足下一层范式,前提是满足上一层
4、范式在数据库中具有指导意义,但是不强制规范
5、数据库不仅要考虑空间问题,还要考虑效率问题,一般用前第三层
6、六层范式: 1NF,2NF,3NF…6NF, 1NF是最底层,要求最低;6NF最高层,最严格.

1NF(第一范式):
1、在设计表存储数据时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么表的设计不满足第一范式
2、第一范式要求字段具有原子性、不可再分割
例如:
讲师代课表
讲师 性别 班级 教室 代课时间 代课时间(开始,结束)
朱元璋 Male php0226 D302 30天 2014-02-27,2014-05-05
朱元璋 Male php0320 B206 30天 2014-03-21,2014-05-30
花木兰 Female php0320 B206 15天 2014-06-01,2014-06-20

上表设计不存在问题: 但是如果需求是将数据查出来之后,要求显示一个老师从什么时候开始上课,到什么时候节课: 需要将代课时间进行拆分: 不符合1NF, 数据不具有原子性, 可以再拆分.

解决方案: 将代课时间拆分成两个字段就解决问题.
讲师 性别 班级 教室 代课时间 开始 结束
朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
朱元璋 Male php0320 B206 30天 2014-03-21 2014-05-30
花木兰 Female php0320 B206 15天 2014-06-01 2014-06-20

2NF(第二范式):
1、在数据表设计过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依赖于主键中的某个字段(主键的部分)
2、存在字段依赖主键的部分的问题,称之为部分依赖
3、第二范式就是解决表设计不允许出现部分依赖

讲师带课表
讲师 性别 班级 教室 代课时间 开始 结束
朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
朱元璋 Male php0320 B206 30天 2014-03-21 2014-05-30
花木兰 Female php0320 B206 15天 2014-06-01 2014-06-20

以上表中: 因为讲师没有办法作为独立主键, 需要结合班级才能作为主键(复合主键: 一个老师在一个班永远只带一个阶段的课): 代课时间,开始和结束字段都与当前的代课主键(讲师和班级): 但是性别并不依赖班级, 教室不依赖讲师: 性别只依赖讲师, 教室只依赖班级: 出现了性别和教室依赖主键中的一部分: 部分依赖.不符合第二范式.

解决方案1: 可以将性别与讲师单独成表, 班级与教室也单独成表.
解决方案2: 取消复合主键, 使用逻辑主键

讲师带课表
ID 讲师 性别 班级 教室 代课时间 开始 结束
1 朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
2 朱元璋 Male php0320 B206 30天 2014-03-21 2014-05-30
3 花木兰 Female php0320 B206 15天 2014-06-01 2014-06-20

3NF(第三范式):
1、要满足第三范式、必须满足第二范式
2、理论上讲,应该一张表中的所有字段都应该直接依赖于主键(逻辑主键:代表的是业务主键),如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非关键字段依赖,最终实现依赖主键:把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖
3、第三范式就是解决传递依赖的问题

讲师带课表
ID 讲师 性别 班级 教室 代课时间 开始 结束
1 朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
2 朱元璋 Male php0320 B206 30天 2014-03-21 2014-05-30
3 花木兰 Female php0320 B206 15天 2014-06-01 2014-06-20
以上设计方案中: 性别依赖讲师存在, 讲师依赖主键; 教室依赖班级,班级依赖主键: 性别和教室都存在传递依赖.

解决方案: 将存在传递依赖的字段,以及依赖的字段本身单独取出,形成一个单独的表, 然后在需要对应的信息的时候, 使用对应的实体表的主键加进来.

讲师带课表
IDP 讲师ID 班级ID 代课时间 开始 结束
1 朱元璋 php0226 30天 2014-02-27 2014-05-05
2 朱元璋 php0320 30天 2014-03-21 2014-05-30
3 花木兰 php0320 15天 2014-06-01 2014-06-20

讲师表
ID 讲师 性别
1 朱元璋 Male
2 花木兰 Female
讲师表: ID = 讲师

班级表
ID 班级 教室
10 php0226 302
12 php0320 206
班级表中: ID = 班级

逆规范化:
有时候, 在设计表的时候,如果一张表中有几个字段是需要从另外的表中去获取信息. 理论上讲, 的确可以获取到想要的数据, 但是就是效率低一点. 会刻意的在某些表中,不去保存另外表的主键(逻辑主键), 而是直接保存想要的数据信息: 这样一来,在查询数据的时候, 一张表可以直接提供数据, 而不需要多表查询(效率低), 但是会导致数据冗余增加.

你可能感兴趣的:(Mysql)