对第一,二,三,BC范式的理解

在正式开始之前,先来明确以下几个概念:

  1. :能唯一确定一条记录的一个/多个属性。码包括主码候选码。任意一个候选码也能作为主键。其中主码/候选码的任意一个真子集都不能确定一条记录。

  2. 主属性:构成主码或候选码的属性都叫主属性!千万不要误认为候选码的属性不是主属性!

  3. 非主属性:除了主属性以外的属性都为非主属性。

  4. 传递依赖:如果存在A → B → C的决定关系,则C传递函数依赖于A。

  5. 如果非主属性B函数依赖于构成某个候选关键字的一组主属性A,而且A的任何一个真子集不能被B函数依赖,则称B完全函数依赖于A;反之,若B函数能依赖于A的真子集,则称B部分函数依赖于A。

    记为:如图

    并举一例:

    例:成绩表(学号,课程号,成绩)关系中,

    完全函数依赖:(学号,课程号)→ 成绩,学号 -\→ 成绩,课程号 -\→ 成绩,所以(学号,课程号)→ 成绩 是完全函数依赖

第一范式

如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

第二范式

第二范式的目的是去除非主属性对码的部分依赖,用大白话来说就是如果每个非主属性都不传递函数依赖于主键,就是第三范式。
举个例子,非主属性C依赖于非主属性B,非主属性B有依赖于主键A,在第二范式的情况下,如果不存在这种情况,就是第三范式!如果一个属性集所有属性都是主属性,那么一定是第三范式了。

第三范式

第三范式的目的是去除非主属性对码的传递依赖。比如说,在一个表中有A、B、C三列,A作为主码且没有其他候选码,A →B,B →C,则C传递依赖于A,且A为码,则不满足第三范式。

总的来说第二、三范式规范的主要目标是非主属性。也就是说,第二、三范式消除的是非主属性对码的部分依赖和传递依赖。那么有没有消除主属性对码的传递和函数依赖的范式呢?那就是BC范式。

BC范式

满足BC范式的关系将消除任何属性(主属性和非主属性)对关系键的部分函数依赖和传递函数依赖。
在第三范式下,举个例子
如果不存在(AB)–>C , B–>C类似这样的情况,也就是说部分函数依赖。也不存在A–>B , B–>C 这种情况,也就是传递函数依赖,不管这些ABC属性是主属性还是非主属性,反正就是不存在 “部分函数依赖和传递函数依赖” ,这就是BC范式

假设存在以下关系模式 (仓库名,管理员,物品名,数量)

已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量

码:(管理员,物品名),(仓库名,物品名)

主属性:仓库名、管理员、物品名

非主属性:数量

在(管理员,物品名)这个码中,存在管理员→仓库名这个部分函数依赖。所以仓库名这个主属性((仓库名,物品名)的码的主属性)部分依赖于(管理员,物品名)这个码,因此不属于BC范式。

参考资料

https://www.jianshu.com/p/995201cc13a7