数据库原理与应用系列_04函数依赖

简介: 在关系数据库系统中,关系模型包括一组关系模式,并且关系之间不是完全孤立的(主外键)。设计一个合适的关系型数据库系统,关键是设计关系型数据库的模式。

一、规范化理论的主要内容



关系数据库系统中,关系模型包括一组关系模式,并且关系之间不是完全孤立的(主外键)。

设计一个合适的关系型数据库系统,关键是设计关系型数据库的模式。

具体包括:


【1】数据库当中应包括多少个关系模式(可以理解为表)。

【2】每一个关系模式应该包括哪些属性(描述对象的特征)。

【3】如何将这些相互关联的关系模式组建成一个完整的数据库 。

关系数据库的规范化理论主要包括三个方面的内容:

【1】函数依赖

【2】范式

【3】模式设计

如果不使用关系型数据库的规范化理论,可能导致以下问题:

【1】数据冗余

【2】插入异常

【3】删除异常

【4】更新异常

e53b8fe634374ee09464116df91b1bfd.png

将所有数据都存在一张大表上面,则叫做泛模式。

泛模式就是存储了所有数据的一张大表。

例如Student关系模式就是一个泛模式:

6ec0e2e5345f452f88f97f5d3b207ef2.png

1d6430d4608e4546a1bbe1777ecdf37d.png

由于泛模式有很多问题,因此我们需要使用函数依赖将泛模式切割成许多小的表。把泛模式合理的分解成若干模式后可以使每个关系模式的结构清晰和简洁。

一个规范的关系模式应该具备以下四个条件:

【1】尽可能少的数据冗余

【2】没有插入异常

【3】没有删除异常

【4】没有更新异常

92070a65b05c48e791682b39dec37e71.png


二、数据依赖



数据依赖:指的是关系模式中的各属性之间相互依赖,相互制约的联系。

数据依赖分为:

【1】函数依赖

【2】多值依赖


函数依赖是最重要的数据依赖。


1、函数依赖


函数依赖分为完全函数依赖,部分函数依赖和传递函数依赖。

  1. 函数依赖(FD)

是关系模式中属性之间的一种逻辑依赖关系。在一个表里面,属性X可以映射到属性Y,也就是说知道了X就能确定Y,称X为决定因素。

一个特定的X决定一个特定的Y(是一对一的关系)

19c52cd1ae8b4e80a2be4265ef03b615.png

例如:

有一个关系模式S(Sno,Sname,Sage)

如果知道了一个学生的学号Sno,那我就能确定他的姓名Sname和年龄Sage。

b6873d08e36b44e1b51e9e22437cc516.png

知道了一个学生的姓名也是可以确定其他属性的,这也是满足函数依赖关系的。(前提示学生的姓名没有重名的情况,否则就不是函数依赖了)


2、完全函数依赖


  1. 完全函数依赖

如果我想知道某位学生的某一门课的成绩Grade,那我必须得同时知道他的学号Sno和课程号Cno。

但如果我只知道一部分信息,比如他的Sno或者Cno可以吗?答案是不行的!此时称Y[Grade]完全依赖于X[Sno,Cno]。

57e85cd20c3d430b8d62fb5858db4395.png

0b62f83ddd8a4340b4503f1ba12d4563.png

3、部分函数依赖


  1. 部分函数依赖

如果我想知道某位学生的姓名Sname,那我知道他的学号Sno就可以了。也就是说Y[Sname]只函数依赖于X[Sno,Cno]中的子集x[Sno],此时称Y部分函数依赖于X。

121db0caabe344fd85ab0b3cce4113c2.png

31527732c217454b9db9ee9b764ce5ac.png01bf41b0a5314a52a3dbc7193c3cd860.png

只有左边是组合的情况下才有可能出现部分函数依赖

0ef16ed2e18d4ff082b1da9b3cd91bf9.png


4、传递函数依赖


传递函数依赖

有一个关系模式S(Sno,Sdept,Mname)

如果我知道了一个学生的学号Sno,那我就能知道他所在的系Sdept。

如果我知道了某一个系Sdept,那么我就能知道这个系的系主任的姓名Mname。

也就是说,我知道了一个学生的学号Sno,其实我就知道了他所在系的系主任的姓名Mname。但这个过程中,他们是不存在直接函数依赖的,我需要通过系名称Sdept作为一个桥梁去把二者联系起来的。

7ec6f79ee6624b40ad96a4bc86cac3d4.png

注意:这里Sdept无法反推出Sno

7919f1deae28436c86b30de9d62d402f.png

仅通过完全函数依赖和部分函数依赖的特性来区分函数依赖的特性是,传递函数依赖可能是一种完全函数依赖,也可能是一种部分函数依赖。


可以通过函数依赖传递过程中是否存在部分函数依赖来进行区分。若函数依赖的传递过程均发生在完全函数依赖上,则产生的传递函数依赖是一种完全函数依赖,否则为部分函数依赖。


5、平凡函数依赖


当属性集Y是属性集X的子集时,必然存在函数依赖X-》Y。这种类型的函数依赖称为平凡函数依赖。


例如:(SNo,SN,Age)唯一确定的时候,它的任意子属性集合(SNo)必然唯一确定。


如果Y不是X的子集,则成X-》Y为非平凡的函数依赖。


若不特别声明,考虑的都是非平凡的函数依赖。

546b8408d6bb414ab155343a79ee4db7.png


定义:设关系模式R(U,F),U是属性的全集,F是由U上的函数依赖所构成的集合,X和Y是U的子集,如果对于R(U)的任意一个可能的关系r,对于X的每一个具体值,Y都有唯一的具体值与之对应,则称X决定Y,或者Y函数依赖于X。


【1】函数依赖是语义范畴的概念


【2】函数依赖不是关系模式R的某个或者某些关系实例的约束条件,而是关系模式R之下一切可能的关系实例都要满足的约束条件。


【3】函数依赖与属性之间的联系类型有关


在一个关系模式当中,如果属性X与Y有1:1联系时,则存在函数依赖X->Y , Y->X

即X<->Y


如果属性X与Y有m : 1的联系时,则只存在函数依赖X->Y


如果属性X与Y有m : n的联系时,则X与Y之间不存在任何的函数依赖


【4】函数依赖与时间无关(因为关系模型是静态的,关系实例是动态的)



6、逻辑蕴含与闭包【期末必考】


  1. 逻辑蕴含

设F是关系模式R(U)中的一个函数依赖集合,X, Y是R的属性子集(指的是投影),如果从F中的函数依赖能够推导出X→Y,则称F逻辑蕴涵X→Y, 或称X→Y是F的逻辑蕴涵。


比如:F含有依赖关系A→B,B→C, 则可推出A→C,所以F逻辑蕴含A→C


闭包

被F逻辑蕴涵的所有函数依赖集合称为F的闭包(Closure),记作 F+。


闭包是由关系模式R直观得到的函数依赖F所推出的所有隐含的或未隐含的(直观的)函数依赖的集合。


示例:设属性集U为XYZW,函数依赖集为{X→Y,Y→Z,W→Y,YZ→W},则:


X+=XYZW


Y+=YZW


(XW)+=XYZW


对于计算闭包,先把自己自身写出来,拿上面的X+来举例:


【1】X→X

【2】X→Y

【3】Y→Z

【4】YZ→W

8ead40d2f0744d41b1ec3c3fc48e1cd9.png

因此X+=XYZW

96e128c64da3474095f48cfa2f6c7f03.png

三、Armstrong公理



Armstrong公理系统设关系模式R<U,F>,其中U为属性集,F是U上的一组函数依赖,那么有如下推理规则:

① A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;


② A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;


③ A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。


根据上面三条推理规则,又可推出下面三条推理规则:


④ 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;


⑤ 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;


⑥ 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。

f140592e43f544b6b838555d6e57e91a.png

例题一: 1、关系模式R(A.B.C.D.E)的函数依赖有AB一C和C.D一E.如果AB和D每个最多有三个不同的取值,则E最多有多少个不同的取值?

解:

根据笛卡尔积,AB共有3*3=9,因此C有9种,D最多三种,因此E最多27种。

例题二:

09f33b363b174dbeae6254e1712da248.png


四、码


1、候选码

2b00fe8648da4b85b1d5a15d705c48e2.png


相关文章
|
2天前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
10天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
24 3
|
10天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
24 2
|
19天前
|
XML 存储 数据库
XML在数据库中有哪些应用?
【10月更文挑战第17天】XML在数据库中有哪些应用?
19 2
|
21天前
|
供应链 数据库
数据库事务安全性控制有什么应用场景吗
【10月更文挑战第15天】数据库事务安全性控制有什么应用场景吗
|
2天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
13 4
|
25天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
58 3
Mysql(4)—数据库索引
|
11天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
50 2
|
14天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
58 4
|
19天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?
下一篇
无影云桌面