在正式开始之前,先来明确以下几个概念:
1、码:能唯一确定一条记录的一个/多个属性。码包括主码和候选码。任意一个候选码也能作为主键。其中主码/候选码的任意一个真子集都不能确定一条记录。
2、主属性:构成主码或候选码的属性都叫主属性!千万不要误认为候选码的属性不是主属性!
3、非主属性:除了主属性以外的属性都为非主属性。
4、传递依赖:如果存在A → B → C的决定关系,则C传递函数依赖于A。
第二范式:
第二范式的目的是去除非主属性对码的部分依赖,用大白话来说就是非主属性只能由码来确定。比如说,在一个表中有A、B、C、D四列,(A,B)作为主码且没有其他候选码。如果存在A决定B的话(以后写为A → B),那么B这个非主属性就不是由(A,B)主码来确定的了。总的来说,第二范式的目的就是让表只描述一种信息(学生信息、考试科目信息等)。
第三范式:
第三范式的目的是去除非主属性对码的传递依赖。比如说,在一个表中有A、B、C三列,A作为主码且没有其他候选码,A →B,B →C,则C传递依赖于A,且A为码,则不满足第三范式。
总的来说第二、三范式规范的主要目标是非主属性。也就是说,第二、三范式消除的是非主属性对码的部分依赖和传递依赖。那么有没有消除主属性对码的传递和函数依赖的范式呢?那就是BC范式。
BC范式:
假设存在以下关系模式 (仓库名,管理员,物品名,数量)
已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名
非主属性:数量
在(管理员,物品名)这个码中,存在管理员→仓库名这个部分函数依赖。所以仓库名这个主属性((仓库名,物品名)的码的主属性)部分依赖于(管理员,物品名)这个码,因此不属于BC范式。