MySQL的三大范式

第一范式(1NF):强调的是列的原子性,不可分割的列。

例如一个联系人(姓名,性别,电话)假如这个人的电话有家庭电话和公司电话,那么这个表就没有达到第一范式的要求。

要是符合第一范式 我们必须把电话拆分:联系人(姓名,性别,家庭电话,公司电话),这样才达到了第一范式的要求。

第二范式(2NF):首先是1NF,另外还包括两部分,一是表中必须有主键,二是没有包含在主键的列必须完全依赖于主键,而不能依赖主键的一部分。例如:一个订单明细表OrderDetail(orderid,productid,unitprice,discount,quantity,productid).

我们知道一个订单中可以订购多种产品,所有淡淡一个orderid是不足以成为主键,主键应该是(orderid ,productid),显而易见discount,quantity完全依赖于主键(orderid,productid),而productname,unitprice只依赖于productid.不符合2NF,容易产生冗余数据。

我们把表分为orderdetail:(orderid,product,discount,querytity)和表product:(productid,unitprice,productbname)来取消原订单表中中unitprice和productName多次重复的问题。

第三范式(3NF): 首先是2NF,另外非主键必须直接依赖于主键,不能存在传递依赖。比如非主键a依赖于非主键b,非主键b依赖于主键。例如一个订单表order:(orderid,orderdate,customerid,customername,customerAddr,customercity)主键是orderid.

其中orderdate,customerid,customername,customeraddr,customercity等非主键依赖于主键(orderid),但是customername,customeraddr,customercity直接依赖于非主键customerid,它是通过传递才依赖于主键,所以不符合3NF。

通过拆分order 为order(Orderid,orderdate,customerid)和customer(custoemrname,customeraddr,custoemrcity)从而达到3NF。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值