数据库的三大范式:
第一范式:
表中所有字段都是不可分割的原子值。只要字段值还可以继续拆分,就不满足第一范式。例如地址这个字段,如果写为XX省XX市XX区就不满足第一范式,因为这个字段可以继续拆分为字段省,字段市,字段区。在实际数据处理过程中,范式设计越详细,操作更加灵活。
如表1
学生信息表1
学生学号 | 学生姓名 | 性别 | 家庭住址 |
---|
其中家庭住址的范围较广,可以继续拆分为表2
学生信息表2
学生学号 | 学生姓名 | 性别 | 家庭住址(省) | 家庭住址(市) | 家庭住址(区) |
---|
这样在执行查询语句的时候,条件限制更为具体(当然,区往后还可以继续再分,根据实际要求看)。
第二范式:
在满足了第一范式的条件下,要求除了主键外的每一个列都必须完全依赖主键。例如表3
学生信息表3
学生姓名 | 学生性别 | 学生身份证号 | 紧急联系人 | 所属关系 | 职务 | 所在公司 |
---|
其中学生性别、学生身份证号、紧急联系人、所属关系都是依赖于学生本身的,而职务、所在公司与学生本身是没有依赖关系的,所以这张表应该分为两张表:
表4
学生信息表4
学生姓名 | 学生性别 | 学生身份证号 | 紧急联系人 | 所属关系 |
---|
表5
联系人信息表
紧急联系人 | 职务 | 所在公司 |
---|
第三范式:
必须先满足第二范式,并且除开主键列的其他列之间不能存在传递依赖关系。
这里的传递依赖用一个简单的例子说明:
如表6
学生信息表6
学生学号 | 系编号 | 系主任 |
---|
通过学生学号可以查询其所在的系编号,通过系编号可以查询到系主任,但是由系编号是决定不了具体的一个学生的,所以说系主任和学生学号之间存在传递依赖,换句话说系主任是依赖于系编号的,但是表中的学生学号才是主键,系主任却不能完全依赖于学生学号。所以要将系主任置于另一张以系编号为主键的信息表中。