学习目标
- 能够判断一个表结构的设计是否符合三范式的要求
1、数据库设计之三范式的介绍
范式:对设计数据库提出的一些规范,目前有迹可循的共有8种范式,一般遵守三范式即可。
- 第一范式(1NF):强调的是列的原子性,即,列不能再分成其他列。
- 第二范式(2NF):满足1NF,另外包含两部分内容,一是表必须有一个主键:二是非主键字段必须完全依赖于主键,而不能只依赖主键的一部分
- 第三范式(2NF):满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况
2、第一范式的介绍
如下所示的表结构:
contact | name | Tel | address |
---|---|---|---|
张三、10086、河北 | 张三 | 10086 | 河北 |
说明:
- 这种表格设计就没有达到1NF,要符合1NF我们只需要把列拆分,即把contact字段拆分成name、Tel、address等字段
3、第二范式的介绍
如下所示的表结构:
OrderDetail表
OrderID | ProductID | UnitPrice | Discount | Quantity | ProductName |
---|---|---|---|---|---|
1001 | 7654 | 18.8 | 2.2 | 4 | 洗发水 |
拆分后的OrderDetail表
OrderID | ProductID | Discount | Quantity |
---|---|---|---|
1001 | 7654 | 2.2 | 4 |
Product表
ProductID | UnitPrice | ProductName |
---|---|---|
7654 | 18.8 | 洗发水 |
说明:
- 这种表结构设计就没有达到2NF,因为Discount(折扣),Quantity(数量)完全依赖于主键(OrderID),而UnitPrice(单价),ProductName(产品名称)只依赖于ProductID,所以OrderDetail表不符合2NF。
- 我们可以把OrderDetail表拆分为OrderDetail(OrderID、ProductID、Discount、Quantity)和Product(ProductID、UnitPrice 、ProductName),这样就符合第二范式了。
4、第三范式的介绍
如下所示的表结构:
Order表
OrderID | OrderDate | CustomerID | CustomerName | CustomerAddress | CustomerCity |
---|---|---|---|---|---|
1001 | 2023-02-03 00:00:00AM | 12345 | 张三 | xx市xx县xx镇xx村 | 河北 |
拆分后的Order表
OrderID | OrderDate | CustomerID |
---|---|---|
1001 | 2023-02-03 00:00:00AM | 12345 |
Customer表
CustomerID | CustomerName | CustomerAddress | CustomerCity |
---|---|---|---|
12345 | 张三 | xx市xx县xx镇xx村 | 河北 |
说明:
- 这种表结构设计没有达到3NF,因为OrderDate、 CustomerID、 CustomerName、 CustomerAddress、 CustomerCity等非主键列都完全依赖于主键(OrderID),所以符合2NF。由于CustomerName、 CustomerAddress、 CustomerCity直接依赖的是CustomerID(非主键列),而不是直接依赖于主键,通过传递才依赖于主键,所以不符合3NF。
- 我们可以把Order表拆分为Order(OrderID、 OrderDate、 CustomerID)和Customer(CustomerID、CustomerName、CustomerAddress、CustomerCity)从而达到3NF。
5、小结
- 范式就是设计数据库的一些通用规范
- 1NF强调字段是最小单元,不可再分
- 2NF强调在1NF基础上必须要有主键,非主键字段必须完全依赖于主键,而不能只依赖主键的一部分
- 3NF强调在2NF的基础上非主键字段必须直接依赖于主键,不能传递依赖(间接依赖)。