**
数据库的三范式设计
**
1、每个属性都是原子项,不可分割
2、非主属性压完全依赖于主键
3、非主属性直接依赖于主键,即非主属性间不存在依赖关系
一、数据库的三范式设计
1、每个属性都是原子项,不可分割
原子不可分割性指在化学反应层面,在物理层面还是可以分割的,这里就不予深究了。
或者说每个字段不能是一个集合,只能是单独的一个基本属性
需求:现在要统计省和市
如果需求知道那个省那个市并按其分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。
2、非主属性压完全依赖于主键
例如(学生选课表):
这里通过(学生,课程)可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)作为主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式。
修改后,选课表:
课程表
所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。
3、非主属性直接依赖于主键,即非主属性间不存在依赖关系
简单的说,第三范式要满足以下的条件:首先要满足第二范式,其次非主属性之间不存在函数依赖。由于满足了第二范式,表示每个非主属性都函数依赖于主键。如果非主属性之间存在了函数依赖,就会存在传递依赖,这样就不满足第三范式。
上例中修改后的选课表中,一个教师能确定一个教师职称。这样,教师依赖于(学生,课程),而教师职称又依赖于教师,这叫传递依赖。第三范式就是要消除传递依赖。
修改后,选课表:
教师表:
这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就可以了。
简单的说,
第一范式就是原子性,字段不可再分割;
第二范式就是完全依赖,没有部分依赖;
第三范式就是没有传递依赖
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。