数据库范式

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


你可能感兴趣的:(数据库范式)