数据库第六章小结及习题

关系模型
R(U,D,DOM,F),其中R是符号化的元组语义,u指的是一组属性,D为属性所来自的域,DOM为属性到域的映射,F为属性的一组数据依赖。通常是用的三元组R(U,F)
数据依赖
是关系内部属性与属性之间的一种约束关系,可以分为函数依赖简记为fd,多值依赖记为mvd.
(1) 函数依赖
函数依赖是很常见的,例如一个学生的学号唯一确定了这个学生的系别 ,这就是函数依赖。
假设R(U)是一个属性集合的关系模型,X Y 是U的子集。如果对于R(u)的任意一个可能的关系r ,r中不可能存在两个元组在上的属性值相同,但是在Y的属性值不同,那么称为X函数确定了Y,记 x → x\rightarrow x y y y ,这个定义有点像函数。
由定义6.2中得到x 是一个集合,对应到函数中就是多元函数。举个例子之前广泛使用的SC表(选课表)中SNO,CNO确定了选课的分数,但是SNO,CNO中的任意一个都不能唯一的确定,那么这个就是完全函数依赖。下面将介绍。
【定义传递函数依赖】 在R(U)中,如果x → \rightarrow 是非平凡函数依赖,X不函数依赖于y ,y → \rightarrow z是非平凡函数依赖,那么z 对x 传递函数依赖,记x → \rightarrow z ,但是如果x → \rightarrow y 是平凡函数依赖,那么z 将直接依赖于x ,并不是传递函数依赖。
(2)多值函数依赖
设R(U)是属性集的一个关系模式,x,y,z是U的子集 Z = U − X − Y Z=U-X-Y Z=UXY,多值函数依赖成立 x → \rightarrow → \rightarrow y当且仅当对于 ∀ \forall 的关系r 给定(x,z) 其中y的值与z无关,只是由x决定。

性质:
(1)对称性
(2)传递性
(3)函数依赖可以看做是多值依赖的特殊关系,此时看作y 中有一个即可。
在这里插入图片描述
多值依赖与函数依赖的区别:
(1)多值依赖的有效性与属性集的范围有关,但是函数依赖是没有的
(2)对于xKaTeX parse error: Undefined control sequence: \rightarroe at position 1: \̲r̲i̲g̲h̲t̲a̲r̲r̲o̲e̲ → \rightarrow y ,不能确定y 的子集也是满足多值函数依赖关系的。
多值函数依赖不只是看x, y还要有z 的约束。


设k 为R<U,F>中的属性或者是属性的组合,如果U完全函数依赖于k 那么k称为R的候选码
当候选码多于一个时候选择一个作为主码,包含在任意一个候选码中的属性称为是主属性,不包含在任何的主属性中的是非主属性。(一般将主码或者候选码简称为码)
码对于关系是十分重要的。
范式
引言
一个低级范式的关系模式通过模式分解可以转换为多个高一级的关系模式的集合,称为规范化。

(1)第一范式: 最简单 的关系,

(2)2NF: 非主属性完全函数依赖于任意一个候选码,那么是第二范式
如果一个关系模式不是第二范式将会有以下的问题:插入异常,删除异常,修改复杂

(3)3NF:设R<u,f>是第一范式,在R中不存在码x ,属性组y ,以及非主属性z ,使得x → \rightarrow y ,y → \rightarrow z .
可以较为容易的推出如果属于第三范式,一定是属于第二范式的。但是在实际的问题中操作起来是较为麻烦的。
(4)BCNF 如果每一个决定的因素都含有码 那么属于BCNF
从定义中看出在BCNF中是没有非主属性非完全函数依赖的属于第二范式,BCNF也是第三范式
但不是所有的第三范式都是BCNF
(5)4NF 关系模式 R<u,f> 是第一范式,如果R的每一个非平凡的多值依赖于x → \rightarrow y,(y不属于x )x,含有码,那么就是4NF,限制了关系模式的属性之间不能有非平凡的非函数依赖的多值依赖。是可以含有平凡的多值函数依赖的并且不含有码。
在这里插入图片描述
一个关系模式到底要到第几范式是没有要求的。
可以从以上的内容看出来,找到候选码是很重要的。
定理一:
对于给定的一个关系模型记R(u1,u2,u3…)以及函数依赖集合F ,可以将属性分为4类:
(1)L只是出现在函数依赖的左侧的
(2)R只是出现在函数依赖的右侧的
(3)N左右两侧都没有出现的属性
(4)LR在左右都出现的属性
给出下面的一个定理:对于一个给定的关系模型R以及其函数依赖集F,如果X(X ∈ \in R)是L属性那么一定是任意候选码的一个,如果X的闭包是包含了所有的属性那么就是这个X为唯一的候选码。

习题

2 建立一个关于系,学生,班级,学会的数据信息

create table Student(
Sno char(9) primary key ,
Sname char(9) ,
Ssex char(9),
Sclass smallint,
Sdept char(9) ,
foreign key (Sclass) references class (Sclass )
foreign key (Sdept) references Dept ( Sdept)
)
--建立系
create table Dept (
Sdept char(9)  primary key,--系名
Sdeptnum smallint ,--系号
Saddress char(9), --居住地点
Snum smallint , --人数
Spublic char(9),--办公地点
)
--班级
create table Class (
Sclass smallint primary key,--班级号
Sdept char(9) ,--系
Snum smallint ,
Sdepta char(8) ,--专业
Stime char(9) ,--年份
foreign key (Sdept) references Dept(Sdept)
)
create  table Studentma(
Sname char(9) primary key ,
Spublic char(9) ,--地点
Stime char(9),--创建时间点
Snum smallint ,--人数
) 

(2) 函数依赖 在建立表的同时声明了主码,没有传递函数依赖,但是在建立的Class关系中有多值函数依赖即 系 → \rightarrow → \rightarrow 专业

6 有关系模式R(A,B,C,D,E),回答问题
(1)如果A是R的候选码,具有函数依赖的BC → \rightarrow DE,什么条件下R是BCNF
BC 也是候选码(根据BCNF的定义),也就是BC → \rightarrow A
(2)存在函数依赖A → \rightarrow B ,BC → \rightarrow D, DE → \rightarrow A ,R 所有的码
根据以上的知识点中L类的属性有c,e 因此有ACE,BCE,DCE
(3) 存在函数依赖A → \rightarrow B ,BC → \rightarrow D, DE → \rightarrow A
由(2)知道 在R中是没有非主属性的,因此 ∈ \in 3NF ,但是 ∉ \notin / BCNF,是因为 ∃ \exist 函数依赖但不是码。指的是候选码
7 判断
(1) ∀ \forall 的二目关系是 ∈ \in 3NF 是对的,对于二个属性的,要么是全码,要么只有一个是码,但是不管哪一个都是没有非主属性的,自然就是 ∈ \in 3NF
(2) 任意的二目是属于BCNF 对的,由(1)知道,决定一定是码
(3)任意的二目是属于4BF的 对的,因为对于4BF而言,如果有多值函数依赖,一定是平凡的
(4)当且仅当函数依赖A → \rightarrow B 在R成立,关系R(A,B,C)等于 R 1 R_1 R1(A,B) 与 R 2 R_2 R2(A,C )的连接
首先充分性是正确的,很容易证明,但是必要性是不对的,例如在教材中使用仓库的关系,R(W,S,C)模型,是多值函数依赖关系。

改为多值依赖就是正确的。这个东西也说明了4BF 的优势,即节省了存储空间

(5) R.A → \rightarrow R.B R.B → \rightarrow R.C 那么A函数依赖C 是对的
如果R.A → \rightarrow 是平凡依赖,那么将不是传递函数依赖
(6)R.A → \rightarrow R.B 并且R.B → \rightarrow R.C那么R.A → \rightarrow (R.C,R.B)对的
(7) R.B → \rightarrow R.A ,R.C → \rightarrow R.A ,那么R(B,C ) → \rightarrow R.A 对的
(8)R(B,C ) → \rightarrow R.A 那么,R.B → \rightarrow R.A ,R.C → \rightarrow R.A 是错的,当(B,C)为码是错的

8证明
(1) R是BCNF,那么R 是3BF那么反之不然
如果R是BCNF,那么所有的决定都是码,因此不会存在非主属性传递函数依赖,如果存在主属性的传递函数依赖,部分函数依赖都不会是BCNF
证毕
(2) 如果是R是3NF,那么R一定是2NF,反之不然
证明(使用反证法)
假设R是3NF,但不是2NF,那么一定存在非主属性的部分函数依赖,记为r → \rightarrow x ,那么r 将不会是码,也就是 ∃ \exists 这样的属性组使得非主属性具有传递函数依赖,(这个时候就可以拆了)因此定为2NF
证毕
假设为2NF,是可能存在非主属性的传递函数依赖关系的
证毕

附加题

(1)
定义关系Y(x1,x2,x3,x4)
(x1,x2) → \rightarrow x 3 x3 x3
x 2 → x2\rightarrow x2 x 4 x4 x4
L类的属性有x1,x2 同时(x1,x2)确定了Y ,是唯一的候选码
非主属性有x3,x4 存在非主属性函数的部分函数依赖是1NF
(2)
R(A,B,C,D )
F={AB → \rightarrow D, AC → \rightarrow BD, B → \rightarrow C}
L类有A ,因此为AB,AC
是3NF ,存在主属性的部分函数依赖(B 不是码)
(3)R(X,Y,Z,W)
F={Y ← \leftarrow → \rightarrow W ,XY → \rightarrow Z }
分析得到 有XW ,XY ,非主属性为Z ,最高为3NF
(4)R(A,B,C,D)
F={A → \rightarrow B ,CE → \rightarrow A ,E → \rightarrow D }
L类有CE ,是唯一的候选码 ,非主属性为 A,B,D 存在非主属性部分函数依赖 ,分解到3NF ,分解成为 R1(E,D) R2(CEA) R2(CEB)
对于R1一定是3NF ,R2,R3因为是只有一个非主属性,没有非主属性的部分函数依赖也是3NF

定义关系模式R(商店,商品编号,数量,部门编号,负责人)
每个商店的每种商品是只在一个部门销售
每个商店的每个部门只有一个负责人
每个商店的每种商品只有一个库存数量
1 候选码
给出F :
商店商品 → \rightarrow 部门,商店部门 → \rightarrow 负责人 ,商店商品 → \rightarrow 库存
因此候选码为唯一: 商店商品,非主属性为部门,负责人,数量
2 第几范式原因
第二范式,因为存在非主属性传递函数依赖 ,不存在非主属性部分函数依赖
3 分解到3NF 将负责人分出即可。

R(A ,B,C,D,E,F)
F={A → \rightarrow C, AB → \rightarrow D, C → \rightarrow E,D → \rightarrow BF}

分析得到码为AB,AD
1 写出关键字
AB ,AD
2 分解到2NF
R1(ABD) , R2(D,F),R3(A,C,E)
分解3NF
R1(ABD) , R2(D,F),R3(A,C) R4(A,E)
分解4NF

将r1分解为(B,D) (A,B)即可

小结

这篇文章主要是对于NF,以及候选码的判定以及相关的定理。上文定理一虽然简化了不少,但是要找到完整的候选码仍然需要迭代。对于范式的判定可以是一层一层的,也可以是使用判定的定理,需要一定的练习。

猜你喜欢

转载自blog.csdn.net/weixin_44724691/article/details/105450136