详细讲解数据库BCNF、第四、第五范式

上次介绍了第一二三范式,这里接着对后续范式进行研究,在介绍前有必要先对一些关键字进行回顾:

**码:**数据表中关系的某个属性或者某几个属性的组合,用于区分每个元组。

**元组:**表中的每行记录。

**候选码:**唯一标识一条记录的最小属性集。

**主码:**某个能够唯一标识一条记录的最小属性集(从候选码挑选的一条)。

**主属性:**候选码属性的并集。

**非主属性:**相对于主属性来说,不包含在候选码中的属性。

BCNF范式/修正的第三范式:

在3NF基础上消除对主码子集的依赖,任何非主属性不能对主键子集依赖。

以仓库管理关系表为例:仓库号,存储物品号,管理员号,数量。

首先该表满足第三范式,也就是说一个管理员只在一个仓库工作,一个仓库能够存储多种物品。

表中存在有如下依赖关系:

(仓库号,存储物品号)——>(管理员号,数量)

(管理员号,存储物品号)——>(仓库号,数量)

由以上依赖关系可以得知(仓库号,存储物品号)和(管理员号,存储物品号)为表关系中的候选码。

表中唯一非关键字段为数量,它是符合第三范式的。

但是,由于存在如下决定关系:

(仓库号)——>(管理员号)

(管理员号)——>(仓库号)

即存在关键字段决定关键字段的情况,因此其不符合BCNF。

解决方法:

把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。

第四范式:

在BCNF基础上消去其中不是函数依赖的非平多值依赖。

例如在职工表中:职工编号,职工孩子姓名,职工选修课程。

表中一个职工可以有多个职工该子,且一个职工能有多个选修课。

首先该表存在多值情况,所以不符合第四范式,怎么解决呢?进行分解。

分解成:

职工表:职工编号,职工孩子姓名

职工表二:职工编号,职工选修课程

这样每个表中就只是存在一个多值事实了。

此时的两张表就符合了第四范式了。

第五范式:

在4NF基础上,表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。

例如在如下模拟表中:

A | B | C

a1 b1 c1

a2 b1 c2

a1 b2 c1

a2 b2 c2

如果要定位到特定行,必须三个属性都为关键字。

所以关系要变为 三个关系,分别是A 和B,B和C ,C和A。

A | B

a1 b1

a1 b2

B | C

b1 c1

b1 c2

C | A

c1 a1

c1 a2

你可能感兴趣的:(#,数据库,mysql,大学与Java那些年)