《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式

目录

一、关系代数

基本运算

笛卡尔积(×)

投影(π)

选择(σ)

自然连接(⋈)

真题示例:

二、函数依赖

基本概念

Armstrong公理系统

键与约束

三、范式(Normalization)

第一范式(1NF)

第二范式(2NF)

第三范式(3NF)

BC范式(BCNF)

真题示例:


一、关系代数

  1. 基本运算

    • 并(∪):合并两张表的所有记录,重复记录仅显示一次。
      • 示例:S1 ∪ S2 结果包含 S1 和 S2 的所有不重复记录。
    • 交(∩):返回两张表中相同的记录。
      • 示例:S1 ∩ S2 结果为 Sno='No0001', Sname='Mary', Sdept='IS'
    • 差(-):返回第一张表有而第二张表没有的记录。
      • 示例:S1 - S2 结果为 Sno='No0003' 和 No0004 的记录。
  2. 笛卡尔积(×)

    • 结果包含两表所有属性列,记录数为两表记录数的乘积。
    • 示例:S1 × S2 的每条记录是 S1 和 S2 记录的排列组合。
  3. 投影(π)

    • 选择某表的特定列(可用列名或列序号表示)。
    • 示例:π(Sname)(S1) 返回 S1 的所有学生姓名。
  4. 选择(σ)

    • 按条件筛选表中的记录。
    • 示例:σ(Sdept='IS')(S1) 返回 Sdept 为 IS 的记录。
  5. 自然连接(⋈)

    • 合并两表中属性相同且值相同的记录,相同属性列仅显示一次。

真题示例:

给定关系R(A, B, C, D)和关系S(C, D, E),对其进行自然连接运算R⋈S后的属性列为( )个;与σR.B>S.E(R⋈S)等价的关系代数表达式为( )。

A. 4 B. 5 C. 6 D. 7

A. σ₂>₇(R×S) B. π₁,₂,₃,₄,₇(σ'₂' > '₇' ∧₃=₅∧₄=₆(R×S))

C. σ'₂' > '₇'(R×S) D. π₁,₂,₃,₄,₇(σ₂>₇∧₃=₅∧₄=₆(R×S))

1. 计算自然连接运算 R⋈S​ 后的属性列个数

自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。 关系 R(A,B,C,D)​ 有 4​ 个属性,关系 S(C,D,E)​ 有 3​ 个属性,其中 C​ 和 D​ 是公共属性。 进行自然连接时,重复的公共属性 C​ 和 D​ 只保留一次,所以 R⋈S​ 后的属性列为 A​、B​、C​、D​、E​,共 5​ 个。 

2. 找出与 σR.B>S.E​(R⋈S)​ 等价的关系代数表达式

​σR.B>S.E​(R⋈S)​ 表示先对 R​ 和 S​ 进行自然连接,然后从连接结果中选择满足 R​ 中的属性 B​ 大于 S​ 中的属性 E​ 的元组。 在进行关系代数运算时,一般先将自然连接转换为笛卡尔积和选择、投影运算。

  • 首先将 R⋈S​ 转换为笛卡尔积 R×S​ 并添加等值连接条件,即 σR.C=S.C∧R.D=S.D​(R×S)​ 。
  • 然后要从结果中选择满足 R.B>S.E​ 的元组,完整的选择条件就是 σR.B>S.E∧R.C=S.C∧R.D=S.D​(R×S)​ 。
  • 用属性的序号表示,R×S​ 后的属性顺序为 R.A​(第 1​ 列)、R.B​(第 2​ 列)、R.C​(第 3​ 列)、R.D​(第 4​ 列)、S.C​(第 5​ 列)、S.D​(第 6​ 列)、S.E​(第 7​ 列),那么选择条件可写为 σ2>7∧3=5∧4=6​(R×S)​ 。
  • 最后,由于最终结果不需要重复的 C​ 和 D​ 列(在自然连接中重复列已被去掉),所以需要对结果进行投影,保留 A​、B​、C​、D​、E​ 对应的列,即 π1,2,3,4,7​(σ2>7∧3=5∧4=6​(R×S))​ 。


二、函数依赖

  1. 基本概念

    • 函数依赖:若属性 X 能唯一确定 Y,则称 Y 依赖于 X(记作 X→Y)。
    • 部分函数依赖:若 (A,B)→C,但 A→C 也成立,则 C 部分依赖于 (A,B)
    • 传递函数依赖:若 A→BB→C 且 A 与 B 不等价,则 A→C 是传递依赖。
  2. Armstrong公理系统

    函数依赖的公理系统(Armstrong) 设关系模式R<U,F>,U是关系模式R的属性全集,F是关系模式R的一个函数依赖集。对于R<U,F>来说有以下的:

    • 自反律(Reflexivity)

      • 若属性集Y是属性集X的子集(Y⊆X),则必然存在函数依赖X→Y。
      • 示例:若X={A,B,C},Y={A,B},则X→Y自动成立。
    • 增广律(Augmentation)

      • 若存在X→Y,则对任意属性集Z,有XZ→YZ。
    • 传递律(Transitivity)

      • 若X→Y且Y→Z,则必然有X→Z。
    • 合并规则(Union)

      • 若X→Y且X→Z,则可合并为X→YZ。
    • 伪传递规则(Pseudo-transitivity)

      • 若X→Y且WY→Z,则XW→Z。
      • 示例:若学号→姓名,(姓名,课程)→成绩,则(学号,课程)→成绩。
    • 分解规则(Decomposition)

      • 若X→Y且Z⊆Y,则X→Z。
      • 示例:若A→{B,C},则A→B和A→C均成立。
  3. 键与约束

    • 超键:能唯一标识此表的属性的组合。
    • 候选键:超键中去掉冗余的属性,剩余的属性就是候选键。
    • 主键:任选一个候选键,即可作为主键。
    • 外键:其他表中的主键。
    • 主属性:候选键内的属性为主属性,其他属性为非主属性。
    • 实体完整性约束:即主键约束,主键值不能为空,也不能重复。
    • 参照完整性约束:即外键约束,外键必须是其他表中已经存在的主键的值,或者为空。
    • 用户自定义完整性约束:自定义表达式约束,如设定年龄属性的值必须在0到150之间。


三、范式(Normalization)

  1. 第一范式(1NF)

    • 表中每个字段不可再分(无嵌套表)。
    • 原始表(不符合1NF)

      员工ID员工姓名薪资/月
      001张三基本工资:5000, 补贴:1000
      002李四基本工资:6000, 补贴:800

      1NF规范化后

      员工ID员工姓名基本工资补贴
      001张三50001000
      002李四6000800
  2. 第二范式(2NF)

    • 满足1NF,且非主属性完全依赖于候选键(消除部分依赖:每一个非主属性不会依赖复合主键中的某一个列)。
    • 原始表(不符合2NF)

      学号课程号课程名称成绩教师
      S001C001数学90王老师
      S001C002英语85李老师

      问题:课程名称和教师仅依赖于课程号(部分依赖复合主键 (学号, 课程号))。
      2NF规范化后
      选课表(完全依赖):

      学号课程号成绩
      S001C00190
      S001C00285

      课程表(消除部分依赖):

      课程号课程名称教师
      C001数学王老师
      C002英语李老师
  3. 第三范式(3NF)

    • 满足2NF,且非主属性不传递依赖于候选键
    • 原始表(不符合3NF)

      学号姓名系编号系主任
      S001张三D01刘主任
      S002李四D02陈主任

      问题:系主任传递依赖于学号(学号 → 系编号 → 系主任)。
      3NF规范化后
      学生表

      学号姓名系编号
      S001张三D01
      S002李四D02

      系表(消除传递依赖):

      系编号系主任
      D01刘主任
      D02陈主任
  4. BC范式(BCNF)

    • 满足3NF,且所有依赖的左侧必须包含候选键
    • BC范式要求在满足第三范式的条件下,进一步消除主属性对于码的部分函数依赖和传递依赖。简单通俗地讲,对于关系模式中的任意一个函数依赖X→Y(X是决定因素,Y是被决定因素),X必须是候选键或者包含候选键。也就是说,每一个函数依赖的左边决定因素都必然包含候选键,只有满足这样的条件,关系模式才符合BCNF。
      • 在给定的例子中有一个涉及S、T、J三个属性的关系模式,通过分析其依赖关系和候选键来判断是否符合BCNF:

      • 候选键与依赖集:该关系模式的候选键有两种情况,分别是组合键(S, T)和(S, J),依赖集为{SJ→T,T→J} 。由于S、T、J这三个属性都能通过候选键组合确定,所以它们都是主属性,因此该关系模式达到了3NF(因为不存在非主属性,也就不存在非主属性对码的部分依赖和传递依赖)。
      • BCNF判断:当以(S, J)作为候选键时,看依赖T→J,其中T在(S, J)这种候选键情况下并不是候选键,即T→J这个函数依赖的决定因素T不包含任意候选码,所以这个关系模式不符合BCNF的要求。
      • 转换为BCNF:为了使该关系模式满足BCNF,将依赖T→J修改为TS→J 。这样修改后,在新的依赖TS→J中,左边的决定因素TS包含了候选键之一S,满足了BCNF中每一个依赖的左边决定因素都包含候选键的条件,此时该关系模式就达到了BCNF。
    • 原始表(不符合BCNF)

      学生ID课程教师
      S001数学王老师
      S002英语李老师

      假设依赖

      教师 → 课程(每个教师只教一门课,但教师不是候选键)。
      问题:存在非平凡依赖(教师 → 课程),左侧不是候选键。

      BCNF规范化后

      学生-教师表(候选键为 (学生ID, 教师)):

      学生ID教师
      S001王老师
      S002李老师

      教师-课程表(教师为候选键):

      教师课程
      王老师数学
      李老师英语

真题示例:

给定关系模式R(U,F),U={A,B,C,D},F={AB→C,CD→B}。关系R( ),且分别有( )。

A.只有1个候选关键字ACB B.只有1个候选关键字BCD

C.有2个候选关键字ACD和ABD D.有2个候选关键字ACB和BCD

A.0个非主属性和4个主属性 B.1个非主属性和3个主属性

C.2个非主属性和2个主属性 D.3个非主属性和1个主属性

候选关键字的求法

根据函数依赖集 F = {AB→C, CD→B},我们可以按照以下步骤求候选关键字:

  1. 找出从未在右边出现过的属性

    • 在 F 中,右边出现的属性是 C 和 B
    • 因此,A 和 D 从未在右边出现过,它们必然是候选键的一部分
  2. 以 A 和 D 为基础,尝试构建候选关键字

    • 尝试 AD:
      • AD⁺ = AD
      • 无法推导出 B 或 C(因为 AB→C 和 CD→B 都需要额外的属性)
      • 所以 AD 不是候选关键字
    • 尝试 ABD:
      • ABD⁺ = ABD → C (AB→C) → ABCD
      • 可以推导出所有属性,因此 ABD 是候选关键字
    • 尝试 ACD:
      • ACD⁺ = ACD → B (CD→B) → ABCD
      • 可以推导出所有属性,因此 ACD 是候选关键字
    • 其他组合(如 AB、AC、AD、BC、BD、CD):这些组合的闭包都无法推导出所有属性,因此不是候选关键字
  3. 结论

    • 候选关键字有 2 个:ABD 和 ACD

主属性和非主属性

  1. 主属性:出现在任何候选关键字中的属性

    • ABD 包含 A、B、D
    • ACD 包含 A、C、D
    • 因此主属性是 A、B、C、D(所有属性都是主属性)
  2. 非主属性:不包含在任何候选关键字中的属性

    • 由于所有属性都是主属性,非主属性数量为 0

设有关系模式R(E,N,M,L,Q),其函数依赖集为F={E→N,EM→Q,M→L}。则关系模式R达到了______;该关系模式_________。

A. 1NF B. 2NF C. 3NF D. BCNF

A. 无需进行分解,因为已经达到了3NF

B. 无需进行分解,因为已经达到了BCNF

C. 尽管不存在部分函数依赖,但还存在传递依赖,所以需要进行分解

D. 需要进行分解,因为存在冗余、修改操作的不一致性、插入和删除异常

第一步:识别所有属性

属性集 U = {E, N, M, L, Q}

第二步:分析函数依赖集 F

F = { E → N, EM → Q, M → L }

第三步:找出从未出现在右边的属性(候选键的必须属性)

  • 在 F 中,右边出现的属性:N, Q, L

  • 从未出现在右边的属性:E, M

  • 因此,E 和 M 必须包含在候选键中

第四步:以 E 和 M 为基础构建候选键

  1. 尝试 EM:

    • 计算 EM⁺:

      • 初始:EM

      • 应用 E→N:EMN

      • 应用 EM→Q:EMNQ

      • 应用 M→L:EMNQL

    • EM⁺ = EMNQL = U(覆盖所有属性)

    • 因此,EM 是候选键

范式分析(基于候选键 EM)

1. 主属性和非主属性

  • 主属性:E, M(出现在候选键中)

  • 非主属性:N, L, Q

2. 检查 2NF(消除部分函数依赖)

  • 检查非主属性对候选键的部分依赖:

    • E→N:N 依赖于候选键的一部分(E),属于部分函数依赖 → 违反 2NF

    • M→L:L 依赖于候选键的一部分(M),属于部分函数依赖 → 违反 2NF

    • EM→Q:Q 完全依赖于整个候选键 → 符合 2NF

  • 结论:不满足 2NF

是否需要分解

  • 存在部分函数依赖和传递依赖,会导致:

    • 数据冗余(如 E→N 导致 N 重复存储)

    • 更新异常(修改 E 对应的 N 需要修改多条记录)

    • 插入异常(无法单独插入 M→L 的信息)

    • 删除异常(删除 EM 会丢失 M→L 的信息)

  • 需要进行分解,因为存在冗余、修改操作的不一致性、插入和删除异常

分解方法

  1. 将部分依赖单独分解:

    • R1(E, N):满足 E→N

    • R2(M, L):满足 M→L

    • R3(E, M, Q):满足 EM→Q

    • 每个关系模式都满足 BCNF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TeamFlow】 1 TeamFlow 去中心化生产协同系统架构

总体架构设计 采用四层混合架构&#xff0c;结合分层设计与去中心化网络&#xff1a; #mermaid-svg-qBgw9wMd8Gi0gOci {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qBgw9wMd8Gi0gOci .error-icon{fill:#552222;}…

宜搭与金蝶互通——连接器建立

一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…

【Linux系统篇】:System V IPC核心技术解析---从共享内存到消息队列与信号量

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 一.System V共享内存&#xff08;重点&#xff09;1.基本概念和原理…

C++ 20 信号量详解

C 20 信号量详解 一、信号量类型 C20 标准中定义了两种信号量&#xff1a; std::counting_semaphore<Max>&#xff1a;计数信号量&#xff08;允许资源池最多有 Max 个资源&#xff09;std::binary_semaphore&#xff1a;二进制信号量&#xff08;等价于 std::countin…

Vue3中provide和inject的用法示例

在 Vue3 中&#xff0c;provide 和 inject 用于实现跨层级组件通信。以下是一个简单的示例&#xff1a; 1. 父组件 (祖先组件) - 提供数据 javascript 复制 // ParentComponent.vue import { provide, ref, reactive } from vue;export default {setup() {// 提供静态数据p…

Spring数据访问全解析:ORM整合与JDBC高效实践

目录 一、Spring ORM集成深度剖析 &#x1f31f; ORM模块架构设计 核心集成特性&#xff1a; 整合MyBatis示例配置&#xff1a; 二、Spring JDBC高效实践指南 &#x1f31f; 传统JDBC vs Spring JDBC对比 &#x1f31f; JdbcTemplate核心操作示例 批量操作优化&#xf…

UE快速预览材质节点快捷键

开始预览节点 添加快捷键 然后按R就能快速预览 不用再右键了 非常方便

Java漏洞原理与实战

一、基本概念 1、序列化与反序列化 (1)序列化:将对象写入IO流中&#xff0c;ObjectOutputStream类的writeobject()方法可以实现序列化 (2)反序列化:从IO流中恢复对象&#xff0c;ObjectinputStream类的readObject()方法用于反序列化 (3)意义:序列化机制允许将实现序列化的J…

每日算法【双指针算法】(Day 1-移动零)

双指针算法 1.算法题目&#xff08;移动零&#xff09;2.讲解算法原理3.编写代码 1.算法题目&#xff08;移动零&#xff09; 2.讲解算法原理 数组划分&#xff0c;数组分块&#xff08;快排里面最核心的一步&#xff09;只需把0改为tmp 双指针算法&#xff1a;利用数组下标来…

SQL Server 的鎖機制

SQL Server 的鎖機制是為了確保數據的一致性和事務的隔離性而設計的。以下是針對讀寫操作的鎖定行為的詳細說明&#xff1a; 1. 鎖的基本類型 SQL Server 的鎖主要分為以下幾類&#xff1a; 共享鎖&#xff08;Shared Lock, S Lock&#xff09; 用於讀操作&#xff08;如 S…

AIP目录

专注于开发灵活API的设计文档。 AIP是总结了谷歌API设计决策的设计文档&#xff0c;它也为其他人提供了用文档记录API设计规则和实践的框架和系统。 基础1AIP目的和指南2AIP编号规则3AIP版本管理200先例8AIP风格与指导9术语表流程100API设计评审常见问题205Beta版本发布前置条…

CSS进度条带斑马纹动画(有效果图)

效果图 .wxml <view class"tb"><view class"tb-line" style"transform:translateX({{w%}})" /> </view> <button bind:tap"updateLine">增加进度</button>.js Page({data: {w:0,},updateLine(){this.…

【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…

zset.

zset 有序集合 zset 保留了 set 不能有重复元素的特点 zset 中的每个元素都有一个唯一的浮点类型的分数&#xff08;score&#xff09;与之关联&#xff0c;使得 zset 内部的元素是可以维护有序性的。但是这个有序不是用下标作为排序依据的&#xff0c;而是根据分数&#xf…

Spring 数据库编程

Spring JDBC 传统的JDBC在操作数据库时&#xff0c;需要先打开数据库连接&#xff0c;执行SQL语句&#xff0c;然后封装结果&#xff0c;最后关闭数据库连接等资源。频繁的数据库操作会产生大量的重复代码&#xff0c;造成代码冗余&#xff0c;Spring的JDBC模块负责数据库资源…

492Q 型气缸盖双端面铣削组合铣床总体设计

一、引言 492Q 型气缸盖是发动机的重要组成部分&#xff0c;其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床&#xff0c;能够提高加工效率和质量&#xff0c;满足发动机生产的需求。 二、总体设计要求 加工精度&…

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…

第三阶段面试题

Nginx nginx常用模块以及其功能 proxy模块&#xff0c;进行代理功能 ssl模块&#xff0c;进行HTTPS协议的使用 gzip模块&#xff0c;进行传输数据的压缩 upstream模块&#xff0c;进行反向代理时使用 static模块&#xff0c;静态资源进行访问的模块 cache模块&#xff0…

鸿蒙NEXT开发键盘工具类(ArkTs)

export declare type KeyboardCallBack (show: boolean, height: number) > void; import { AppUtil } from ./AppUtil; import { LogUtil } from ./LogUtil; import { ArrayUtil } from ./ArrayUtil;/*** 键盘工具类* author 鸿蒙布道师* since 2025/04/18*/ export class…

基于 LabVIEW 的电液伺服阀测试台开发

开发了一种基于 LabVIEW 图形编程语言的自动测试系统&#xff0c;能够完成电液伺服阀的空载流量特性、压力增益特性、内泄漏特性等静态特性的自动测试。针对测试过程中干扰信号频段与正常信号频段接近&#xff0c;普通数字滤波器滤波效果不佳的问题&#xff0c;采用迭代滤波分解…