关系型数据库范式分为1NF(第一范式)、2NF(第二范式)、3NF(第三范式)和BCNF(巴斯-科德范式)四个级别。几个范式均具备不同的优缺点,具体如何判断属于哪个范式则需从多个角度分析。
1.第一范式
第一范式是指在数据库表中,每个字段都是不可再分的,也就是说每个字段只能有一个值,不能再选择分成别的字段。例如,学生表字段包含:id、姓名、学号、专业、科目,其中“姓名”字段不能再分成“姓”和“名”两个字段。若存在多个值,需要将其拆分成多条记录。
2.第二范式
第二范式是在第一范式的基础上,每个非主关键字(非主键字段)都只依赖于主关键字,而不能依赖于非主关键字。例如,学生成绩表中包含字段:课程名称、学号、学期、教师姓名、教师所处院系。这个表不符合第二范式,因为“教师所处院系”字段依赖于“教师姓名”字段,而“教师姓名”不是主关键字。需要将其分解成两个表,一张表单独存储“课程名称、学号、学期”信息,另一张表存储“教师姓名、教师所处院系”信息,并以教师姓名作为关联字段。
3.第三范式
第三范式是在第二范式的基础上,每个字段都只依赖于主键,而不依赖于其他字段。例如,学生表中包含字段:学号、姓名、性别、入学年份、所处院系、专业、课程名称、成绩。这个表不符合第三范式,因为“课程名称、成绩”字段与主键“学号”并不直接相关。需要将其拆分成两个表,一个表存储“学号、姓名、性别、入学年份、所处院系、专业”,另一个表存储“学号、课程名称、成绩”。
4.BCNF范式
BCNF范式是在第三范式的基础上进一步的优化。在第三范式中,仍有可能出现某些数据更新异常的情况。例如,课程表中包含字段:课程编号、教师编号、教师姓名、教师所属院系、学期、学分。其中“教师姓名、教师所属院系”需要根据“教师编号”来进行更新。如果同时需要修改多条记录,且修改的教师编号不一样,就会出现数据更新异常。需要将其拆分成两张表,一张表存储“课程编号、教师编号、学期、学分”,另一张表存储“教师编号、教师姓名、教师所属院系”。
综上所述,几个范式的基本思想均为将数据进行规范化,以保证数据库“不重、不漏、森严有序”。在实际的数据库设计中,若数据满足第三范式,已经足够,不一定需要一定遵循BCNF范式,应根据实际情况进行判断和选择,以达到最优化的数据存储模式。