【数据库设计】规范化设计理论之函数依赖(2)

函数依赖

多值依赖

数学定义是:设R(U)是属性集U上的一个 关系模式。X,Y,Z是U的 子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立, 当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。

假如Z是空集,那么X→→Y就是平凡的多值依赖,反之则是非平凡的多值依赖。

用一个例子来理解:有关系R(仓库号,仓库管理员,库存产品号),

  • X:仓库号
  • Y:仓库管理员
  • Z:库存产品号

假设每一个产品只能放在一个仓库里面,但是一个仓库却可以有多个仓库管理员,因此给定一对<库存产品号,仓库号>有一组仓库管理员的值,而这组仓库管理员的值仅仅决定于仓库号,而与库存管理员无关。比如一对<产品A,仓库号1>有仓库管理员1,2,<产品B,仓库号2>就有仓库管理员1,2。用符号来表示就是仓库号→→仓库管理员。

|-----------|---------|-----------|
| 仓库管理员 | 仓库号 | 库存产品号 |
| 管理员1 | 1 | 产品A |
| 管理员2 | 1 | 产品A |
| 管理员1 | 2 | 产品B |
| 管理员2 | 2 | 产品B |
| 管理员3 | 3 | 产品C |
| 管理员3 | 3 | 产品D |

(1)允许X的一个值决定Y的一组值,这种决定关系与Z取值无关。

(2)多值依赖是全模式的依赖关系。全模式是指关系到关系模式中的所有属性。

多值依赖的缺点是:数据冗余太大,之后需要进行关系模式的分解以此来解决这个问题。函数依赖实际上是多值依赖的一个特性,如果Y的值只有一个那么多值依赖就变成了函数依赖。

连接

我们知道每一个关系都有唯一的主键,即可识别的元组,如果有一个关系可以通过投影分解成若干个子关系(子关系也有主键),而这些子关系通过连接操作(自然连接)可以得到原始关系那么连接依赖成立。涉及到投影和自然连接。

原始关系:Employees

|----------|---------|----------|----------|
| 员工ID | 姓名 | 部门ID | 部门名称 |
| E1 | Alice | D1 | 销售部 |
| E2 | Bob | D1 | 销售部 |
| E3 | Charlie | D2 | 技术部 |
| E4 | David | D2 | 技术部 |
| E5 | Eve | D3 | 人事部 |

子关系1:EmployeeDetails

|----------|---------|
| 员工ID | 姓名 |
| E1 | Alice |
| E2 | Bob |
| E3 | Charlie |
| E4 | David |
| E5 | Eve |

子关系2:DepartmentDetails

|----------|----------|
| 部门ID | 部门名称 |
| D1 | 销售部 |
| D2 | 技术部 |
| D3 | 人事部 |

子关系通过连接操作得到原始关系可以表示为{员工ID }⋈{部门ID}。

连接依赖的特例:多值依赖中的关系可以分解成两个子关系,比如上面的例子,我们可以将原始关系分解成下面的两个子关系。其他的连接依赖则可以是多个(包含2个)关系的连接。

子关系 R1(仓库号, 库存产品号)

  • 这个子关系包含每个库存产品号和对应的仓库号。

|---------|-----------|
| 仓库号 | 库存产品号 |
| 1 | 产品A |
| 2 | 产品B |
| 3 | 产品C |
| 3 | 产品D |

子关系 R2(仓库号, 仓库管理员)

  • 这个子关系包含每个仓库号和对应的仓库管理员。

|---------|-----------|
| 仓库号 | 仓库管理员 |
| 1 | 管理员1 |
| 1 | 管理员2 |
| 2 | 管理员1 |
| 2 | 管理员2 |
| 3 | 管理员3 |
| 3 | 管理员3 |

关系的键

在关系数据结构那里我们是这样解释候选键的:

当某一个属性能明显区分元组之间的区别时(可以唯一地标识不同的元组),这样的属性或者几个这样的属性(即属性集合)叫做超键,比如Sno属性是超键,(Sno、Sname)属性集合也是一个超键。
学号是不可能会出现重复的情况的,这样的也叫作候选键即超键中(当有多个时)没有多余的冗余的属性,如果(Sno、Sname)中Sname属性取值是唯一的(即没有出现同名情况)那么这个(Sno、Sname)超键也是候选键。注意:候选键得先是超键。

现在我们学习了函数依赖重新用新的角度去解释则是这样的:得满足两个条件:

成为候选键的属性或属性集①不函数依赖于其他属性②其中任意一个属性都不能单独决定其他属性即其他属性都不函数依赖于该属性或属性集的任一真子集。

假设我们有关系R(U)成为候选键的属性或者属性集是K,用完全函数依赖来表示就是:

倘若一个关系中有很多候选键,那么就选择其中一个最重要的(最能识别的)作为该关系的主键。

用一个上面说过的例子来解释就是如下

有关系SC(Sno,Cno,Grade),(Sno,Cno)属性集不函数依赖于其他属性,并且Grade不函数依赖于它们之中的任意一个,因此其中(Sno,Cno)就是候选键,也是该关系的主键。

相关推荐
尘佑不尘17 分钟前
shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘
数据库·笔记·mongodb·web安全·jenkins·1024程序员节
传输能手25 分钟前
从三方云服务器将数据迁移至本地,如何保障安全高效?
大数据·服务器·数据库
BinTools图尔兹31 分钟前
CQ社区版 v2024.10 | 支持k8s、helm部署!
数据库·安全·k8s·helm·数据安全·数据库管理员
北笙··1 小时前
Redis慢查询分析优化
数据库·redis·缓存
p-knowledge1 小时前
redis的三种客户端
数据库·redis·缓存
积水成江1 小时前
Redis相关面试题
数据库·redis·缓存
bigcarp1 小时前
Django ORM 数据库管理 提高查询、更新性能的技巧和编程习惯:
数据库·python·django
Zilliz Planet2 小时前
GenAI 生态系统现状:不止大语言模型和向量数据库
数据库·人工智能·语言模型·自然语言处理
瓜牛_gn3 小时前
redis详细教程(4.GEO,bitfield,Stream)
数据库·redis·缓存
练习两年半的工程师3 小时前
建立一个简单的todo应用程序(前端React;后端FastAPI;数据库MongoDB)
前端·数据库·react.js·fastapi