数据库三范式

来源:互联网 发布:java httpconnection 编辑:程序博客网 时间:2024/06/05 14:59

    数据库三范式

1.原子性 字段不可再分,否则就不是关系型数据库;

比如:有这样一个表:联系人表(姓名,性别,电话),如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构的设计就没有达到原子性的要求.要符合第一范式,必须把电话这一列拆分成公司电话和家庭电话这两列.此时联系人表(姓名,性别,公司电话,家庭电话).


2.唯一性 一个表只说明一个事物,要有主键要求其他字段都依赖于主键;

比如:这样一个表:OrderDetail(OrderID,ProductID,UnitPrice,Discount,Quantitly,ProductName).因为我们知道在一个订单中可以订购多重产品,所以单单一个OrderID是不足以成为主键的,主键应该是OrderID和ProductID.显然,Discount(折扣),Quantitly(数量)完全依赖于主键OrderID,而UnPrice,ProductName只依赖于ProductID.所以OrderDetail表不符合数据库的第二范式.不符合第二范式容易产生冗余数据.此时可以把OrderDetail表拆分为:OrderDetail(OrderID,ProductID,Discount,Quantitly)和Product(ProductID,UnitPrice,ProductName)来消除原订单中UnitPrice,ProductName多次重复的情况


3.每列都与主键有直接的关系,不存在传递依赖

Order表(OrderID,OrderDate,CustomerID,CustomerID,CustomerName,CustomerAddr,CustomerCity)等非主键都依赖于OrderID,所以符合第二范式,不过问题是CustomerName,CustomerAddr,CustomerCity直接依赖的是CustomerID(非主键列),而不是直接依赖于主键,他是通过传递才依赖主键的,所以不符合第三范式.通过拆分Order为Order(OrderID,OrderDate,CustomerID)和Customer(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到第三范式.



原创粉丝点击