范式:
在关系型数据库中,数据库设计过程中所要遵守的规范,来优化数据数据存储方式
三大范式
- 经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式
- 第一范式(1NF):列不可拆分
- 第二范式(2NF):保证每条记录唯一标识
- 第三范式(3NF):引用主键(保证主键属性和非主键属性之间直接关联)
- 说明:后一个范式,都是在前一个范式的基础上建立的
第一范式
1、每一列属性都是不可再分的属性值,确保每一列的原子性
第二范式
一个实例或者行必须被唯一标识,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分
每一行的数据只能有一个主键(唯一标识)属性,每一个非主属性直接(不是部分)依赖于主键,根据主键能唯一的对应一条记录或一个对象。只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
比如: 学号 课程名称, 成绩, (学号,课程名称)两个主键来确定课程成绩,这就不满足第二范式
第三范式
一说:多张表中,引用关系的时候只能引用主键(Python就业班)
网上普遍说法:属性数据不能存在传递关系,即每个属性都跟主键有直接关系而不是通过其他非主键属性建立间接关系。或者说费主键属性之间没有之间关联,相互独立。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
非主属性都不传递依赖于该范式的候选键
如: 学生表中,属性有学生、所在学校地址、学校邮政编码或联系电话, 学校地址或联系电话是依赖学校存在在的,而不是依赖学生,他是通过 学生 --> 学校--> 学校地址来间接对应的。 可以把学校和学校地址对应关系单独拆成一张表。
如何看待范式:
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。
如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
参考: