本篇内容是https://www.bilibili.com/video/BV1Bq4y1Y7GC的笔记
关系理论
函数依赖
- 非平凡的函数依赖:X推出Y,但Y不是X的子集
- 平凡的函数依赖:X推出Y,且Y是X的子集
- 完全函数依赖:X推出Y,且对于X的任意真子集X‘,都有X’不能推出Y
- 部分函数依赖:Y不完全函数依赖于X,如有A推出C,又有AB推出C,则C是部分函数依赖AB的,会造成数据冗余
码
候选码
一个属性组,通过该属性组推出所有属性,且该属性组的任意子集都不能再推出所有属性,即满足完全函数依赖的前提下的最小属性组
例:集合\(U=\{A,B,C,D,E,G\}\),函数依赖集\(F=\{AB\rarr C, CD \rarr E , E\rarr A, A\rarr G\}\)
方法:
找出一定属于、可能属于与不属于后续码的属性:
- 一定属于:属性只出现在左边,或者左右都没出现
- 可能属于:属性左右都出现
- 不属于:属性只出现在右边
上面B和D只出现在左边,没有同时出现的属性,因此和D一定属于候选码
A、C和E左右都有,则这三个是可能属于候选码的属性
G只在右边出现,则G不属于候选码
对确定的属性求闭包,若不能构成候选码,则将确定的属性和待定的属性组合,求闭包,直到得到的属性组可以推出全部属性
如对上面的属性组求闭包
首先对确定的属性BD求闭包:\((BD)^0=BD, (BD)^1=BD\),此时BD的闭包等于BD,而非全部属性,因此考虑添加待定属性
对属性BDA求闭包:\((BDA)^0=BDA, (BDA)^1=BDACG, (BDA)^2=BDACGE\),此时已经可以推出全部属性,则是候选码
以此类推,\(\{(BDA), (BDC), (BDE)\}\)都是U在F下的候选码
注意:闭包还可以判断X推出Y是否成立,当Y属于X的闭包时,有X推出Y
超码
能推出所有属性的属性组和集合,候选码是超码的子集
主码
当有多个候选码时,可以挑出一个作为主码,简称码
主/非主属性
- 主属性:包含在任何一个候选码中的属性
- 非主属性:不包含在任何一个候选码中的属性
外码
关系模式R中,若有一个属性或属性组X,他不是R的码,但X是另一个关系模式S中的码,则X是R的外码
全码
整个属性组中都是码
范式
1NF
所有属性都是不可分割的数据项,即表中每个单元格都只能包含单一的数据,不能有重复组或嵌套结构,这是满足关系数据库的最低要求
2NF
在满足1NF的前提下,不包含非主属性对码的部分函数依赖,即每一个非主属性都完全函数依赖于码
3NF
在满足2NF的前提下,不包含非主属性对码的传递函数依赖,传递函数依赖指若存在\(A\rarr B\)和\(B\rarr C\),则C传递依赖于A
BCNF
每一个非平凡的函数依赖\(X\rarr Y\),X都必须是一个候选码
表现在函数依赖集中,左边的部分都要包含整个候选码
判断与分解方法
设关系\(R\{A,B,C,D\}\)
2NF:
若码是AB,F中为\(\{A\rarr C, AB\rarr D\}\),C只需要A就能推出,则C部分函数依赖于AB,不是2NF
若要分解为2NF,只需将不符合要求的拿出来,分为\(R\{A,B,D\}\)和\(R\{A,C\}\)
3NF:
若码是AB,F中为\(\{AB\rarr C, C\rarr D\}\),不存在部分函数依赖,但是对于D需要AB推出C后间接推出D,则D传递函数依赖于AB,不满足3NF
若要分解为3NF,同样将不符合要求的拿出来,分为\(R\{A,B,C\}\)和\(R\{C,D\}\)
BCNF:
若R是\((A,B,C)\),F是\(\{AC\rarr B, AB\rarr C, B\rarr C\}\),候选码则是AC和AB,对于\(B\rarr C\)决定因素B不包含码,则不是BCNF
最小函数依赖集
求最小函数依赖集的方法:
拆分右侧:类似把\(A\rarr BC\)拆为\(A\rarr B\)和\(A\rarr C\)
去除自身求闭包:将当前关系去掉,求该关系的闭包,若可以通过其他关系得到右侧,则直接删除当前依赖关系
左侧最小化:对于目前保留下来的关系,观察左侧是否有能相互推出的,若有可以直接删除被推出的那个
如\(ACD\rarr B, C\rarr A\),就可以删除ACD中的A
模式分解
准则:无损连接,保持函数依赖
无损连接:分解后再次自然连接,与分解前相同
判断无损连接的方法:
- 画表格,列出所有的属性,有多少个属性就画多少属性列,行表示分解后的关系,有几个关系就画几个关系行
- 根据每一行的关系判断,找出关系中的每个属性对应第几列,在相应位置标上\(a_j\),j为列数,其余关系中不存在的属性标为\(b_{ij}\)
- 依次对函数依赖集中的各个依赖关系进行考察,如有\(XY\rarr Z\),在属性列中找到X和Y,观察X和Y的行列上是否有相同的标记(b下标相同),若有则查看他们对应在属性列Z上的各个标记,其中若有\(a_j\)则将属性列上的这些标记全改为\(a_j\),若没有则找到i值最小的\(b_{ij}\),将这些标记全改为它
- 反复执行以上操作,直到某一行全变为a,表明具有无损连接性,否则不具有无损连接性
关系语言
关系代数语言
设有关系R或S
集合运算符
- 并:R∪S,属于R或S的元组构成
- 差:R-S,属于R但不属于S的元组构成
- 交:R∩S,既属于R又属于S的元组构成
- 笛卡尔积:R×S,由R中每个元素与S中所有元素组合
关系运算符
假设有一个成绩表score,列分别为sno, sname,
sscore
选择:得到表中的指定行,写作\(\sigma_{条件}(表名)\)
如获取学号为1的行:\(\sigma_{sno=1}(score)\)
投影:得到表中的指定列,写作\(\pi_{条件}(表名)\)
如获取成绩这一列的信息:\(\pi_{sscore}(score)\)
连接:将两个表根据指定条件连接在一起,写作\(表名\Join_{条件}表名\)
- 等值连接:条件为属性R.A=S.B
- 自然连接:条件为属性R.A=S.A,且去除重复列,写作\(R\Join S\)
- 悬浮元组:自然连接时由于S中不匹配而在R中被舍弃的
- 外连接:保留悬浮元组的连接,不匹配的位置填NULL,写作⟗
- 左外连接:只保留R中悬浮元组的连接,写作⟕
- 右外连接:只保留S中悬浮元组的连接,写作⟖
除:设R和S除运算结果为T,则T包含所有在R中但不在S中的属性和值,且T的元组与S的元组经过组合均能出现在R中(题中描述为全部 )
例:A中包含属性x和y,B中包含属性y,且B中属性y的值为全集且无重复,则求全部y的x写作:\(\pi_{x,y}(A)÷\pi_{y}(B)\)
如下student表:
| sno | sname | age | sdept |
|---|---|---|---|
| 1 | 张三 | 18 | 计算机 |
| 2 | 李四 | 19 | 计算机 |
| 3 | 王五 | 19 | 计算机 |
| 4 | 赵六 | 19 | 通信 |
S2表:
| age | sdept |
|---|---|
| 19 | 计算机 |
则student表除以S2表的结果是
| sno | sname |
|---|---|
| 2 | 李四 |
| 3 | 王五 |
即除法的意思是满足S2中所有条件的信息,但不包含S2中的字段的其他字段组成的新表
ER图
以下说的都是Chen‘s ER图
格式
实体:方框
关系:菱形
属性:圆形
联系:
转换关系模型
将各个实体的名字转换为各个关系模型的名字
实体属性就是关系属性,实体的码就是关系的码
用实体名(属性…)表示,主码用下划线指定
实体间联系转换
- 一对一:在任意一方加入对方的主码并设为其外码,并加入联系本身的属性
- 一对n:将一方的主码加入n方作为外码,同时将联系的属性加入n方
- n对m:将联系本身转换为一个关系模式,将双方的主码加入其中并设为外码,并将联系属性放入其中