数据库2复习资料11春季.docx
《数据库2复习资料11春季.docx》由会员分享,可在线阅读,更多相关《数据库2复习资料11春季.docx(15页珍藏版)》请在冰豆网上搜索。
数据库2复习资料11春季
数据库
(2)复习资料------------------上大11春季
例1设关系模式R(U,F),其中,
U={A,B,C,D,E,I},F={A→D,AB→C,BI→C,ED→I,C→E},求(AC)+。
例2设有函数依赖集F={A→C,C→A,B→AC,D→AC,BD→A},计算它等价的最小依赖集Fmin。
例3设关系模式R(U,F)中,U={A,B,C,D,E},F={AB→C,C→D,D→E},R的一个分解ρ={R1(A,B,C),R2(C,D),R3(D,E)}。
试判断ρ具有无损连接性。
设关系模式R(ABCD),如果规定,关系中B值与D值之间是一对多联系,A值与C值之间是一对一联系。
试写出相应的函数依赖。
设关系模式R(ABCD),F是R上成立的FD集,F={A→B,C→B},则相对于F,试写出关系模式R的关键码。
并说明理由。
*
设关系模式R(ABCD),F是R上成立的FD集,
F={A→B,B→C},
① 试写出属性集BD的闭包(BD)+。
② 试写出所有左部是B的函数依赖(即形为“B→”)。
设关系模式R(ABC),F是R上成立的FD集,
F={A→C,B→C},试分别求F在模式AB和AC上的投影。
设有一个记录各个球队队员每场比赛进球数的关系模式
R(队员编号,比赛场次,进球数,球队名,队长名)
《
如果规定每个队员只能属于一个球队,每个球队只有一个队长。
① 试写出关系模式R的基本FD和关键码。
② 说明R不是2NF模式的理由,并把R分解成2NF模式集。
③ 进而把R分解成3NF模式集,并说明理由。
*多值依赖,BCNF
*数据库系统生存期;概念设计的目标,独立于…,步骤;采用ER方法的数据库概念设计分三步;
设关系模式R(ABC)上有一个MVDAB,如果已知R的当前关系存在三个元组(ab1c1),(ab2c2),(ab3c3),那么这个关系中至少还应该存在那些元组
*逻辑设计的目的;与软硬件关系;
}
*事务的定义;事务开始,结束语句
*事务的ACID性质;
*恢复的定义;恢复的基本原则;实现方法;
*故障类型;
*检查点机制;REDO操作;UNDO操作;运行记录优先原则;数据库的并发操作带来的问题;解决并发操作带来的问题有两种技术;封锁技术有两种封锁;使用封锁技术可能带来的三个问题;
*事务的调度;串行调度和并行调度;两段封锁协议;
*数据库中的完整性指,完整性子系统的主要功能;完整性规则的组成;
设教学数据库的关系如下:
)
S(SNO,SNAME,AGE,SEX)
SC(SNO,CNO,GRADE)
C(CNO,CNAME,TEACHER)
试用多种方法定义下列完整性约束:
⑴在关系S中插入的学生年龄值应在16~25岁之间。
⑵在关系SC中插入元组时,其SNO值和CNO值必须分别在S和C中出现。
⑶在关系C中删除一个元组时,首先要把关系SC中具有同样CNO值的元组全部删去。
⑷在关系S中把某个SNO值修改为新值时,必须同时把关系SC中那些同样的SNO值也修改为新值。
{
在教学数据库中的关系S、SC、C中,试用SQL的断言机制定义下列两个完整性约束:
⑴每位教师开设的课程不能超过10门。
(2)不允许男同学选修WU老师的课程。
(3)每门课程最多50名男同学选修
(4)学生必须在选修Maths课后,才能选修其他课程。
(5)每个男学生最多选修20门课程。
*创建触发器:
1>在学生表S上定义更新触发器,使其阻止SNO列被修改:
—
2>在学习表SC上定义更新触发器,使其修改后的成绩不能低于原来的成绩:
3>为学习表SC设计“选课”和“退课”触发器来实现“按学分计算学费”的业务管理逻辑:
CREATEASSERTIONASSE3CHECK
(50>=ALL(SELECTCOUNT
FROMS,SC
WHERE=
ANDSEX=’男’
GROUPBYCNO));
、
(4)学生必须在选修Maths课后,才能选修其他课程。
这个约束可用下列形式表达:
“不存在一个学生的选课,这个学生没学过Maths课”。
CREATEASSERTIONASSE4CHECK
(NOTEXISTS(SELECT*
FROMSCX
WHERENOTEXISTS
(SELECT*
—
FROMSCY,C
WHERE=
AND=
ANDCNAME=’Maths’)));
(5)每个男学生最多选修20门课程。
CREATEASSERTIONASSE5CHECK
(20>=ALL(SELECTCOUNT(CNO)
FROMS,SC
,
WHERE=
ANDSEX=’男’
GROUPBY);
*创建触发器:
1>在学生表S上定义更新触发器,使其阻止SNO列被修改:
CREATETRIGGERSNO_UPDONS
FORUPDATE
AS
)
IFUPDATE(SNO)
ROLLBACKTRANSACTION
RETURN
2>在学习表SC上定义更新触发器,使其修改后的成绩不能低于原来的成绩:
CREATETRIGGERSC_UPDATE_GRADEONSC
FORUPDATE
AS
DECLARE@OLD_GRADEREAL
@NEW_GRADEREAL
IFUPDATE(GRADE)
BEGIN
SELECT@OLD_GRADE=GRADE
FROMDELETED
SELECT@NEW_GRADE=GRADE
FROMINSERTED
IF@OLD_GRADE>@NEW_GRADE
、
ROLLBACKTRANSACTION
END
3>为学习表SC设计“选课”和“退课”触发器来实现“按学分计算学费”的业务管理逻辑:
//选课
CREATETRIGGERSC_INS_UPDATE_SONSC
AFTERINSERT
AS
DECLARE@PRICEINT
/
SET@PRICE=20
IFUPDATE(SNO)
UPDATES
SETFEES=FEES+@PRICE*(SELECTCREDIT
FROMC
WHERE=(SELECTCNO
FROMINSERTED))
WHERESNO=(SELECTSNO
{
FROMINSERTED);
RETURN
//退课
CREATETRIGGERSC_DEL_UPDATE_SONSC
AFTERDELETE
AS
DECLARE@PRICE
SET@PRICE=20
|
IFUPDATE(SNO)
UPDATES
SETFEES=FEES-@PRICE*(SELECTCREDIT
FROMC
WHERE=(SELECTCNO
FROMDELETED))
WHERESNO=(SELECTSNO
FROMDELETED);
·
RETURN
*用SQL3触发器
1>创建供应关系SPJ的一个触发器,在修改关系SPJ的PRICE值时,只能增加不能减少,否则拒绝修改:
CREATETRIGGERTRIG1
AFTERUPDATEOFPRICEONSPJ
REFERENCING
OLDASOLDTUPLE
NEWASNEWTUPLE
、
WHEN>
UPDATESPJ
SETPRICE=
WHERESNO=ANDPNO=
ANDJNO=
FOREACHROW;
*SQL中的安全性机制:
视图机制,授权子系统
例:
设有三个关系模式:
《
EMP(ENO,ENAME,AGE,SEX,ECITY)
COMP(CNO,CNAME,CITY)
WORKS(ENO,CNO,SALARY)
试用SQL的断言机制定义下列完整性约束:
①每个职工至多可在3个公司兼职工作:
CREATEASSERTIONASSE1CHECK
(3>=ALL(SELECTCOUNT(CNO)
FROMWORK
…
GROUPBYENO));
②每门公司男职工的平均年龄不超过40岁:
CREATEASSERTIONASSE2CHECK
(40>=ALL(SELECTAVG)
FROMEMP,WORK
WHERE=
ANDSEX=’男’
GROUPBYCNO));
~
③不允许女职工在建筑公司工作:
CREATEASSERTIONASSE3CHECK
(NOTEXISTS(SELECT*
FROMWORK
WHERECNOIN(SELECTCNO
FROMCOMP
WHERECNAME=‘建筑公司’)
ANDENOIN(SELECTENO
|
FROMEMP
WHERESEX=‘女’)));
*用SQL3触发器
【实例1】某单位修改工资原则:
如果职工工资修改后仍低于900元,那么,在修改后的工资基础上再增加原工资的5%,但不得超过900元(元组级触发器)。
CREATETRIGGERTRI_UPD_SALARY/*触发器命名*/
AFTERUPDATEOFSALARYONWORK/*触发时间,触发事件,目标表*/
REFERENCING/*设置必要的变量*/
OLDASOLDTUPLE/*为元组级触发器设置变量*/
·
NEWASNEWTUPLE
FOREACHROW/*触发器的动作时间间隔*/
WHEN(900>)/*触发器的动作条件部分*/
BEGINATOMIC
UPDATEWORK/*触发器的动作部分1*/
SETSALARY=+*
WHEREENO=
AND(900>+*;
…
UPDATEWORK/*触发器的动作部分2*/
SETSALARY=900
WHEREENO=
AND(900<=+*;
END;
【实例2】在学习关系SC表中修改课程号CNO,即学生的选课登记需作变化。
在关系SC中的约束:
要求保持每门课程选修人数不超过50。
如果更改课程号后,违反这个约束,那么这个更改应该不做。
(语句级触发器)
CREATETRIGGERTRI_UPD_SC/*触发器的命名*/
INSTEADOFUPDATEOFCNOONSC/*时间、事件、目标*/
:
REFERENCING/*设置变量*/
OLD_TABLEASOLDSTUFF/*为语句级触发器设置变量*/
NEW_TABLEASNEWSTUFF
WHEN(50>=ALL(SELECTCOUNT(SNO)/*动作时间条件*/
FROM((SCEXCEPTOLDSTUFF)UNIONNEWSTUFF)
GROUPBYCNO)))
BEGINATOMIC/*动作体*/
DELETEFROMSC/*触发动作1*/
[
WHERE(SNO,CNO,GRADE)INOLDSTUFF;
INSERTINTOSC/*触发动作2*/
SELECT*FROMNEWSTUFF
END;
例1:
把对关系S的查询、修改权限授给用户WANG,并且WANG
还可以把这些权限转授给其他用户:
GRANTSELECT,UPDATEONSTOWANG
WITHGRANTOPTION
&
例2:
允许用户BAO建立新关系,并可以引用关系C的主键CNO作为新
关系的外键,并有转让权限。
GRANTREFERENCES(CNO)ONCTOBAO
WITHGRANTOPTION
例3:
从用户WANG连锁回收对关系S的查询、修改权限。
REVOKESELECT,UPDATEONSFROMWANGCASCADE
*DDBS特点:
物理独立性,逻辑整体性,场地自治性,场地之间协作性,数据独立性(数据的逻辑独立性和数据的物理独立性),适当增加数据冗余度;
*DDBS的分类:
同构同质,同构异质,异构型
】
*DDB6层模式结构:
全局外部级,全局概念级,分片级,分配级,局部概念级,局部内部级
*映像体现的数据独立性:
逻辑数据独立性,分布透明性,位置透明性,局部数据模型透明性,物理数据独立性;
图是有关教师(Faculty)、系(Department)和系主任(Director)信息的对象联系图。
(1)试用ORDB的定义语言,定义这个数据库。
(2)试用ORDB的查询语言,分别写出下列查询的SELECT语句:
①检索精通俄语(Russian)的教师工号和姓名。
②检索复旦大学出访过瑞士(Switzerland)并且精通日语
(Japanese)的系主任。
[
解:
(1)试用ORDB的定义语言,定义这个数据库:
CREATETYPEMyStringcharvarying;
CREATETABLEdepartment(universityMyString,dnameMyString,
staffsetof(ref(faculty)),direref(director));
CREATETABLEfaculty(fnointeger,fnameMyString,languagessetof(MyString),
countriessetof(MyString),works_forref(department));
CREATETABLEdirector(dnointeger)Underfaculty;
\
(2)试用ORDB的查询语言,分别写出下列查询的SELECT语句:
①检索精通俄语(Russian)的教师工号和姓名。
SELECTfno,fname
FROMfaculty
WHERE‘Russian’inlanguages;
②检索复旦大学出访过瑞士(Switzerland)并且精通日语
(Japanese)的系主任。
SELECT,
、
FROMdirectorasD
WHEREUniversity’
AND‘Switzerland’in
AND‘Japanese’in;
解:
(1)试解释这个对象联系图:
*对象student包含:
身份证号、姓名、籍贯和学习(studies)等属性;
*对象study包含:
课程名、成绩、求学地、大学以及学生(student)等属性。
*对象student和study之间的联系为1:
N
(2)试用ORDB的定义语言,定义这个数据库
CREATETYPEMyStringcharvarying;
CREATETABLEstudent(snointeger,
snameMyString,
cityMyString,
studiessetof(ref(study)));
CREATETABLEstudy(coursenameMyString,
gradeinteger,
cityMyString,
universityMyString,
studentref(student));
(3)试用ORDB的查询语言,分别写出下列查询:
①检索每个学生的学习课程和成绩。
SELECT,,
FROMstudentasA,asB;
②检索至少有一门课程的求学地与籍贯在同一城市的
学生学号和姓名。
SELECT,
FROMstudentasA,asB
WHERE=;