学习目标
-
了解三范式的要求
1. 什么是范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
实际上家用电器都有节能标识,同时也会根据耗能不同进行等级的划分, 同样的数据库实际上也有这么个 ”节能标识 ” ,那就是范式.
2. 范式的划分
根据数据库冗余的大小,目前关系型数据库有六种范式,各种范式呈递次规范,越高的范式数据库冗余越小。
-
第一范式(1NF)
-
第二范式(2NF)
-
第三范式(3NF)
-
巴斯-科德范式(BCNF)
-
第四范式 ( 4NF)
-
第五范式(5NF,又称完美范式)
一般遵循前三种范式即可
3. 一范式
第一范式(1NF): 强调的是字段的原子性,即一个字段不能够再分成其他几个字段。
上图这种表结构设计就没有达到 1NF,要符合 1NF 我们只需把字段拆分,即:把 contact 字段拆分成 name 、tel、addr 等字段。
4. 二范式
第二范式(2NF): 满足 1NF的基础上,另外包含两部分内容
-
一是表必须有一个主键
-
二是非主键字段必须完全依赖于主键,而不能只依赖于主键的一部分
思考:
OrderDetail表的主键是什么?
主键的定义:能够确定唯一一行记录的特殊字段 主键可以是多个字段共同组成
在这里这里主键是由OrderID和ProductID共同组成, 只有通过OrderID和ProductID两个字段才可以确定唯一一行记录, 所以他们共同组成主键.
注意:
同时 UnitPrice 和 ProductName 这里两个字段 与ProductID的从属关系强于他们同OrderID的从属关系, 也就是说非主键字段 UnitPrice 和 ProductName 没有完全依赖于主键,而只依赖于主键的一部分, 这是不符合二范式要求的
上图的表才是符合二范式要求的表格
5. 三范式
第三范式(3NF): 满足 2NF, 另外非主键字段必须直接依赖于主键,不能存在传递依赖, 即不能存在:非主键字段 A 依赖于非主键字段 B,非主键字段 B 依赖于主键的情况
观察上图, 因为 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键字段都完全依赖于主键(OrderID),所以符合 2NF。
不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
把【Order】表拆分为【Order】(OrderID,OrderDate,CustomerID)和
【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
总结:
范式:
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,
各种范式呈递次规范,越高的范式数据库冗余越小。
三范式:
-
第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。
-
第二范式(2NF): 满足 1NF,另外包含两部分内容,
-
一是表必须有一个主键;
-
二是非主键字段 必须完全依赖于主键,而不能只依赖于主键的一部分。
-
第三范式(3NF): 满足 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。