当前位置: 首页 > news >正文

【数据库原理】(16)关系数据理论的函数依赖

一.函数依赖的概念

函数依赖是关系数据库中核心的概念,它指的是在属性集之间存在的一种特定的关系。这种关系表明,一个属性集的值可以唯一确定另一个属性集的值。

  • 属性子集:在关系模式中,X和Y可以是单个属性,也可以是属性的组合。
  • 唯一确定:对于关系模式中的任意两个元组,如果它们在X上的值相同,则它们在Y上的值也必须相同。

定义

  1. 基本定义:函数依赖,记作 X -> Y,意味着在关系模式 R(U) 中,如果 XU 的子集,那么 X 的值可以唯一确定 Y 的值。
  2. 非平凡函数依赖:如果 Y 不是 X 的子集,则 X -> Y 是非平凡函数依赖。
  3. 平凡函数依赖:如果 YX 的子集,则 X -> Y 是平凡函数依赖。

完全与部分函数依赖

  • 完全函数依赖:如果没有 X 的任何真子集能决定 Y,则称 YX 完全函数依赖。
  • 部分函数依赖:如果 X 的某个真子集可以决定 Y,则称 YX 部分函数依赖。

传递函数依赖

  • 定义:如果 X -> YY -> ZY 不函数依赖于 X,则称 ZX 传递函数依赖。。

函数依赖的闭包

  • 闭包:由函数依赖集 F 推导出的所有函数依赖的集合称为 F 的闭包,记作 F + F^+ F+

数据库设计中的应用

  1. 消除冗余和异常:理解和应用函数依赖有助于减少数据存储中的冗余,并避免更新、插入和删除异常。
  2. 规范化:函数依赖是数据库规范化过程的基础。通过规范化,可以将数据库分解成多个结构简单、相互独立的小表,从而提高数据库的运行效率和数据的一致性。

实例分析

以一个简单的员工数据库为例,假设有一个关系模式Employee(员工号, 姓名, 部门),其中:

  • 如果一个员工号唯一地决定一个员工的姓名和部门,则称姓名和部门函数依赖于员工号(员工号 → 姓名, 部门)。
  • 如果部门中的每个员工都有一个唯一的员工号,则员工号函数依赖于部门(部门 → 员工号),这可能表明设计上的问题,因为部门通常包含多个员工。

二.关键字(码)

关键字(码)的定义
  • 基本概念:在关系数据库中,关键字(又称码)是一种特殊的属性或属性组合,能够在关系模式中唯一标识每个元组。
  • 候选码:关系中所有可能作为唯一标识符的属性集称为候选码。
  • 主码:从候选码中选定的一个作为主要的唯一标识符。
  • 主属性:包含在任何一个候选码中的属性。
  • 非主属性:不包含在任何码中的属性。
关键字的重要性
  1. 唯一性标识:关键字确保关系中的每个元组都是唯一的,从而使数据的检索和操作更为准确。
  2. 实体完整性:关键字强制执行实体完整性规则,确保数据库的准确性和可靠性。
  3. 构建关系:关键字是关系间联系的基础,特别是在实现外键(外部码)时,它们建立了表之间的联系。
主键与外键
  • 主键(Primary Key):选定的候选码,用于唯一标识关系中的每个元组。
  • 外键(Foreign Key):存在于一个关系中但作为另一个关系的主键的属性或属性组。
示例

假设有关系模式 R(城市, 街道, 邮编),其中 城市街道 的组合能唯一确定一个邮编,这组属性可以作为候选码。如果在另一个关系模式中 邮编 是唯一标识符,则它在当前关系模式中作为外键存在。

选择合适的关键字

在数据库设计中,选择合适的关键字至关重要,因为它影响数据的整合性、存取效率和系统的可维护性。选择时应考虑以下因素:

  1. 最小化:候选码应该尽可能小,以减少存储空间和提高处理效率。
  2. 稳定性:选择不易改变的属性作为关键字。
  3. 简洁性:简单的属性或属性组合更易于管理和使用。

二.Armstrong 公理系统

Armstrong 公理系统为函数依赖的理论提供了一套形式化的推理规则,用于从已知的函数依赖中导出更多的函数依赖。这一系统是关系模式分解算法的理论基础,帮助数据库设计者理解和应用函数依赖的概念。

Armstrong 公理系统的规则
  1. 自反律 (Reflexivity):

    • 如果 Y⊆X⊆U,则 X→Y 是成立的。
    • 说明: 任何属性集总是函数决定其子集。
  2. 增广律 (Augmentation):

    • 如果 X→Y 成立,且 Z⊆U,则 XZ→YZ 也成立。
    • 说明: 可以在函数依赖的两边同时增加相同的属性集。
  3. 传递律 (Transitivity):

    • 如果 X→Y 和 Y→Z 成立,则 X→Z 也成立。
    • 说明: 函数依赖具有传递性。

由于关系的性质,Armstrong 公理系统是有效和完备的。它的推论包括合并规则、伪传递规则和分解规则。

推论规则
  1. 合并规则 (Union Rule):

    • 如果 X→Y 和 X→Z 成立,则 X→YZ 也成立。
    • 说明: 可以合并具有相同左部的函数依赖。
  2. 伪传递规则 (Pseudo Transitivity Rule):

    • 如果 X→Y 和 WY→Z 成立,则 XW→Z 也成立。
    • 说明: 当函数依赖的右部与另一个函数依赖的左部部分重叠时,可推导出新的函数依赖。
  3. 分解规则 (Decomposition Rule):

    • 如果 X→Y 成立,并且 Z⊆Y,则 X→Z 也成立。
    • 说明: 函数依赖的右部可以分解成更小的部分。
重要结论
  1. 函数依赖 X → A 1 ​ , A 2 ​ , . . . , A n X→A_1​,A_2​,...,A_n XA1,A2,...,An​ 成立的充分必要条件是每个 X → A i X→A_i XAi​ 都成立。
  2. 函数依赖集 F 的闭包 F + F^+ F+ 是从 F 出发用公理导出的所有函数依赖的集合。
应用

Armstrong 公理系统在数据库设计中被广泛应用于确定关系模式的规范化程度。通过应用这些规则,设计者可以识别数据冗余和更新异常,并据此对数据库模式进行调整,以达到更高级别的规范化。

相关文章:

  • 解决MySQL8.0本地服务器连接不上的问题
  • 双碳管理系统任务需求分析(第10套)
  • 【深度学习每日小知识】Data Augmentation 数据增强
  • uniapp自定义封装只有时分秒的组件,时分秒范围选择
  • Qt-Day2
  • 冒泡排序(Java语言)
  • Flask 会员列表展示
  • 【MySQL】ALL函数的巧用 以及 排序(order by)巧用 sum(条件表达式) 语法
  • Qt之explicit作用及用法
  • HTTP与API接口详解
  • Vue2-子传父和父传子的基本用法
  • React基础应用及常用代码
  • 修改 docker /dev/shm 的大小
  • k8s之Pod的基础(上)
  • studio3T mongodb 根据查询条件更新字段 或 删除数据
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Angular数据绑定机制
  • go append函数以及写入
  • Js基础知识(一) - 变量
  • MaxCompute访问TableStore(OTS) 数据
  • supervisor 永不挂掉的进程 安装以及使用
  • text-decoration与color属性
  • 如何在 Tornado 中实现 Middleware
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个项目push到多个远程Git仓库
  • 以太坊客户端Geth命令参数详解
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (3)nginx 配置(nginx.conf)
  • (3)STL算法之搜索
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C语言)二分查找 超详细
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)编辑寄语:因为爱心,所以美丽
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net CHARTING图表控件下载地址
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core中Emit的使用
  • .NET Micro Framework 4.2 beta 源码探析
  • .net Signalr 使用笔记
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net程序帮助文档制作
  • .NET下的多线程编程—1-线程机制概述
  • .NET性能优化(文摘)
  • .NET序列化 serializable,反序列化
  • .php文件都打不开,打不开php文件怎么办
  • /proc/vmstat 详解
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @Transaction注解失效的几种场景(附有示例代码)
  • [].shift.call( arguments ) 和 [].slice.call( arguments )