chapter-5 数据库设计

news2024/11/8 23:36:57

以下课程来源于MOOC学习—原课程请见:数据库原理与应用
考研复习

引言

设计的时候:

我们为什么不能设计成R(学号,课程号,姓名,所咋系,系主任,成绩)?

因为存在数据冗余(存在姓名。所在系,系主任的信息冗余)

因为存在更新异常无法插入学生信息,系 的信息;无法删除学生选课信息)

​ 比如添加学生信息无法添加选课信息,删除学生选课信息可能造成该课程不存在

因为存在数据不一致(修改学生系信息,出现系相同主任不同的情况等)

函数依赖


定义:设 R 为任一给定关系,如果对于 R 中属性 X 的每一个值,R 中的属性 Y 只有唯一值与之对应,则称 X 函数决定 Y 或称 Y 函数依赖于 X ,记作 X—>Y。其中,X 称为决定因素。

通俗一点,就是给定一个 X 都有唯一的 Y。可以理解为函数 y = f(x);

对于任意的 x 都有唯一的 y ,且 y 的取值由 x 决定。

例如:学生号—>学生姓名,学生年龄等等有关该学生的所有信息
反之,像学生姓名不能决定唯一的学生,因为存在同名的可能,这种情况就不能称作函数依赖。或者学生学号确定后,却不能确定课程编号,因为一对多

根据函数依赖性质可分为以下三种:

  • 完全函数依赖 记F
    • 书上定义基本是:如果存在 X 属性集(注意是集合,说明是联合主键)决定 唯一的 Y ,且 X 中的任一子集都不能决定 唯一的 Y,则 Y 完全依赖于 X。
    • 例如:学生数学成绩完全由该学生的学号和数学课决定,所以数学课成绩完全依赖于(学号,数学课)
  • 部分函数依赖 记P
    • 定义和完全函数依赖有一点不一样,就是 X 的属性集中任一子集可以决定唯一的 Y
    • 例如:学生学号和姓名可以决定唯一的学生,但是学生号也可以决定唯一的学生
  • 传递函数依赖 记t
    • 定义:设 R 为任一关系, X Y Z 为其不同的属性子集,若 X —> Y, Y 不决定 X 且 Y —>Z,则有 X —>Z,称为 Z 传递函数依赖于 X
    • 例如:书的出版编号是唯一,版权归出版社所有,所以只能由该出版社出版。所以存在函数依赖:书出版编号—>出版社名,出版社名—>出版社地址,但是出版社名不能决定唯一的出版书编号(除非出版社只出版过一本书,那我没话说?),则有出版社地址传递函数依赖于出版书编号
  • 平凡函数依赖
    • 设 R 为任一关系, X 属于U,Y属于U,且Y属于X,若X->Y成立,称
    • 例如:(学号,姓名)-> 姓名

候选键

定义1:关系R中某一属性或者属性组K的值可以唯一标识一个元组,而其**任意真子集**不可以,则K为候选键(码)

定义2:关系模式R(U)中,k∈U,且U完全依赖于K

比如有关系模式 R (Sno, Sname, Cno, Cname, Sdept, Sloc, Grade),

其中函数依赖集为 F= {Sno → Sname, Sno → Sdept, Sdept → Sloc,Sno → Sloc, Cno → Cname, (Sno, Cno) → Grade }

那么 R 中的码只能是 (Sno, Cno),Sno 或 Cno 并不能唯一标识一个数据(其实就是不能决定 Grade ),所以单独的 Sno 与 Cno 并不能作为码。

所以可得到主属性:Sno, Cno
;非主属性:Sname, Cname, Sdept, Sloc, Grade

因此:

R(学号,课程号,姓名,所咋系,系主任,成绩)

(学号,课程号)-f->成绩 (学号,课程号)-p->姓名

(学号,课程号)-p->所在系 (学号,课程号)-t->系主任

第一范式1NF

范式:

  1. 数据依赖满足一定约束。

​ 补充:关系可以理解为数据表。“关系模式”和“关系”的区别,类似于面向对象程序设计中”类“与”对象“的区别。”关系“是”关系模式“的一个实例,你可以把”关系”理解为一张带数据的表,而“关系模式”是这张数据表的表结构。

第一范式:符合1NF的关系中的每个属性都不可再分

1NF是所有关系型数据库的最基本要求

image-20210121223205278

举例:根据定义R(学号,课程号,姓名,所咋系,系主任,成绩)符合∈1NF

第二范式2NF

2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖

定义:第一范式基础上,每个非主属性 完全依赖于 候选键

但是例子中:(学号,课程号)-p->姓名 (学号,课程号)-p->所在系

image-20210121223604125

分解后解决了数据冗余的问题 和 更新异常的问题

但是仍然存在非主属性系主任对于码学号的传递函数依赖

第三范式3NF

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

定义:第二范式基础上,所有 非主属性 不存在 传递依赖于 候选键

image-20210121223947752

由此可见,符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常 做到2NF或者1NF,但是作为数据库设计人员,至少应该知道,3NF的要求是怎样的。

BCNF

问题:

某公司有若干个仓库;每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;
一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?

答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)

主属性:仓库名、管理员、物品名 非主属性:数量

∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。
∴ 此关系模式属于3NF。
基于此关系模式的关系(具体的数据)可能如图所示:

img

好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?

我们来看以下几种操作:

1.先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可

因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。

2.某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。

3.如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。

从这里我们可以得出结论,在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题,仍然不是 ”好“ 的设计。
造成此问题的原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。

解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖

仓库(仓库名,管理员)
库存(仓库名,物品名,数量)

这样,之前的插入异常,修改异常与删除异常的问题就被解决。
以上就是关于 BCNF

总结

image-20210121225033259

Armstrong公理

引出:我们能否根据给定的依赖集 推出完整的函数依赖集

逻辑蕴含

定义:F是关系模式R 的函数依赖集,X,Y是R 的属性子集,对于R 满足F的关系实例(一行数据)r,如果X->Y都成立,称为F逻辑蕴含X->Y

俗话:每行数据的属性X都能推出Y,则

F逻辑蕴含的所有函数依赖的集合(所有函数依赖),称为函数依赖集记F+

目的:根据给定的(部分)依赖集 推出完整的函数依赖集

补充:XY记为X和Y 的并集

基本推理规则

关系R(U,F) U是属性集

(1)自反律:若Y包含于X,X包含于U,则X->Y为F所蕴含。

(2)增广律:若X->Y为F所蕴含,且Z包含于U,则XZ->YZ为F所蕴含。

(3)传递律:若X->Y及Y->Z为F所蕴含,则X->Z为F所蕴含。

注:为F所蕴含 === 是函数依赖集的一部分

根据上面三条推理规则可以得到下面三条推理规则:

(1)合并规则:由X->Y, X->Z,有X->YZ

(2)伪传递规则:由X->Y,WY->Z,有XW->Z

(3)分解规则:由X->Y及Z包含于U,有X->Z

引理:X->A1A2A3A4…成立的充要条件 X->Ai都成立

image-20210121230050227

属性集闭包

忽略

闭包:闭包就是由一个属性直接或间接推导出的所有属性的集合

例(1): 设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→E,BI→E,CD→I,E→C},计算(AE)+

​ 解: (1) 令X={AE},X(0)=AE

​ (2)在F中寻找尚未使用过的左边是AE的子集的函数依赖,结果是: A→D, E→C;所以 X(1)=X(0)DC=ACDE, 显然 X(1)≠X(0).

​ (3) 在F中寻找尚未使用过的左边是ACDE的子集的函数依赖, 结果是: CD→I;所以 X(2)=X(1)I=ACDEI。虽然X(2)≠X(1),但F中寻找尚未使用过函数依赖的左边已经没有X(2)的子集,所以不必再计算下去,即(AE)+=ACDEI。

​ 例如:f={a->b,b->c,a->d,e->f};由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}

函数依赖集等价

F,G是一个关系模式的两个函数依赖集,如果F+=G+,则称F和G 是等价的

F={AB->C,A->B,B->A} G={A->C,A->B,B->A}

充要条件:一个函数的依赖集F+属于另一个函数依赖集G+的子集

(考察 F+中每个函数依赖是否在G+中,同理)

image-20210121230752401

最小函数依赖集

如果函数依赖的集合满足一下称为:

1.对于函数依赖的右端,将其分解为单个属性。如AB->CD分解为AB->C,AB->D

2.对于函数依赖集F中每一个X->A,计算G=F-{X->A},

​ 判断是否A∈(X)G+ 如果能,在F中删除X->A。

3.对于函数依赖集F中每一个X->A,设X=B1B2B3…

​ 判断是否A∈(X-Bi)F+,如果能,X=X-Bi

https://blog.csdn.net/liudongdong19/article/details/85223697

image-20210121231732883 image-20210121231744261

同理推:5-4 F={A->BC,B->AC,C->A} 结果:Fm={A->B,B->C,C->A}

候选键的判定

关系模式中R(U,F)中,如果K∈U,且U**完全依赖**于K,

U是完全依赖K,不能依赖于K 的任何子集 K才能是候选键

利用Armstrong公理

需要熟练掌握Armstrong

image-20210121232023244

※根据闭包的概念

第一种:因为:U是完全依赖K,不能依赖于K 的任何子集

image-20210122081212068

或者以下重要方法:

※计算候选码的方法

对于给定的关系R(A1,A2,…An)和函数依赖集F,可将其属性分为4类:

L类 仅出现在函数依赖左部的属性。

R 类 仅出现在函数依赖右部的属性。

N 类 在函数依赖左右两边均未出现的属性。

LR类 在函数依赖左右两边均出现的属性

定理:对于给定的R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员

推论:若X(X∈R)是L类属性,且X+包含了R的全部属性;则X必为R的唯一候选码。

例(2):设有关系模式R(A,B,C,D),其函数依赖集F={D→B,B →D,AD →B,AC →D},求R的所有候选码。

解:考察F发现,A,C两属性是L类属性,所以AC必是R的候选码成员,又因为(AC)+=ABCD,所以AC是R的唯一候选码。

定理:对于给定的R及其函数依赖集F,若X(X∈R)是R类属性,则X不在任何候选码中。

定理:对于给定的R及其函数依赖集F,若X(X∈R)是N类属性,则X必包含在R的任一候选码中

推论:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类和N类组成的属性集,且X+包含了R的全部属性;则X是R的唯一候选码。

image-20210121232513545

模式分解

低级模式向高级模式分解 比如1NF---->3NF

将一关系模式R(U,F)分解,成多个关系模式(表),并且各个关系模式(表)的属性并集仍为U,各个关系模式(表)的属性集并不包含,每个关系模式的依赖是在F上的投影

特性:保持了函数依赖,具有无损连接性

关系模式分解的无损连接性和保持函数依赖特性对应分解前后关系的( 语义等价 )和(数据等价 )

  • 数据等价是指分解前后的关系实例表示相同的信息内容,用( 无损连接 )特性来衡量。
  • 语义等价是指分解前后的关系模式上的函数依赖集等价,即有相同的函数依赖集闭包,用(保持函数依赖 )特性来衡量。
  • 关系模式分解的无损连接和保持函数依赖两个特性之间( 没有必然联系 )。

为什么希望分解既具有无损连接性又要保持函数依赖?

  • 分解具有无损连接性,即可保持数据等价,那分解之后得到的新关系就不会有信息内容的丢失。
  • 分解保持函数依赖,即可保持函数依赖等价,那么分解之后数据的语义就不会出差错。
  1. 若分解保持函数依赖,模式总可以分解到3NF。
  2. 若分解具有无损连接性,模式一定能分解到BCNF。
  3. 若分解要保持函数依赖且具有无损连接性,模式可以分解到3NF。可以达到BCNF

但是BC范式的两个特性和BCNF的两个特性不能同时拥有

image-20210122083813149

分解

原来的image-20210122081939623

为了解决对学生信息,系信息,选修信息等新数据冗余,不一致,更新异常等问题,我们不断分解成如下的模式,由满足低级范式的模式逐步分解变成高一级的范式

分解后

image-20210122082037348 image-20210122082824158

分解后,三个关系的属性集没有包含关系,并集为关系R 的属性集,关系R 原有的函数依赖也投影到不同的关系模式上,如果对三个关系模式自然连接,可以回到原有的关系(数据表)

判断是否是无损连接

  • 对于一个分解,有k个子集,n个属性,建立一张k行n列的初始表,对于每一行也就是分解的每个子集,把该分解子集出现的属性对应的列写上ajaj,否则写上bijbij
  • 对于每一个依赖,找到左部属性对应的列,根据行的值分组,对于行的值相同的这些行,查看对应右部属性的列,如果这些格子里有a值,那把所有这些格子改成a值,如果没有,改成行最小的b值。如果某个b值改成a值,那么其他行(不属于当前操作的行)的相同b值也要改成a值
  • 如果不变则停止,如果出现有一行为a1 a2 … an,那么说明该连接为无损连接。
  • https://www.cnblogs.com/zxcoder/p/11963759.html

举例:

已知关系模式R(A,B,C,D,E,G)及R上的函数依赖集F={A→BC, C→D, BC→EG, E→A },有R上的一个分解ρ={R1(A,B,C,D),R2(B,C,E,G)},则该分解( 具有无损连接性,但不保持函数依赖)。

已知关系模式R(A, B, C, D, E)及R上函数依赖集F={A→BC,C→D,BC→E,E→A},则分解ρ={R1(ABCE),R2(CD)}满足( 具有无损连接性、保持函数依赖 )。

满足3NF分解

分为保持依赖和无损连接

为了说明求解保持依赖,我们先要会求最小依赖集

(1)最小依赖集求法:

口诀:右侧先拆单,依赖依次删。 还原即可删,再拆左非单。

通过求下面的最小依赖集对口诀进行解释,

img

(2)口诀:

1、 保函依赖分解题,先求最小依赖集。

2、依赖两侧未出现,分成子集放一边,剩余依赖变子集。

3、若要连接成无损,再添候选做子集。

下面通过几道例题讲解口诀:

例1.已知R(ABCDE), F={A ->D,E->D,D->B,BC->D,DC->A}求保持函数依赖的3NF分解,和具有无损连接性及保持函数依赖的3NF分解

第一步:**保函依赖分解题,先求最小依赖集。**先求出R的最小依赖集,可得F={A ->D,E->D,D->B,BC->D,DC->A}

第二步:**依赖两侧未出现,分成子集放一边。首先可以发现没有不出现在两侧的元素不用单独分出一个子集,“剩余依赖变子集”**然后我们将各依赖分别划分为子集得到:{AD} {ED} {DB} {BCD} {DCA},即为所求保持函数依赖的3NF分解

第三步:若要连接成无损,再添候选做子集。

(1)候选码的求解:所谓候选码即能决定整个关系的,我们通过找未出现在依赖右边的和两侧均未出现的元素即可求得,

(2)可以发现C E未出现在右边,因此候选码为{CE}。故所求具有无损连接性及保持函数依赖的3NF分解为{AD} {ED} {DB} {BCD} {DCA} {CE}

例3:image-20210122084706983

满足BCNF的分解

image-20210122084941498 image-20210122085006681 image-20210122085030654 image-20210122085043760 image-20210122085052221

练习:https://www.icourse163.org/learn/PAEU-1003647009?tid=1460983455#/learn/content?type=detail&id=1237298066&cid=1257135194

" alt=“image-20210122085030654” style=“zoom:80%;” />

image-20210122085043760 image-20210122085052221

练习:https://www.icourse163.org/learn/PAEU-1003647009?tid=1460983455#/learn/content?type=detail&id=1237298066&cid=1257135194

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

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

相关文章

BGP与OSPF混合组网

如图。R1和R2之间是OSPF Area 0,R23和R4之间是OSPF Area 1,R5和R6之间是OSPF Area2。除了R1和R2之间的cost是100,其余链路的cost都是10. AR1/2/3/4/5/6之间通过Loopback口建立IBGP全互联邻居关系,并且都是AS11520,和外部建立EBGP邻居访问100.100.100.1的网络。(不确定图中…

企业内训视频如何防范被盗录和下载?

企业内训视频如何防范被盗录和下载? 1. 【防下载】:实现视频文件的加密混淆、防下载; 2. 【防录屏】:A.(ID跑马灯防录屏)实现不同学员观看视频,实时显示该学员的姓名手机号时间;B.&…

线性代数 --- 最小二乘在直线拟合上的应用与Gram-Schmidt正交化(下)

在上一篇文章中,通过一个例子来说明最小二乘在拟合直线时所发挥的作用,也通过两个插图的比较进一步的阐明了投影与最小化e之间的密切关系。 线性代数 --- 最小二乘在直线拟合上的应用与Gram-Schmidt正交化(上)_松下J27的博客-CSD…

【UE Sequencer系列】08-副镜头切换、摄像机绑定摇臂的使用、摄像机绑定滑轨的使用

目录 一、副镜头切换 二、摄像机绑定摇臂的使用 三、摄像机绑定滑轨的使用 一、副镜头切换 1. 为“shot_05”新建镜头(复制资产,创建新的关卡序列) 同样的步骤再创建一个“Shot_07_02” 此时我们就可以对“Shot_07”中的两个副镜头进行切换…

最简单明了vite+ts+sass无loaders配置,利用ts读取scss文件中的变量并在App.vue中使用

做后端的,前端水平有限,最近练手,遇到了左侧菜单是展开关闭的问题,接触到了scss中定义全局变量,利用typescript读取的问题,在此记录一下 vitetssass 环境:package.json中内容如下,…

利用KMean算法进行分类

什么是KMean算法?简要说明什么是KMean算法,以及KMean算法的应用场景。 KMeans是一种聚类算法,它将数据集分成K个不同的类别(簇),使得每个数据点都属于一个簇,并且每个簇的中心点(质…

网络通信的安全性(HTTPS)

网络通信的安全性(HTTPS) 互联网是由无数网络节点组成的,两点之间的通信一般会经过很多个网络节点,因此,我们难免会有疑问: 作为发送方,我发送的消息内容会不会被中间人看到?&…

4.2 矩阵乘法的Strassen算法

1.伪代码以及用到的公式 ​ ​ ​ 2.代码 package collection; ​ public class StrassenMatrixMultiplication {public static int[][] multiply(int[][] a, int[][] b) {int n a.length;int[][] result new int[n][n]; ​if (n 1) {result[0][0] a[0][0] * b[0][0]…

为什么是毫末智行成为了DriveGPT的破壁人?

作者 | 魏启扬 来源 | 洞见新研社 毫末智行有着天生的紧迫感。 很多科技公司一年才举办一次的品牌日活动,毫末智行硬是办成了一个季度一次,活动频次的提高,则意味着组织内部新陈代谢的提速,从研发到落地乃至运营,都要…

ChatGPT 这个风口,普通人怎么抓住?

最近在测试ChatGPT不同领域的变现玩法,有一些已经初见成效,接下来会慢慢分享出来。 今天先给大家分享一个,看完就能直接上手的暴力引流玩法。 所需工具: 1)ChatGPT(最好是plus版,需要保证快速…

一个开源的大型语言模型LLaMA论文简单解读,LLaMA: Open and Efficient Foundation Language Models

一个开源的大型语言模型LLaMA论文解读,LLaMA: Open and Efficient Foundation Language Models返回论文和资料目录 1.导读 LLaMA 是 Meta AI 发布的包含 7B、13B、33B 和 65B 四种参数规模的基础语言模型集合,LLaMA-13B 仅以 1/10 规模的参数在多数的 …

ASEMI代理AD8638ARJZ-REEL7原装ADI车规级AD8638ARJZ-REEL7

编辑:ll ASEMI代理AD8638ARJZ-REEL7原装ADI车规级AD8638ARJZ-REEL7 型号:AD8638ARJZ-REEL7 品牌:ADI /亚德诺 封装:SOT-23-5 批号:2023 安装类型:表面贴装型 引脚数量:5 类型&#xff1…

初谈 ChatGPT

引子 最近,小编发现互联网中的大 V 突然都在用 ChatGPT 做宣传:“ChatGPT不会淘汰你,能驾驭ChatGPT的人会淘汰你”、“带领一小部分人先驾驭ChatGPT”。 确实,ChatGPT这个新生事物,如今被视为蒸汽机、电脑、iPhone 般的…

【ChatGPT 】国内无需注册 openai 即可访问 ChatGPT:ChatGPT Sidebar 浏览器扩展程序的安装与使用

一、前言 问题:国内注册 openai 账号麻烦,新必应有部分人也无法登录成功,存在域名单点登录失败等问题,所以无法真正使用 ChatGPT 解决:大部分人仅需使用 ChatGPT 的搜索功能,无需真正对话,需要…

云计算技术的现状和未来发展趋势分析

近年来,随着互联网、物联网、大数据等技术的不断发展,云计算技术也随之崛起并迅速发展。云计算技术作为一种新的计算模式,不断地改变着我们的生活和工作方式,成为了当今IT产业的一股强大的力量。本文将详细探讨云计算技术的现状和…

第十天面试实战篇

目录 一、springboot的常用注解? 二、springmvc常用注解? 三、mysql的内连接和外连接有什么区别?比如有两张表:A和B内连接只返回两个表A和B的交集部分 四、redis分布式锁的缺点有哪些? 五、如何使用reddssion解决r…

多个渠道成功销售的秘诀速递

将您的电子商务业务扩展到多个渠道销售似乎是一项艰巨的任务吗?但如果有了正确的多渠道增长战略,这可能是实现快速增长的好方法。当然,您需要考虑借助一些工具与策略,而SaleSmartly(ss客服)可以为您提供。 …

Python做个猫狗识别系统,给人美心善的邻居

嗨害大家好鸭!我是爱摸鱼的芝士❤ 宠物真的看着好治愈 谁不想有一只属于自己的乖乖宠物捏~ 这篇文章中我放弃了以往的model.fit()训练方法, 改用model.train_on_batch方法。 两种方法的比较: model.fit():用起来十分简单&#…

【剧前爆米花--爪哇岛寻宝】java文件操作和io流

作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是一篇关于文件操作的文件,介绍了文件读写以及相关对象的内容,希望对你有所帮助! 目录 文件操作 文件路径 绝对路径 相对路径 File类 File类的构造方…

REDIS Hash 槽 与 一致性hash

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…