《1NF-2NF-3NF-4NF.docx》由会员分享,可在线阅读,更多相关《1NF-2NF-3NF-4NF.docx(2页珍藏版)》请在优知文库上搜索。
1、大部分数据库从业人员都知道关系数据库有三个基本的范式,即:第一范式,第二范式,第三范式。当然也有牛人知道BC范式,第四范式,第五范式,第六范式,甚至还有个DK范式。本人对数据库的范式概念也是一知半解的,想想有些可笑,搞数据库的竟然不了解关系数据库的基础范式。这不最近查阅了不少资料,今天把这些东东总结一下。范式:英文名称是NormalForm,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:INF,2NF,3NF,BCNF,4N
2、F,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(INF),第二范式(2NF),第三范式(3NF)Discount,Quantity,ProductName)因为我们知道在一个订单中可以订购多种产品,所以单单一个OrderlD是不足以成为主键的,主键应该是(OrderID,ProductID)显而易见DiSCoUnt(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而UnitPrice,ProductName只依赖于ProductIDo所以OrderDetail表不符合2NF。不符合2NF的设计容易产生冗余数据。可以把IOrde
3、rDetail表拆分为(OrderDetail)(OrderID,ProductID,Discount,Quantity)11Product(ProductID,UnitPrice,PrOdUCtName)来消除原订单表中UnitPrice,ProductName多次重复的情况, 第三范式(3NF):首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况。考虑一个订单表【Order】(Order【D,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)
4、主键是(OrderID)。其中OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity等非主键列都完全依赖于主键(OrderID),所以符合2NF。不过问题是CustomerName,CustomerAddr,CustomerCity直接依赖的是CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合3NFo通过拆分【Order】为【OrderKOrderID,OrderDate,CUStomerID)和【Customer(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到3NF。第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。