数据库系统(六)数据库范式 | 函数依赖,一二三范式,BCNF,属性集闭包和正则覆盖

文章目录

  • 1 好的关系设计的特征
  • 2 函数依赖关系
  • 3 Normal Forms 规范形式
    • 3.1 一二三范式
      • 3.1.1 基本概念
      • 3.1.2 判断是否满足3NF
    • 3.2 BCNF
      • 3.2.1 基本概念
      • 3.2.2 判断是否满足BCNF
      • 3.2.3 分解得到BCNF
  • 4 属性集闭包和正则覆盖
    • 4.1 属性集闭包求法
    • 4.2 属性集闭包应用
      • 4.2.1 测试某个属性集是否为超键
      • 4.2.2 测试一个属性是否无关属性
    • 4.3正则覆盖Canonical Cover

1 好的关系设计的特征

好的设计

​ 要避免冗余

​ 要避免更新、删除或者插入异常

那么为了在设计中进行好的设计

就应该合理的分解表格

但是有些时候分解会造成一些不好的影响——会产生有损分解或者无损分解

所什么是无损分解,什么是有损分解?

判断方式一

对于关系R,分解为R1和R2

讲两个分解后的表R1,R2做自然连接,如连接后和原来表R相等,则是无损分解。

如果自然连接后产生了原理表R没有的元组,则为有损分解

判断方式二

对于关系R,分解为R1和R2

如果R1和R2的交集是R1或者R2其中之一的超键则为无损分解,否则为有损分解

2 函数依赖关系

函数依赖 Functional Dependencies,就是初中高中学习的判断一个对应关系是否为函数

很简单,就是一个x对应唯一一个y

需要先着重理解两个概念

平凡函数依赖 Trivial Functional Dependencies

如果x->y,即y是x的函数,同时y又是x的子集,那么就说x到y是平凡函数依赖

平凡的含义就是显而易见的,为什么叫显而易见呢?子集我们可以理解为信息的一部分,信息相对原来变少了,那么因为知道更多的信息肯定可以推出更少的信息的,所以这个x-》y的函数依赖关系是显而存在的

举这样一个例子

(学生ID,姓名)->(姓名)

其中x是(学生ID,姓名),y是(姓名)

那么如果知道了学生ID,姓名,肯定可以得到唯一的姓名

非平凡函数依赖

而如果y不是x的子集,那么就不那么明显了,所以是非平凡函数依赖

再理解两个概念,部分函数依赖和完全函数依赖

理解部分函数依赖和完全函数依赖

部分函数依赖(Partial Functional Dependency)(候选码): 部分函数依赖是指在关系中,

比如x->y的函数依赖,y只依赖x的一部分,那么则是部分函数依赖,x还可以再拆分

举个例子,假设有一个包含以下属性的关系表:

  • 学生ID(StudentID)
  • 课程号(CourseID)
  • 学生姓名(StudentName)

(学生ID,课程号)是可以推出学生姓名的

而只有学生ID也可以推出决定学生姓名,所以可以继续拆分,为部分函数依赖,换句话说x的子集也能推出决定右边

完全函数依赖(Full Functional Dependency)(超码):完全函数依赖是指在关系中,

比如x->y的函数依赖,y依赖x的全部,那么则是全部函数依赖,x不可以再拆分

换句话说x的子集不能推出决定右边

包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
不包含在任何候选码中的属性称为非主属性(Nonprime attribute)

在这里插入图片描述

总结来看:我们更期望非平凡函数依赖和完全函数依赖

函数依赖的闭包 Closure of Functional Dependencies

函数依赖闭包表示为 F + F^+ F+

函数依赖的闭包是一个属性集合,它包含了一个给定的属性集合关于另一个属性集合的所有可能依赖,所有的可能的函数关系

如何求函数依赖的闭包

利用

Armstrong’s Axioms 阿姆斯特朗公理

阿姆斯特公理有三条

  1. 自反率(Reflexivity Axiom): 如果X是一个属性集合,那么X的任何子集都可以推出X,表示为X → X。这意味着一个属性集合的所有子集都具有相同的函数依赖。
  2. 扩展律(Augmentation Axiom): 如果X → Y,并且Z是一个属性集合,那么XZ → YZ。这个公理表示如果一个属性集合X决定另一个属性集合Y,那么在X的基础上添加属性Z也会决定Y。
  3. 传递律(Transitivity Axiom): 如果X → Y和Y → Z,那么X → Z。这个公理表示如果一个属性集合X决定另一个属性集合Y,同时Y又决定另一个属性集合Z,那么X也会决定Z。

另外的

  1. Union Rule(并集规则): Union Rule 允许我们将两个函数依赖合并成一个更大的函数依赖。规则表述如下:

    如果 X → Y1 和 X → Y2,那么 X → (Y1 ∪ Y2)。

    这意味着如果属性集合 X 决定属性集合 Y1,同时 X 也决定属性集合 Y2,那么 X 也决定属性集合 (Y1 ∪ Y2),也就是 Y1 和 Y2 的并集。

  2. Splitting Rule(拆分规则): Splitting Rule 允许我们拆分函数依赖,将一个函数依赖分成两个更小的函数依赖。规则表述如下:

    如果 X → (Y1 ∪ Y2),那么 X → Y1 和 X → Y2。

    这意味着如果属性集合 X 决定属性集合 (Y1 ∪ Y2),那么 X 也分别决定属性集合 Y1 和属性集合 Y2。这可以用于将一个大的函数依赖分解成多个小的函数依赖。

  3. Pseudotransitivity Rule(伪传递规则): Pseudotransitivity Rule 允许我们在两个已知的函数依赖关系之间推导出一个新的函数依赖。规则表述如下:

    如果 X → Y1 和 Y1Z → Y2,那么 XZ → Y2。

    这意味着如果属性集合 X 决定属性集合 Y1,同时 Y1Z 决定属性集合 Y2,那么属性集合 XZ 也决定属性集合 Y2。这个规则有点类似于传递性,但不完全相同,因此称为伪传递规则。

通过上面的,我们可以求得一个函数依赖关系的闭包,我从网上找到了一道题,但感觉求这个意义不大

image-20231228170252613

3 Normal Forms 规范形式

3.1 一二三范式

3.1.1 基本概念

规范形式(Normalization Forms,通常缩写为NF)是数据库设计中的一组标准,用于确保数据库表的结构满足一定的标准,以提高数据的一致性、避免数据冗余,并提高数据库性能。最常见的规范形式包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

  1. 第一范式(1NF)
    • 第一范式要求数据库表中的每个列都包含不可分割的、原子的数据,也就是每个单元格只包含一个值。此外,表中的每个行都应具有唯一的标识,通常通过一个主键来实现。1NF消除了重复的列和组合列。
  2. 第二范式(2NF)
    • 第二范式要求在1NF的基础上,确保非主键属性完全依赖于主键。这意味着非主键属性不会部分依赖主键,也就是没有部分函数依赖。如果存在部分函数依赖,需要将表进行拆分,以确保每个非主键属性都依赖于整个主键。通常,2NF适用于具有复合主键的表。
  3. 第三范式(3NF)
    • 第三范式要求在2NF的基础上,消除传递依赖。传递依赖指的是非主键属性依赖于主键以外的非主键属性。如果一个非主键属性依赖于另一个非主键属性,而这个属性又依赖于主键,就存在传递依赖。为了满足3NF,需要将数据库表进行拆分,以确保每个非主键属性只依赖于主键。

实际上3NF达到的效果就是 尽可能保证 非主键属性完全依赖于主建且只依赖于主键

规范形式的目标是减少数据冗余、提高数据一致性,并简化数据库结构,以便更容易维护和查询数据。虽然1NF、2NF和3NF是最常见的规范形式,但还有更高级别的规范形式,如巴斯-科德范式(BCNF)和第四范式(4NF),它们进一步强化了数据库设计的要求。

总结

第一范式:简单说 列不能再分

第二范式:简单说 建立在第一范式基础上,消除部分依赖

第三范式:简单说 建立在第二范式基础上,消除传递依赖。

BCNF是对3NF的改进,消除了对主键子集的依赖

3.1.2 判断是否满足3NF

在这里插入图片描述

3.2 BCNF

3.2.1 基本概念

Boyce-Codd Normal Form(巴斯-科德范式(BCNF))是Third Normal Form 的一种扩展,因此有时候也被称为3.5范式

  • Boyce-Codd Normal Form(巴斯-科德范式)
  • 在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)
  • 巴斯-科德范式(BCNF)是第三范式(3NF)的一个子集,即满足巴斯-科德范式(BCNF)必须满足第三范式(3NF)。通常情况下,巴斯-科德范式被认为没有新的设计规范加入,只是对第二范式与第三范式中设计规范要求更强,因而被认为是修正第三范式,也就是说,它事实上是对第三范式的修正,使数据库冗余度更小。这也是BCNF不被称为第四范式的原因。某些书上,根据范式要求的递增性将其称之为第四范式是不规范,也是更让人不容易理解的地方。

3.2.2 判断是否满足BCNF

判断每一个是否是超码,有一个不是就不是

a is a superkey for R

在这里插入图片描述

因为Sno→Sdept中Sno不是超码
Sdept→Mname中Sdept不是超码

3.2.3 分解得到BCNF

怎么分解得到呢?

对于x->y

分解为x并y和R-(y-x)

4 属性集闭包和正则覆盖

4.1 属性集闭包求法

ps:可以理解为X+表示所有X可以决定的属性

求取属性集闭包的步骤:

设要求的闭包属性集是Y,把Y初始化为X.
检查函数依赖集F中的每个函数依赖A->B,如果属性集A中的所有属性都在Y中,而B中有属性不在Y中,则将其加入到Y中。
重复第二步,直到没有属性可以添加到Y中为止。最后得出的Y就是X+。
*例子:*设有关系模式R(M,N,X,Y,Z)其依赖集F={M->H,H->Z,Y->Z,N->Y,Z->M}。求M+,MH+
第一步:设要求的闭包属性集是Y,把Y初始化为X.
令X={M},我们先看M->H,由于函数依赖M->H左边的所有属性都在X中,而右边H不在X中,所以可以把H添加到X 中,此时X={M,H}

然后按照顺序我们再看H->Z,我们不难发现函数依赖H->Z左边的所有属性都在X中,右边的属性Z又不在X中,仍旧添加,这时X={M,H,Z}

下一个

Y->Z,可以发现Y属性不在X中,条件不满足
N->Y,可以发现N属性不在X中,条件不满足
Z->M,Z属性在X中条件满足,但右边M也在X中条件不满足。

属性判断完 ,那么属性M的闭包:M+=MHZ。

4.2 属性集闭包应用

4.2.1 测试某个属性集是否为超键

他的闭包如果包含所有属性,则为超集

4.2.2 测试一个属性是否无关属性

右边多余

如果前面的属性集闭包可以包括后面的,即可以删除无关的

在这里插入图片描述

左边多余

还可以计算函数依赖闭包,测试函数依赖是否成立

范式判断的三个步骤以及各个范式标准(1NF,2NF,3NF,BCNF,4NF)_如何判断1nf2nf3nf和bcnf-CSDN博客

4.3正则覆盖Canonical Cover

一.使用合并律将所有左部相同的函数依赖合并成一个

设有一函数依赖集F,其中有{A→B,A→E,……},则将这两个函数依赖合并为{A→BE,……}

二.在合并后的函数依赖集中寻找一个无关属性,将它删除

重复一二,直到每个元素都不是无关元素,无法再删,故解得正则覆盖

例题可以参考

正则覆盖的求法与判断属性是否冗余-CSDN博客

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

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

相关文章

WPF+Halcon 培训项目实战(7):目标匹配助手

前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。 相关链接 微软系列技术教程 WPF 年度公益课程 Halcon开发 CSD…

Windows定时重启Tomcat

项目场景: 系统:Windows 7 Tomcat:apache-tomcat-8.0.5 JDK:1.8 问题描述 最近项目的Tomcat隔一段时间就假死,最后想到的解决方式就是:每天凌晨1点重启tomact。 解决方案: 使用Windows系统…

飞企互联-FE企业运营管理平台 登录绕过漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外,支持企业B2B、C2B与O2O等核心需求,为不同行业客户的互联网转型提供支持。 0x02 漏洞概…

系列四、Eureka自我保护

一、Eureka自我保护 1.1、故障现象 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。如…

TCP 协议为什么要设计三次握手 TCP 协议,是一种可靠的,基于字节流的,面向连接的传输层协议。

文章目录 TCP 协议为什么要设计三次握手TCP 协议,是一种可靠的,基于字节流的,面向连接的传输层协议。TCP 通信双方的数据传输是通过字节流来实现传输的客户端向服务端发送连接请求并携带同步序列号 SYN。 今天我们来谈谈tcp的三次握手 TCP 协…

基于yolov2深度学习网络的血细胞检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1YOLOv2算法原理 4.2 YOLOv2网络结构 4.3 血细胞检测算法实现 数据集准备 数据预处理 网络训练 模型评估与优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MAT…

特征归一化及其原理--机器学习

归一化是数据预处理中的一种常见操作,其目的是将不同特征的数值范围统一或缩放到相似的尺度。这有助于提高模型的性能,加速模型的收敛,并使模型更加稳健。以下是进行归一化的一些原因和原理: 消除特征间的尺度差异: 不…

一招搞定msvcr100.dll缺失问题,msvcr100.dll丢失的多种解决方法

msvcr100.dll是Microsoft Visual C 2010 Redistributable Package的一部分,它是运行许多基于Windows操作系统上的应用程序所必需的动态链接库文件。如果该文件安装不正确、丢失或损坏,则使用该文件的应用程序将无法正常启动,会出现“无法启动…

数据库开发之事务和索引的详细解析

2. 事务 场景:学工部整个部门解散了,该部门及部门下的员工都需要删除了。 操作: -- 删除学工部 delete from dept where id 1; -- 删除成功 ​ -- 删除学工部的员工 delete from emp where dept_id 1; -- 删除失败(操作过程中…

微信小程序开发系列-07组件

在开发小程序的过程中会遇到一个常见的问题,怎样将其他同事提供的样式或者第三方的样式载入自己的工程,本文基于这个问题为索引,探索下小程序的组件。 什么是组件 组件是视图层的基本组成单元。组件自带一些功能与微信风格一致的样式。一个…

统一入口,全面提升工作效率,WorkPlus超级APP引领数字化办公新潮流

在数字化办公的时代,企业往往面临着多个应用管理的挑战。员工需要在众多应用之间切换,记忆不同的登录凭证,这不仅分散了注意力,还降低了工作效率。为了应对这一问题,企业需要一站式的解决方案,通过整合繁杂…

SAP缓存 表缓存( Table Buffering)

本文主要介绍SAP中的表缓存在查询数据,更新数据时的工作情况以及对应概念。 SAP表缓存的工作 查询数据 更新数据 删除数据 表缓存的概念 表缓存技术设置属性 不允许缓冲: 允许缓冲,但已关闭: 缓冲已激活: 已…