多值依赖打破了第四范式
在关系数据库中,当存储在同一个数据库表中的信息唯一地确定存储在同一个表中的其他信息时,会发生依赖关系。 当表中存在一个或多个行意味着同一个表中存在一个或多个其他行时,就会发生多值依赖 。 换句话说,表中的两个属性(或列)是相互独立的,但都依赖于第三个属性。
多值依赖可防止规范化标准第四范式(4NF)。 关系数据库遵循代表记录设计准则的五种正常形式。 它们防止数据中的更新异常和不一致。 第四种正常形式处理数据库中的多对一关系。
函数依赖与多值依赖
要理解多值依赖关系,重新审视函数依赖关系是很有帮助的。
如果一个属性X唯一地确定了一个属性Y,那么Y在功能上依赖于X.它被写为X - > Y.例如,在下面的Students表中,Student_Name决定了Major:
学生姓名 | 重大的 |
---|---|
拉维 | 艺术史 |
贝丝 | 化学 |
这个函数依赖可以写成:Student_Name - > Major 。 每个Student_Name确切地确定一个Major,并且不再更多。
如果您希望数据库也能跟踪这些学生采取的运动,您可能会认为最简单的方法是添加另一篇名为“运动”的专栏:
学生姓名 | 重大的 | 运动 |
---|---|---|
拉维 | 艺术史 | 足球 |
拉维 | 艺术史 | 排球 |
拉维 | 艺术史 | 网球 |
贝丝 | 化学 | 网球 |
贝丝 | 化学 | 足球 |
这里的问题是拉维和贝丝都参加了多项运动。 每增加一项运动都需要增加一个新的行。
这张表引入了多值依赖,因为专业和运动是相互独立的,但都依赖于学生。
这是一个简单的例子,可以很容易识别,但多值依赖可能会成为大型复杂数据库的问题。
多值依赖被写成X - > - > Y.在这种情况下:
Student_Name - > - > Major
Student_Name - > - > 运动
这被读作“Student_Name multidetermines Major”和“Student_Name multidetermines Sport”。
多值依赖总是需要至少三个属性,因为它由至少两个依赖于三分之一的属性组成。
多值依赖和规范化
具有多值相关性的表违反了第四范式(4NK)的规范化标准,因为它会产生不必要的冗余并可能导致不一致的数据。 为了将这个信息提高到4NF,有必要将这些信息分解成两个表格。
下面的表格具有Student_Name - > Major的函数依赖关系,并且没有多值依赖关系:
学生姓名 | 重大的 |
---|---|
拉维 | 艺术史 |
拉维 | 艺术史 |
拉维 | 艺术史 |
贝丝 | 化学 |
贝丝 | 化学 |
虽然此表还具有Student_Name - > Sport的单个函数依赖项:
学生姓名 | 运动 |
---|---|
拉维 | 足球 |
拉维 | 排球 |
拉维 | 网球 |
贝丝 | 网球 |
贝丝 | 足球 |
很明显,规范化通常通过简化复杂表格来解决,以便它们包含与单个想法或主题相关的信息,而不是试图使单个表格包含太多不同的信息。