第一范式(1NF)
一个字段只存储一项信息
第二范式(2NF)
任意一个字段都只依赖表中的同一个字段。(涉及到表的拆分)
例如:学生选课表
学号 | 课程 | 成绩 | 课程学分 |
---|
10001 | 数学 | 100 | 6 |
10001 | 语文 | 90 | 2 |
10001 | 英语 | 85 | 3 |
10002 | 数学 | 90 | 6 |
10003 | 数学 | 99 | 6 |
10004 | 语文 | 89 | 2 |
表中成绩、课程学分依赖学号和课程,课程学分还依赖课程,这就不满足第二范式,需要拆表:
学号 | 课程 | 成绩 |
---|
10001 | 数学 | 100 |
10001 | 语文 | 90 |
10001 | 英语 | 85 |
10002 | 数学 | 90 |
10003 | 数学 | 99 |
10004 | 语文 | 89 |
第三范式(3NF)
表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)
如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。 通俗解释就是一张表最多只存两层同类型信息。
商品名称 | 价格 | 重量 | 有效期 | 分类 | 分类描述 |
---|
可乐 | 6.00 | 500g | 2020.6 | 酒水饮料 | 碳酸饮料 |
香蕉 | 8.00 | 600g | 2020.7 | 生鲜食品 | 水果 |
首先这个是不满足第二范式,先拆成满足第二范式:
商品id | 商品名称 | 价格 | 重量 | 有效期 |
---|
1 | 可乐 | 6.00 | 500g | 2020.6 |
2 | 香蕉 | 8.00 | 600g | 2020.7 |
分类id | 分类 | 分类描述 |
---|
1 | 酒水饮料 | 碳酸饮料 |
2 | 生鲜食品 | 水果 |
这样的话就是满足了第二范式的前提下,也满足了第三范式,因为 表中的每一列都要与该表主键直接相关,而不是间接相关
第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表,第三范式是要求已经分好了多张表的话,一张表中只能有另一张标的ID,而不能有其他任何信息,(其他任何信息,一律用主键在另一张表中查询)。
扩展:反三范式
没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,提高读性能,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,减少了查询时的关联,提高查询效率,因为在数据库的操作中查询的比例要远远大于DML的比例。但是反范式化一定要适度,并且在原本已满足三范式的基础上再做调整的。