知识卡片

多值依赖与4NF:函数依赖之外的第二种冗余来源

普通读书笔记卡

内容

即使一张表已经满足BCNF(函数依赖角度已经没有可以消除的冗余),仍然 可能存在数据冗余——这说明冗余的来源不止函数依赖一种,还有一类更 “松散”的依赖关系没被函数依赖覆盖到。函数依赖描述的是”一个取值对应 唯一一个取值”,而多值依赖描述的是”一个取值对应一组取值,且这组取值 不受另一组属性的影响”——例如一门课程可以对应一组参考书,也可以 对应一组授课教师,参考书这组值和授课教师这组值互相独立,谁也不 决定谁,但两者都被”课程”这同一个属性关联着,这种关系用函数依赖 完全表达不出来(课程并不能唯一决定某一本具体的参考书),却依然会 在表中产生冗余(新增一位授课教师,就要给这门课的每本参考书各配一条 新记录)。4NF在BCNF基础上进一步要求消除这种非平凡的多值依赖—— 它和BCNF的定义形式几乎一样,区别只在于4NF同时约束函数依赖和多值 依赖的集合,而BCNF只约束函数依赖,因此每个满足4NF的关系模式一定 满足BCNF,反过来则不一定成立。这说明”消除了函数依赖角度的所有冗余” 不等于”消除了所有冗余”,多值依赖是规范化理论里容易被忽略、但确实 独立存在的另一条冗余来源。

参考来源

- 位置:《数据库原理(微课版)》第7章《关系数据库规范化理论》7.4节 "多值依赖及使用多值依赖的模式分解"(源文件:_epub-src/index_split_005.html) - 结论依据:原文以课程对应一组参考书、一组授课教师为例,说明"关系 模式S(CTR)……显然属于BCNF,但还是存在数据冗余……我们把这种属性 之间的依赖关系定义为多值依赖""4NF与BCNF定义的区别仅在于4NF使用 的是多值依赖与函数依赖的集合,而BCNF使用函数依赖的集合……每个 属于4NF的关系模式一定属于BCNF",因此可以推出多值依赖是函数依赖 之外独立存在的冗余来源,4NF是比BCNF更严格的范式。 - 原始内容:关系模式S(CTR)……显然属于BCNF,但还是存在数据冗余…… 我们把这种属性之间的依赖关系定义为多值依赖……4NF与BCNF定义的 区别仅在于4NF使用的是多值依赖与函数依赖的集合,而BCNF使用函数 依赖的集合。