例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)上有一个MVD A B,如果已知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设计“选课”和“退课”触发器来实现“按学分计算学费”的业务管理逻辑:
CREATE ASSERTION CHECK
(50>=ALL(SELECT COUNT
FROM S, SC
WHERE =
AND SEX=’ 男’
GROUP BY CNO));
ASSE3
、
(4) 学生必须在选修Maths课后,才能选修其他课程。
这个约束可用下列形式表达:
“不存在一个学生的选课,这个学生没学过Maths课”。
CREATE ASSERTION ASSE4 CHECK
(NOT EXISTS( SELECT *
FROM SC X
WHERE NOT EXISTS
(SELECT *
—
FROM SC Y, C
WHERE =
AND =
AND CNAME=’ Maths’)));
(5)每个男学生最多选修20门课程。
CREATE ASSERTION ASSE5 CHECK
(20>=ALL(SELECT COUNT(CNO)
FROM S, SC
,
WHERE =
AND SEX=’ 男’
GROUP BY );
*创建触发器:
1>在学生表S上定义更新触发器,使其阻止SNO列被修改:
CREATE TRIGGER SNO_UPD ON S
FOR UPDATE
AS
)
IF UPDATE(SNO)
ROLLBACK TRANSACTION
RETURN
2>在学习表SC上定义更新触发器,使其修改后的成绩不能低于原来的成绩:
CREATE TRIGGER SC_UPDATE_GRADE ON SC
FOR UPDATE
AS
DECLARE @OLD_GRADE REAL
,
@NEW_GRADE REAL
IF UPDATE(GRADE)
BEGIN
SELECT @OLD_GRADE =GRADE
FROM DELETED
SELECT @NEW_GRADE =GRADE
FROM INSERTED
IF @OLD_GRADE>@NEW_GRADE
、
ROLLBACK TRANSACTION
END
3>为学习表SC设计“选课”和“退课”触发器来实现“按学分计算学费”的业务管理逻辑:
//选课
CREATE TRIGGER SC_INS_UPDATE_S ON SC
AFTER INSERT
AS
DECLARE @PRICE INT
/
SET @PRICE=20
IF UPDATE(SNO)
UPDATE S
SET FEES=FEES+@PRICE*(SELECT CREDIT
FROM C
WHERE =(SELECT CNO
FROM INSERTED))
WHERE SNO=(SELECT SNO
{
FROM INSERTED);
RETURN
//退课
CREATE TRIGGER SC_DEL_UPDATE_S ON SC
AFTER DELETE
AS
DECLARE @PRICE
SET @PRICE=20
|
IF UPDATE(SNO)
UPDATE S
SET FEES=FEES-@PRICE*(SELECT CREDIT
FROM C
WHERE =(SELECT CNO
FROM DELETED))
WHERE SNO=(SELECT SNO
FROM DELETED);
·
RETURN
*用SQL3触发器
1>创建供应关系SPJ的一个触发器,在修改关系SPJ的PRICE值时,只能增加不能减少,否则拒绝修改:
CREATE TRIGGER TRIG1
AFTER UPDATE OF PRICE ON SPJ
REFERENCING
OLD AS OLDTUPLE
NEW AS NEWTUPLE
、
WHEN >
UPDATE SPJ
SET PRICE=
WHERE SNO= AND PNO=
AND JNO=
FOR EACH ROW;
*SQL中的安全性机制:视图机制,授权子系统
例:设有三个关系模式:
《
EMP(ENO,ENAME,AGE,SEX,ECITY)
COMP(CNO,CNAME,CITY)
WORKS(ENO,CNO,SALARY)
试用SQL的断言机制定义下列完整性约束:
①每个职工至多可在3个公司兼职工作:
CREATE ASSERTION ASSE1 CHECK
( 3 >= ALL (SELECT COUNT(CNO)
FROM WORK
…
GROUP BY ENO ));
② 每门公司男职工的平均年龄不超过40岁:
CREATE ASSERTION ASSE2 CHECK
(40 >= ALL(SELECT AVG)
FROM EMP,WORK
WHERE =
AND SEX=’男’
GROUP BY CNO));
~
③ 不允许女职工在建筑公司工作:
CREATE ASSERTION ASSE3 CHECK
( NOT EXISTS (SELECT *
FROM WORK
WHERE CNO IN(SELECT CNO
FROM COMP
WHERE CNAME =‘建筑公司’)
AND ENO IN(SELECT ENO
|
FROM EMP
WHERE SEX=‘女’)));
*用SQL3触发器
【实例1】 某单位修改工资原则:如果职工工资修改后仍低于900元,那么,在修改后的工资基础上再增加原工资的5%,但不得超过900元(元组级触发器 )。
CREATE TRIGGER TRI_UPD_SALARY /*触发器命名*/
AFTER UPDATE OF SALARY ON WORK /*触发时间,触发事件,目标表*/
REFERENCING /*设置必要的变量*/
OLD AS OLDTUPLE /*为元组级触发器设置变量*/
·
NEW AS NEWTUPLE
FOR EACH ROW /*触发器的动作时间间隔*/
WHEN ( 900 > ) /*触发器的动作条件部分*/
BEGIN ATOMIC
UPDATE WORK /*触发器的动作部分1*/
SET SALARY=+*
WHERE ENO=
AND (900>+*;
…
UPDATE WORK /*触发器的动作部分2*/
SET SALARY=900
WHERE ENO=
AND (900<=+*;
END;
【实例2】在学习关系SC表中修改课程号CNO,即学生的选课登记需作变化。在关系SC中的约束:要求保持每门课程选修人数不超过50。如果更改课程号后,违反这个约束,那么这个更改应该不做。(语句级触发器)
CREATE TRIGGER TRI_UPD_SC /*触发器的命名*/
INSTEAD OF UPDATE OF CNO ON SC /*时间、事件、目标*/
:
REFERENCING /*设置变量*/
OLD_TABLE AS OLDSTUFF /*为语句级触发器设置变量*/
NEW_TABLE AS NEWSTUFF
WHEN (50 >= ALL(SELECT COUNT(SNO) /*动作时间条件*/
FROM ((SC EXCEPT OLDSTUFF) UNION NEWSTUFF)
GROUP BY CNO)))
BEGIN ATOMIC /*动作体*/
DELETE FROM SC /*触发动作1*/
[
WHERE (SNO,CNO,GRADE) IN OLDSTUFF;
INSERT INTO SC /*触发动作2*/
SELECT * FROM NEWSTUFF
END;
例1: 把对关系S的查询、修改权限授给用户WANG,并且WANG
还可以把这些权限转授给其他用户:
GRANT SELECT,UPDATE ON S TO WANG
WITH GRANT OPTION
&
例2:允许用户BAO建立新关系,并可以引用关系C的主键CNO作为新
关系的外键,并有转让权限。
GRANT REFERENCES (CNO) ON C TO BAO
WITH GRANT OPTION
例3:从用户WANG连锁回收对关系S的查询、修改权限。
REVOKE SELECT,UPDATE ON S FROM WANG CASCADE
*DDBS特点:物理独立性,逻辑整体性,场地自治性,场地之间协作性,数据独立性(数据的逻辑独立性和数据的物理独立性),适当增加数据冗余度;
*DDBS的分类:同构同质,同构异质,异构型
】
*DDB 6层模式结构:全局外部级,全局概念级,分片级,分配级,局部概念级,局部内部级
*映像体现的数据独立性:逻辑数据独立性,分布透明性,位置透明性,局部数据模型透明性,物理数据独立性;
图是有关教师(Faculty)、系(Department)和系主任(Director)信息的对象联系图。
(1)试用ORDB的定义语言,定义这个数据库。
(2)试用ORDB的查询语言,分别写出下列查询的SELECT语句:
① 检索精通俄语(Russian)的教师工号和姓名。
② 检索复旦大学出访过瑞士(Switzerland)并且精通日语
(Japanese)的系主任。
[
解:(1)试用ORDB的定义语言,定义这个数据库:
CREATE TYPE MyString char varying;
CREATE TABLE department(university MyString,dname MyString,
staff setof(ref(faculty)),dire ref(director));
CREATE TABLE faculty(fno integer,fname MyString, languages
setof(MyString),
countries ref(department));
setof(MyString),works_for
CREATE TABLE director(dno integer) Under faculty;
\\
(2)试用ORDB的查询语言,分别写出下列查询的SELECT语句:
① 检索精通俄语(Russian)的教师工号和姓名。
SELECT fno, fname
FROM faculty
WHERE ‘Russian’ in languages;
② 检索复旦大学出访过瑞士(Switzerland)并且精通日语
(Japanese)的系主任。
SELECT ,
、
FROM director as D
WHERE University’
AND ‘Switzerland’ in
AND ‘Japanese’ in ;
解:(1)试解释这个对象联系图:
* 对象student包含:
身份证号、姓名、籍贯和学习(studies)等属性;
* 对象study包含:
课程名、成绩、求学地、大学以及学生(student)等属性。
* 对象student和study之间的联系为1:N
(2)试用ORDB的定义语言,定义这个数据库
CREATE TYPE MyString char varying;
CREATE TABLE student(sno integer,
sname MyString,
city MyString,
studies setof(ref(study)));
CREATE TABLE study(coursename MyString,
grade integer,
city MyString,
university MyString,
student ref(student));
(3)试用ORDB的查询语言,分别写出下列查询:
① 检索每个学生的学习课程和成绩。
SELECT , ,
FROM student as A, as B;
② 检索至少有一门课程的求学地与籍贯在同一城市的
学生学号和姓名。
SELECT ,
FROM student WHERE =;
as A, as B
因篇幅问题不能全部显示,请点此查看更多更全内容