1NF:
1NF的定义为:符合1NF的关系中的每个属性都不可再分。原子性。
2NF:
2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
3NF:
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
函数依赖
若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。
完全函数依赖
在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ' → Y 不成立,那么我们称 Y 对于 X完全函数依赖,记作 X F→ Y。
部分函数依赖
假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X,记作 X P→ Y。
传递函数依赖
假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (感谢@百达指出的错误,这里改为:『Y 不包含于 X,且 X 不函数依赖于 Y』这个前提),那么我们就称 Z 传递函数依赖于 X ,记作 X T→ Z。
码
设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为码。在实际中我们通常可以理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码。
非主属性
包含在任何一个码中的属性成为主属性。
2NF判断的方法是
第一步:找出数据表中所有的码。
第二步:根据第一步所得到的码,找出所有的主属性。
第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
第四步:查看是否存在非主属性对码的部分函数依赖。
例子:
1NF
TaobaoPucharsedLog(sid, date, buyer, seller, goods,amount)
“商品”会有更多详细的属性,例如商品名称,商品价格,产地等等。
“用户”也有昵称,年龄,住址等,“商户”也是如此。
这些属性都是可以再分割的,所以并不符合1NF范式,需要将其完全拆至不可分割为止。
aobaoPucharsedLog(sid, date, buyer-id, buyer-name, buyer-age, seller, goods, amount)
2NF
TaobaoPucharsedLog(sid, date,buyer-id, buyer-name, buyer-age,seller-id, seller-name, seller-age,goods-id, goods-name, amount)。
可以看到里面有四个主键:sid, buyer-id, seller-id, goods-id。对于seller-name属性,它仅依赖于seller-id,跟buyer-id之类的没有任何关系,所以它对于主键的依赖是“部分依赖”,并不符合2NF。简单点说,就是不要把不相关的东西放到一个表里面。
拆解成以下四个
TaobaoPucharsedLog(sid,buyer-id,seller-id,goods-id, amount)
BuyerInformation(buyer-id, buyer-name, buyer-age)
SellerInformation(seller-id, seller-name, seller-age)
GoodsInformation(goods-id, goods-name)
NF3:
比如对于一张数据库,里面的元素有son, person, father, grand-father,
依赖关系是son -> person, person -> father, father -> grand-father,
明显有一个链表式的传递,3NF中禁止此类依赖的出现。
修改示范:
依赖关系修改为
son -> person
son -> father
son -> grand-father
或者是拆成三张表
http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
https://www.zhihu.com/question/24696366