您的当前位置:首页正文

关系模式的无损分解

2023-01-24 来源:爱go旅游网
1、已知关系模式R(ABC),F={A→C,B→C},求F+。 可以直接通过自反律、增广律、传递律加以推广:

F+={φ→φ,A→φ,B→φ,C→φ,A→C,B→C,AB→φ,AB→A,AB→B,AB→C,AB→BC,AB→AB,AB→ABC,BC→φ,BC→C,BC→B,BC→BC,AC→φ,

AC→C,AC→A,AC→AC,ABC→φ

,ABC→A,ABC→B,ABC→C,ABC→BC,ABC→AB,

ABC→ABC}

4.6 试分析下列分解是否具有无损联接和保持函数依赖的特点: (1)设R(ABC),F1={A→B} 在R上成立,ρ1={AB,AC}。

首先,检查是否具有无损联接特点: 第1种解法--算法4.2:

A AB a1 AC a1 B a2 b22 C b13 a3 A a1 a1 B a2 a2 C b13 a3 (1) 构造表

(2)根据A→B进行处理

结果第二行全是a行,因此分解是无损联接分解。

第2种解法:(定理4.8) 设 R1=AB,R2=AC R1∩R2=A R2- R1=B

∵A→B,∴该分解是无损联接分解。

然后,检查分解是否保持函数依赖

πR1(F1)={A→B,以及按自反率推出的一些函数依赖} πR2(F1)={按自反率推出的一些函数依赖}

F1被πR1(F1)所蕴涵,∴所以该分解保持函数依赖。

2、设R(ABC),F2={A→C,B→C}在R上成立,ρ2={AB,AC}

首先,检查是否具有无损联接特点: 第1种解法(略) 第2种解法:(定理4.8)

设 R1=AB,R2=AC

R1∩R2=A R2- R1=C

∵A→C,∴该分解是无损联接分解。

然后,检查分解是否保持函数依赖

πR1(F2)={按自反率推出的一些函数依赖}

πR2(F2)={A→C,以及按自反率推出的一些函数依赖} ∵F1中的B→C没有被蕴涵,所以该分解没有保持函数依赖。

3、设R(ABC),F3={A→B},在R上成立,ρ3={AB,BC}.

首先,检查是否具有无损联接特点: 第1种解法:

A AB a1 BC b21 B C A a1 a1 B a2 b22 C a3 a3 a2 b13 a2 a3 (1) 构造表 (2)根据A→B进行处理

没有一行全是a行。因此这个分解不具有无损联接特性。

第2种解法:(定理4.8) 设 R1=AB,R2=BC R1∩R2=B

R2- R1=C,R1- R2=A

∵B→C,B→A不在F3中 ∴该分解不具有无损联接特性。

然后,检查分解是否保持函数依赖

πR1(F3)={A→B,以及按自反率推出的一些函数依赖} πR2(F3)={按自反率推出的一些函数依赖}

F1被πR1(F3)所蕴涵,所以该分解保持函数依赖。

4、设R=ABCD,R上的函数依赖集F={A→B,B→C,A→D,D→C},R的一个分解ρ={AB,AC,AD},求:(1)F在ρ的每个模式上的投影。(2)ρ相对于F是无损联接分解吗?(3)ρ保持依赖吗? (2)

A B AB a1 a2 C D A B C D b13 b14 b24 a1 a2 a1 a2 a1 a2 a3 a4 a3 a4 a3 a4 AC a1 b22 a3 AD a1 b32 b33 a4 (1) 构造表

(2)根据A→B,B→C,A→D,D→C进行处理

每一行都是a,ρ相对于F是无损联接分解。

4.8 设R=ABCD,R上的F={A→C,D→C,BD→A}, 试证明ρ={AB,ACD,BCD}相对于F不是无损联接分解。 根据算法4.2

A B C D A a1 a1 B a2 C D a3 b14 AB a1 a2 b13 b14 ACD a1 b22 a3 a4 BCD b31 a2 a3 a4 b22 a3 a4 a3 a4 b31 a2 (1) 构造表

(2)根据A→C,D→C,BD→A进行处理

没有一行都是a,所以,ρ相对于F不是无损联接分解。

5.2 对于教学数据库的三个基本表 学生 S(S#,SNAME,AGE,SEX) 学习 SC(S#,C#,GRADE)

课程 C(C#,CNAME,TEACHER)

试用SQL的查询语句表达下列查询:

(1)检索LIU老师所授课程的课程号和课程名。 SELECT C#,CNAME FROM C

WHERE TEACHER=‘LIU’

(2)检索年龄大于23岁的男学生的学号和姓名。 SELECT S#,SNAME FROM S

WHERE (AGE>23) AND (SEX=‘M’)

(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。 SELECT SNAME FROM S

WHERE SEX=‘F’ AND S# IN (SELECT S# FROM SC

WHERE C# IN (SELECT C# FROM C

WHERE TEACHER=‘LIU’)

NOTICE:有多种写法,比如联接查询写法: SELECT SNAME FROM S,SC,C

WHERE SEX=‘F’ AND SC.S#=S.S# AND SC.C#=C.C# AND TEACHER='LIU' 但上一种写法更好一些。

(4)检索WANG同学不学的课程的课程号。 SELECT C#

FROM C

WHERE C# NOT IN (SELECT C# FROM SC WHERE S# IN (SELECT S# FROM S

WHERE SNAME='WANG'))

(5)检索至少选修两门课程的学生学号。 SELECT DISTINCT X.SNO FROM SC X,SC Y

WHERE X.SNO=Y.SNO AND X.CNO<>Y.CNO

Notice:对表SC进行自连接,X,Y是SC的两个别名。

(6)检索全部学生都选修的课程的课程号与课程名。 SELECT C#,CNAME FROM C

WHERE NOT EXISTS (SELECT * FROM S

WHERE S# NOT IN (SELECT * FROM SC

WHERE SC.C#=C.C#))

要从语义上分解:(1)选择课程的课程号与课程名,不存在不选这门课的同学。

其中,“不选这门课的同学”可以表示为:

或者

SELECT * FROM S

WHERE S# NOT IN (SELECT * FROM SC WHERE SC.C#=C.C#)

SELECT * FROM S

WHERE NOT EXISTS (SELECT * FROM SC WHERE S.S#=C.S# AND

SC.C#=C.C# )

(7)检索选修课程包含LIU老师所授课的学生学号。 SELECT DISTINCT S# FROM SC

WHERE C# IN (SELECT C# FROM C

WHERE TEACHER='LIU'))

因篇幅问题不能全部显示,请点此查看更多更全内容