MySQL设计三范式
MySQL设计三范式是关系型数据库设计中的基本规范,旨在减少数据冗余,确保数据的一致性和完整性。
三范式包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF),它们之间具有递进关系,每一范式都是在前一范式的基础上进一步规范化的结果。
第一范式(1NF)
第一范式要求表中的每个字段都是原子性的,即字段中的值不可再分。例如,如果一个字段包含了多个值(如电话号码包含多个数字),则需要将这个字段拆分成多个字段。第一范式的目的是消除重复的数据,确保数据的原子性。通过满足第一范式,可以减少数据冗余,提高数据的存储效率。
例如:有如下一张学生表
学生id | 学生姓名 | 电话 |
1 | 张三 | 123456,123135 |
这个设计违背了第一范式,因为电话号码字段存储了多个值。需要将其拆分成多行:
学生id | 学生姓名 | 电话 |
1 | 张三 | 123456 |
1 | 张三 | 123135 |
第二范式(2NF)
第二范式建立在第一范式的基础上,要求表中的非主键字段必须完全依赖于主键,而不是部分依赖。这意味着如果主键是由多个字段组成的复合主键,那么表中的每个非主键字段都必须依赖于这个复合主键的每一个部分。违反第二范式的常见情况是某些字段仅依赖于主键的一部分,这会导致数据冗余和更新异常。通过满足第二范式,可以进一步减少数据冗余,确保数据的完整性。
例如:有如下一张成绩表
学生id | 课程id | 学生姓名 | 课程名称 | 成绩 |
1 | 100 | 张三 | 语文 | 90 |
1 | 101 | 张三 | 数学 | 99 |
这个设计违背了第二范式,在这个表中,学生姓名依赖于学生ID,课程名称依赖于课程ID。由于学生ID和课程ID组成了复合主键,学生姓名和课程名称是对主键部分依赖的。需要将表拆分为三个表:
学生表
学生id | 学生姓名 |
1 | 张三 |
课程表
课程id | 课程名称 |
100 | 语文 |
101 | 数学 |
成绩表
学生id | 课程id | 成绩 |
1 | 100 | 90 |
1 | 101 | 99 |
第三范式(3NF)
第三范式建立在第二范式的基础上,要求表中的非主键字段之间不能存在传递依赖关系。即非主键字段不能依赖于另一个非主键字段,而这个非主键字段又依赖于主键。违反第三范式的常见情况是某些字段通过其他字段间接依赖于主键,这会导致数据更新时出现异常。通过满足第三范式,可以进一步减少数据冗余和更新异常,确保数据的准确性。
例如:有如下一张员工表
员工id | 员工姓名 | 部门id | 部门名称 |
1 | 张三 | D1 | 运维部门 |
1 | 李四 | C2 | 财务部门 |
这个设计违背了第三范式,在这个表中,部门名称依赖于部门ID,而部门ID依赖于员工ID(主键)。这种依赖是传递的。需要将表再拆分:
员工表
员工id | 员工姓名 | 部门id |
1 | 张三 | D1 |
1 | 李四 | C2 |
部门表
部门id | 部门名称 |
D1 | 运维部门 |
C2 | 财务部门 |