在一个关系数据库,当存储在同一数据库表中的信息唯一地确定存储在同一表中的其他信息时,发生依赖性。当表中的一个或多个行的存在意味着在该相同表中存在一个或多个其他行时,发生多值依赖性。换句话说,表中的两个属性(或列)彼此独立,但两者都依赖于第三个属性。
多值依赖性防止了归一化标准第四范式。关系数据库遵循五种表示记录设计准则的标准形式。它们可以防止数据中的更新异常和不一致。第四个标准形式处理对象中的多对一关系数据库。
函数依赖vs.多值依赖
要了解多价依赖性,重新审视一个人是有帮助的功能依赖性是多少。
如果一个属性X唯一地决定了一个属性Y,那么Y在功能上依赖于X。这被写为X -> Y。
Student_Name | 主要的 |
---|---|
拉维 | 艺术史 |
贝丝 | 化学 |
这个函数依赖可以写成:Student_Name -> Major。每个学生_name究竟确定一个主要,而且没有更多。
如果你想让数据库也跟踪这些学生参加的运动,你可能会认为最简单的方法是添加另一个标题为“运动”的栏目:
Student_Name | 主要的 | 运动 |
---|---|---|
拉维 | 艺术史 | 足球 |
拉维 | 艺术史 | 排球 |
拉维 | 艺术史 | 网球 |
贝丝 | 化学 | 网球 |
贝丝 | 化学 | 足球 |
问题是拉维和贝丝都做一些运动。有必要为每一项额外的运动增加一排。
这个表引入了一个多值依赖关系,因为专业和运动彼此独立,但都依赖于学生。这是一个简单的示例,很容易识别,但是在大型复杂的数据库中,多值依赖关系可能成为一个问题。
多值依赖被写成X ->-> y。
Student_Name->->主要的
Student_Name->->运动
这被解读为“Student_Name multidetermine Major”和“Student_Name multidetermine Sport”。
多值依赖项总是需要至少三个属性,因为它包含至少两个依赖于第三个属性的属性。
多值依赖关系和规范化
具有多值依赖关系的表违反了第四范式的规范化标准,因为它会产生不必要的冗余,并可能导致数据不一致。为了达到4NF,必须将此信息分成两个表。
下表现在具有Student_name的功能依赖性 - >主要,没有多值依赖性:
Student_Name | 主要的 |
---|---|
拉维 | 艺术史 |
拉维 | 艺术史 |
拉维 | 艺术史 |
贝丝 | 化学 |
贝丝 | 化学 |
而这个表也有一个单独的函数依赖Student_Name -> Sport:
Student_Name | 运动 |
---|---|
拉维 | 足球 |
拉维 | 排球 |
拉维 | 网球 |
贝丝 | 网球 |
贝丝 | 足球 |
通常通过简化复杂表来实现归一化,以便它们包含与单个想法或主题相关的信息而不是尝试使单个表包含太多不同的信息。