BCNF 示例
BCNF定义:
定义一:若关系模式R是第一范式,且每个属性都不传递依赖于R的候选键。这种关系模式就是BCNF模式。
定义二:若关系模式R∈1NF,且对于每一个非平凡的函数依赖X→Y,都有X 包含码,则R∈BCNF。
平凡函数依赖
当关系中属性集合Y是属性集合X的子集时(Y?X),存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。
非平凡函数依赖
当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,则称这种函数依赖为非平凡函数依赖。
第二个不好记,也不好理解,理解第一个就是了,两个是等同的。
举例 ①:
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。也就是存在循环传递依赖(仓库ID) → (管理员ID) → (仓库ID)。
它会出现如下异常情况:
(1) 删除异常:
当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
(2) 插入异常:
当仓库没有存储任何物品时,无法给仓库分配管理员。
(3) 更新异常:
如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
举例②:
CSZ(CITY 城市,ST 街道,ZIP 邮编),其属性组上的函数依赖集是 F={( CITY,ST) →ZIP,ZIP→CITY}。
存在两个候选码:
(CITY, ST)->ZIP
(ST, ZIP)->CITY
(CITY, ST)和(ST, ZIP)是两个候选码,没有非主属性,自然CSZE∈3NF。
但存在传递依赖(CITY, ST)->ZIP->CITY, 所以CSZ∉BCNF。
关系模式CSZ 也存在种删除,插入,更新异常:
若将CSZ 分解为两个关系模式ZC(ZIP, CITY)和SZ(ST,ZIP),就不再有
非平凡的函数依赖的决定因素中不包含码的情况,都是BCNF 的关系模式了。
可以看到上面两个例子都是存在循环依赖造成的主属性传递依赖于码,不知道这是必然还是有别的例子属于3NF不属于BCNF但是也不存在循环依赖的情况?