范式化的优点
- 减少数据的冗余
- 数据表的字段是通过关系来连接的、每一张小表的字段和少、更新查找快
范式化的缺点
- 查询需要进行连表查询、导致性能降低
- 索引更难进行优化
范式一
任何一张表都应该由主键、并且其他的字段具有原子性(不可再分)
例如一个完整的地址、是可以将它分为多个字段
address |
---|
xx省xx市xx县 |
可以分为
province | city | county |
---|---|---|
xx省 | xx市 | xx县 |
范式二
建立在第一范式的基础之上、所有非主键字段必须都依赖主键、不应该产生部分依赖
s_id(primary key) | s_name | course_id(选修课程Id) | course_name(选修课程名称) | course_scor(该选修课得分) |
---|---|---|---|---|
20172502xx | 张三 | 5 | 创新创业与实践 | 66 |
这里 course_name(选修课程名称) 和 course_scor(该选修课得分) 依赖的是 course_id(选修课程Id) 而不是 s_id
产生了部分依赖, 而且是学生选课和一个课程被多个学生选择是多对多的关系,为降低冗余性应设计三张表(一张学生表、一张课程表、一张学生选课与被选课程的关系表)
学生表
s_id(primary key) | s_name |
---|---|
20172502xx | 张三 |
课程表
course_id(选修课程Id) | course_name(选修课程名称) |
---|---|
5 | 创新创业与实践 |
对应关系表
s_c_id | course_id(选修课程Id) | course_scor(该选修课得分) |
---|---|---|
1 | 5 | 默认为null |
范式三
建立在第二范式的基础之上、所有非主键字段必须都直接依赖主键、不能产生传递依赖
s_id | s_name | c_class_name(班级名称) | c_class_id(班级id) |
---|---|---|---|
1 | 张三 | 3年级8班 | 308 |
依赖关系如上 班级名称通过学生的班级id间接的依赖主键(s_id)