数据库原理与应用系列_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


相关文章
|
1月前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
6天前
|
人工智能 容灾 关系型数据库
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
|
1月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
1月前
|
SQL 测试技术 数据库
|
1月前
|
存储 缓存 网络安全
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
|
1月前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
69 2
|
6天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
24 3
|
6天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
28 3
|
6天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
33 2