找回密码
 立即注册
搜索
热搜: 日历 老黄历
查看: 21|回复: 1

数据库第二范式和第三范式的区别的是什么?

[复制链接]

22

主题

0

回帖

84

积分

新手上路

Rank: 1

积分
84
发表于 2026-1-25 14:50:40 | 显示全部楼层 |阅读模式
回复

使用道具 举报

0

主题

1万

回帖

2万

积分

新手上路

Rank: 1

积分
27362
发表于 2026-1-25 16:24:55 | 显示全部楼层
第二范式【2NF】和第三范式【3NF】的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分。3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
第二范式【2NF】:首先是 1NF,另外包含两部分内容,一是表必须有一个主键。二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。考虑一个订单明细表OrderDetail其属性如下:               【OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName】。
因为我们知道在一个订单中可以订购多种产品,所以单单一个OrderID 是不足以成为主键的,主键应该是【OrderID,ProductID】。显而易见 Discount【折扣】,Quantity【数量】完全依赖【取决】于主键【OderID,ProductID】,而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF的设计容易产生冗余数据。
可以把OrderDetail表拆分为:
OrderDetail【OrderID,ProductID,Discount,Quantity】
Product 【ProductID,UnitPrice,ProductName】
来消除原订单表中UnitPrice,ProductName多次重复的情况。
第三范式【3NF】:首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。考虑一个订单表Order:      【OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity】主键是【OrderID】。
其中OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity
等非主键列都完全依赖于主键【OrderID】,所以符合 2NF。
不过问题是CustomerName,CustomerAddr,CustomerCity 直接依赖的是
CustomerID【非主键列】,而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分Order为Order【OrderID,OrderDate,CustomerID】和Customer【CustomerID,CustomerName,CustomerAddr,CustomerCity】从而达到 3NF。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|xuepai.net

GMT+8, 2026-3-26 07:44 , Processed in 2.031250 second(s), 21 queries .

快速回复 返回顶部 返回列表