1、 作业及参考答案 1.1 关系模型:1. 试述数据库系统的组成和 DBA 的职责.答:组成: 数据库、数据库管理系统、应用系统、数据库管理员、用户。DBA 负责全面管理和控制数据库系统,主要职责:设计和定义数据库系统帮助用户使用数据库系统监督与控制数据库系统的使用和运行改进和重组数据库,调优数据库性能转储与恢复数据库重构数据库2. a)找出下面表的三个候选键.A B C Da1 b1 c1 D1a2 b3 c1 D2a3 b4 c2 D2a4 b2 c2 D1答:三个候选键:A, B, (C,D)b)给出一个四行四列的表,要求只有一个由前三列组成的候选键.答:A B C Da1 b1 c1 D
2、1a2 b1 c1 D1a1 b2 c1 D1a1 b1 c2 D13.根据您的认识设计一个人事管理数据库,要求说明设计的背景及理由.答:要点:首先划定该数据库的应用范围,要解决哪些问题(不一定包罗人事事务的方方面面) ;在问题范围内确定数据项;研究数据项间关系形成一个由相互关联的若干张表组成的数据库。注:列出各个表的数据项,表与表的参照关系。几个独立的表并不是关系数据库的主要目的,不要有冗余。1.2 关系代数:1.如果关系 R 和 S 没有共同的列属性 ,根据定义说明表 RS 等于表 RS 。答:广义笛卡尔积(Extended Cartesian Product):两个分别为 n 目和 m
3、目的关系 R 和 S 的广义笛卡尔积是一个(n+m)列的元组的集合。元组的前 n 列是关系 R 的一个元组,后 m 列是关系 S 的一个元组。若 R 有 k1 个元组,S 有 k2 个元组,则关系 R 和关系 S 的广义笛卡尔积有 k1k2 个元组。记作:R S=trts|trRts S 连接: 连接也称为 连接。它是从两个关系的笛卡尔 积中选取属性间满足一定条件的元组。记作:RS=trts|trRtsStrA=tsBAB其中 A 和 B 分别为 R 和 S 上度数相等且可比的属性组。 是比较运算符。连接运算的结果是从 R 和 S 的广义笛卡尔积 RS 中选取 R 关系在A 属性组上的值与 S
4、 关系在 B 属性组上值满足比较关系 的元组。 连接的定义中如果 R 和 S 中没有相同的列 A、B ,则在确定元组 t 在不在表 RS 中时,应忽略对列 A 和列 B 的引用,那么连接的定义就退化为广义笛卡尔积 RS,于是有 RS=RS。2.对 CAP 数据库,用关系代数完成下列查询。1)找出顾客、代理商和商品都在同一个城市的三元组(cid,aid,pid) 。答: cid,aid,pid(C.city=A.city and A.city=P.city(CA)P) 或cid,aid,pid(C.city=A.city and A.city=P.city(CAP)2)找出顾客、代理商和商品两两
5、不在同一个城市的三元组(cid,aid,pid) 。答: cid,aid,pid(C.cityP.city and C.cityY and YZ.3)列出所有在同一个城市代理商的 aid 对。答:A1 := A, A2 := AA1.aid,A2.aid(A1.city=A2.city and A1.aid=C2.discnt(C1C2)X C.cid(C)最小: C1 := C, C2 := CX(cid1,cid) :=C1.cid,C2.cid(C1.discntOY.aid and O.cid=OY.cid(OOY)1.3 SQL:1.检索佣金百分率大于最小百分率的代理商 aid.答:
6、 select aid from agents where percent any (select percent from agents);2.求通过住在北京或上海的代理商订货的顾客 cid.(使用子查询和不使用子查询两种)答: select distinct cid from orders where aid in (select aid from agents where city = “北京” or city=”上海” );select distinct cid from orders,agents where orders.aid=agents.aidand (agents.city
7、 = “北京 ” or agents.city=”上海” );3.R、S 和 T 具有相同的属性列 A1An,不用高级 SQL 来实现关系表达式(R UNION S) MINUS T.答: (R UNION S) MINUS T.=(R MINUS T) UNION (S MINUS T)(select * from R where not exists (select * from T where R.A1=T.A1 and and R.An=T.An)union(select * from S where not exists (select * from T where S.A1=T.A
8、1 and and S.An=T.An);4.求出没有为任何住在北京的顾客订购任何在天津生产的产品的代理商的 aid.答: select a.aid from agents a where not exists(select o.* from orers o,customers c,products pwhere o.aid=a.aid and o.cid=c.cid and o.pid=p.pidand c.city=北京 and p.city=天津);5.没有一个包含 GROUP BY 子句的查询会返回重复行,这一命题为真吗?如果为真,解释原因;否则,给出反例.答: 不真.例: selec
9、t count(*) from table group by ;返回表只有一列,有与原表一样多的行,每行值都是 1.6.说出你所用到 DBMS 和其中的 SQL 语句,他们与讲课时的不一样或者不能用 .1.4 对象关系数据库:1.对象关系数据库特点.对象-关系数据库系统除了具有原来关系数据库的特点外,还应该有以下特点:(1)扩充数据类型 (2)支持复杂对象 (3)支持继承的概念 (4)提供通用的规则系统2.行对象与列对象有何不同?行对象,一个表可以为包含用户定义类型的多个行对象,即可以违犯第一范式,ORACLE 为每个行对象提供一个唯一标识;而一个表的一列(列对象)可定义包含一个用户定义类型的
10、值,而且 ORACLE 不能为每一列提供一个唯一标识。3.Value(),Ref(),Table()的作用?Value() 取属性值Ref() 引用对象值Table() 将对象转换成表4.student_t 类型中有 namesex_t 类型以及学号 id、e-mail 和入学年份(整数),其中 namesex_t 不空。定义 student_t 类型和表 student,学号 id。create type student_t as object (id char(8),email char(20),year int, ename namesex_t not null);create tabl
11、e student of student_t (primary key(id);5.对对象关系数据库 CAP,查找姓李的代理商 aid 和 ananme,这些代理商没有销售过北京的商品。select A.aid,A.aname from agent A where A.aname like “李%“ and not exists (select * from order O,agent A,product P where O.pid=P.pid and O.aid=A.aid and P.city=“北京“)6检索在三个以上矩形中出现的点,显示点和覆盖这些点的矩形数。Select P.x ,
12、P.y count(*) as cnt from points P , rects R where R.inside(Value(P) 0 group by P.x , P.y having count(*) 32.1 数据存储:1.ORACLE 中执行: create table customers(cid) storage (initial 20480,next 20480, maxextents 8,minextents3,pctincrease 0); 该文件第一次创建时,会分配多少字节的磁盘空间? 该表最大可以容纳多大的空间?答: 第一次创建时会分配 20K+20K(3-1)=60K
13、 字节,该表最大可以容纳的空间为 60K+20K(8-3)=160K 字节.2.职工表 emp 中有 200000 行,每行长度 100 字节.create table emp (eid int not null) pctfree 25;设块中可使用 2000 个字节,估算 emp 中行所需的块的个数.create unique index on emp (eid) pctfree 20;ROWID 占 6 个字节,eid 占 4 个字节,每个键的列附加一个字节.估算 B 树索引中每一块的索引项个数,叶子层块数?假设目录层目录项(sepkeyval, np)与叶子层中的项相等,估算每一目录层的
14、块数?eid 的值从 1 到 200000 连续,每秒可进行 80块磁盘操作,估算在没有聚簇和有聚簇情况执行下列查询所需时间? select * from emp where eid between 10000 and 20000;答:(200000*100)2000(1-25%)=13334( 块).故 emp 中行所需的块的个数为 13334;2000 (1-20%)(6+4+1)=145每一块的索引项个数为:145200000145=1380叶子层块数为:1380K=CEIL(log n(M)=CELL(log145 (200000)=3(层)故,包含叶子层共 3 层,其中目录有 2 层
15、根目录: 1 块第二层目录: 145 块没有聚簇情况下所需时间为:(访问索引根+访问第二层目录+ 访问叶子节点+访问数据行)80 = (1+145+CELL(10000145)+ 10000)80=128(s)有聚簇情况下所需时间为: (访问索引根+访问第二层目录+ 访问叶子节点)80= (1+145+CELL(10000145)80=2.7(s)3.解释散列簇.答:散列簇(Hash Cluster)是簇的另一种形式,它同样把若干有共用列的表聚簇在一起,但是散列簇不建索引,簇中的数据要通过散列函数计算(通过 HASH 函数生成HASH 值,由 HASH 值确定键值对应行的存储位置)得出物理位置
16、,一步到位.它可以极大程度的提高等值查询的效率.2.2 数据管理:1. 利用非过程性约束和过程性约束完成完整性定义:保证表 agents 的行的城市值必须是表 coutomers 中的城市之一。答:非过程性约束是在建表时建立约束create table AGENT (aid char(4) not null, city char(4), primary key (aid),constraint cityref foreign key (city) references customers (city);过程性约束是建立触发器能引起一个动作的执行约束create trgger t_cbefore
17、 insert or update of city on AGENTstatementdeclare v1 string;v2 string;v3 integer;beginv2 :=:new.city; v1 :=:old.city; select count(*) into :v3 from customer where city = :v2 ;if v3 = 0 thendbms_output.put_line(city 无效);rollback;end ifend;2. CAP 数据库中的四张表对应各自的用户,彼此不能相互操作,请给出让彼此之间可以相互查看的措施。答:可以创建角色,该角
18、色可以查看各用户的四张表。把角色授予用户。3. 结合数据库恢复的内容谈谈如何保证数据库的可靠性。答:ORACLE 数据库的恢复过程分两步进行,首先将把存放在重做日志文件中的所有重做运用到数据文件,之后对、重做中所有未提交的事务进行回滚,这样所有数据就恢复到发生灾难那一时刻了。数据库的恢复只能在发生故障之前的数据文件上运用重做,将其恢复到故障时刻,而不能将数据文件反向回滚到之前的某一个时刻。4、简述资源限制文件的作用。答:资源限制文件(profile)可以使用企业管理器(OEM)或 SQL*Plus 创建环境资源文件,使资源限制文件生效需在 init.ora 中设置 resource_limit
19、=TURE。资源限制文件可以做到口令限制和资源限制。资源限制包括又可以分为会话级限制(当达到限制要求时则断开会话)和调用级限制(当达到限制要求时回退语句),具体有:限制会话的数量、每个会话使用 CPU 时间(100 秒为单位)、CPU 调用的次数、逻辑读的次数、每次调用的逻辑读的次数、空闲时间以及连接时间等。5、将没有任何权限的角色授予用户会起什么作用?答:角色介于权限和用户之间,是一组系统权限和对象权限的集合,把它们组合在一起赋予一个名字。用户被授予某个角色,则拥有该角色的所有权限。因此将没有任何权限的角色授予用户,则以后对该用户的授权可变为对角色的授权,实际使用时经常将同一类型的用户的权限
20、归结为角色的权限,增减用户的权限问题变成角色权限的增减,简化操作。3.1 嵌入式 SQL 3.2 事务处理技术:1. 解释游标.游标:在查询结果的记录集合中移动的指针。 若一个 SQL 语句返回单个元组,则不用游标。若一个 SQL 语句返回多个元组,则使用游标。2. 针对 CAP 数据库,编写应用程序:给出任意产品的 pid,列出购买该产品的前 5 名顾客(cid,cname)及其购买数量,即这些顾客购买该产品的数量最大.#define ture 1#include #include “prompt.h”exec sql include sqlca; /*声明通讯区*/int main( )c
21、har pid_prompt=“请输入产品号:”;exec sql begin declare section; char cust_id5,cust_name20,cid5;double qty;exec sql end declare section; /*声明变量*/exec sql declare order_qty cursor for select first 5 cust_id,cust_name,qtyfrom customers c,orders owhere c. cust_id=o.cid and o.pid= pid_promptorder by o.qty;/*游标*
22、/exec sql whenever sqlerror goto report_error;exec sql whenever not found goto finish;/*出错处理*/strcpy(user_name,”mytest”);strcpy(user_pwd,”test”);exec sql connect :user_name identified by :user_pwd; /*连接*/ while(prompt(pid_prompt,1, o.pid,4)=0)exec sql open agent_dollars;while (ture) exec sql fetch o
23、rder_qty into : cust_id,:cust_name,:qty; /*游标取值*/printf(“ %s %s %11.2fn”,cust_id, cust_name,qty);continue;finish: exec sql close order_qty; exec sql commit work; /*输入顾客 ID 的代理商和金额 */ exec sql commit release; /*正常释放连接*/return 0;report_error:print_dberror(); /*出错信息 */exec sql rollback release; /*释放连接*
24、/return 1;3. 说明数据库管理系统保证数据一致性和并发性的机制.事务处理是实现数据库一致性和并行性的重要手段,在保证一致性的前提下最大限度地提高并发度。具体采用了数据封锁技术和事务技术,不同封锁协议在不同程度上保证数据一致性和系统并发性。4. ORACLE 为什么设置回退段?ORACLE 为了适应事务控制设置了回退段这一数据库对象.系统利用回退段来确保诸如读一致性、数据库恢复等管理功能。ORACLE 在缺省情况下,读数据不用加锁,通过回退段(Rollback Segment) 保证用户不读脏数据和可以重复读5. 数据库设计者在保证数据一致性和并发性方面可以有哪些措施?数据库设计者应该
25、利用各种方法减少数据对象的封锁时间,以提高系统并发能力;在事务中尽可能晚地发出封锁申请;在备份的数据库对象上操作以减少封锁时间;利用索引减少封锁时间,查询操作可以根本不访问索引关联的表,而直接给出查询结果。数据库设计者应该按照约定顺序封锁表减少出现死锁的可能性,以提高系统并发能力。3.3 数据库应用系统体系结构 3.4 中间件:1. 一个典型的数据库应用程序由哪四部分组成?由用户界面、应用表示逻辑、事务逻辑、数据管理四部分组成。2. 客户机和服务器的任务各是什么?客户程序运行用户的应用程序,向数据库服务器发送 SQL 请求,数据库服务器接受客户机的请求,并将处理结果返回客户端。减少了网络信息的
26、传输,系统采用数据锁定、事务技术、存储过程等数据库技术保证数据完整一致准确。3. 从 C/S 的结构看 ,其发展趋势如何 ?采用了三层体系结构,将应用分成表示部分、应用逻辑、数据访问,使其各自独立并单独实现,分别称为客户、应用服务器和数据库服务器;同时数据在发送到网络之前由功能服务器加以过滤,网络流量会减少,另外客户端并不是直接同数据库打交道,而是通过中间层的统一调用来实现,在灵活性和独立性方面较好,适合于不同数据库的互联。4. 举例说明 C/S 系统开发中的并发控制、安全控制等管理问题。C/S 系统的并发控制:C/S 系统必须提供封锁机制,事务编程要尽可能避免死锁,并允许死锁的发生及提供解决
27、死锁的方案,保证并发执行的同时维护数据的一致。封锁机制可以由 DBMS 自动控制,也可以通过显式加锁完成。C/S 系统的完整性约束:在 C/S 系统中,数据完整性约束是在服务器上定义,并由服务器来检查约束,这样能方便地实现对数据库的完整性和一致性控制。如果由客户机检查约束,检查逻辑必须包含在每一个应用程序中,既浪费又容易出错。C/S 系统的安全性控制:DBMS 通常运行在后台服务器上,自身已具备安全管理功能。应用程序运行在前端客户机上,安全性问题由开发者自己设计。通过内核级透明代理、用户授权机制、智能型日志、备份及恢复机制将后台 DBMS 的安全机制与前端应用程序的安全机制有机结合起来,形成统
28、一的安全保密机制。5. 分布式数据库系统的优点缺点是什么? 优点:采用了分布式控制、增强了数据共享性、提高了系统可靠性和可用性、改善了系统性能、可扩充性好。缺点:系统更加复杂、增加了开销(硬件开销、通信开销、冗余数据管理开销、保证数据库全局并行性、并行操作的可串行性、安全性、完整性的开销、软件开发费用) 。 6. 结合实际谈谈 B/S 模式中的中间件。基于 J2EE 技术架构设计的多层 B/S 结构,他具备以下特点:集中化管理和维护,客户端的免安装和零维护,极大的降低了企业的维护成本。客户层支持从 WEB 到 PDA 等各种终端设备,支持移动商务;采用纯 JAVA 技术开发,可以在多种主流服务
29、器和操作系统平台上运行;实现对多数据库的适配;方便用户对系统的扩展、升级、维护,同时也能充分保护用户的投资。高度的可靠性应用:EJB 中间件的抗崩溃特性(事务处理机制、资源统一管理) 。应用程序在例外(EXCEPTION)处理、并发控制、容错、日志处理等的有效设计,提高了应用程序本身的可靠性。系统有自检与自恢复能力,并通过动态的监控能力提供故障快速排除的手段。高度的安全性应用:采用 B/S 多层结构,系统代码全部放于服务器上,只有服务器管理人员才能更改代码。只有运行在服务器上的代码才可以访问数据库,客户端不能直接访问,这样可以保证服务器安全。4.1 Oracle 数据库体系结构 1、简述 OR
30、ACLE 数据库的组成。答:ORACLE 数据库由实例(Instance)和物理文件两部分组成。1、实例(Instance ):包括内存结构和 ORACLE 进程。其中内存包括共享池、数据库缓冲区和日志缓冲区,ORACLE 进程包括数据库写入(DBWR) 、日志写入(LGWR) 、检查点(CKPT) 、系统进程(SMON) 、系统监控(PMON ) 、归档进程(ARCH )等一系列进程。2、物理文件:包括数据文件、日志文件、控制文件,以及参数文件、口令文件、归档文件等。2、初始化参数的作用是什么?答:初始化参数的作用为:(1) 初始化参数文件也称启动参数文件,缺省名为 init.ora。在数据
31、库启动时,在创建实例或读取控制文件之前,先读取 init.ora 文件,直到数据库被关闭并重新启动,对 init.ora 文件中参数的修改才被承认。(2) 初始化参数文件是 DBMS 的主要配置点,包括定义名称的参数、设置静态限制的参数、影响动态性能的参数、控制或修改数据库和实例操作的某个方面。Init.ora 文件中的值决定着数据库和实例的特性,例如共享池、高速缓存、重做日志缓存分配、后台进程的自动启动、控制文件的读取、自动联机回滚段等等。(3) 通过调整初始化参数可以改善数据库系统的整体性能。3、如何为控制文件做镜像?答:为控制文件做镜像有以下两种情况:(1) 如果要将控制文件镜像备份到一
32、个新的数据库中,只需要在发出CREATE DATABASE 命令之前,为 CONTROL_FILES 指定一个以上的参数即可。(2) 果要将控制文件镜像备份到一个现有的数据库中,必须关闭数据库,将当前的控制文件拷贝到想要备份的目录当中,编辑 init.ora 中的CONTROL_FILES 参数,以指定新的控制文件的位置,然后启动数据库。4、ORACLE 日志能否替代第三章介绍的智能型日志?说明理由。答:不能够替代。因为智能型日志文件能够在能够保证需要的日志都在磁盘上。在系统中,智能型日志将记录:自某用户登录时起,到其退出系统时止,这段时间中执行的所有操作,包括登录失败操作,具体内容有执行某操
33、作的用户名、执行操作的计算机 IP 地址、操作类型、操作对象、执行时间等。一旦系统发生故障或受到非授权用户的恶意攻击,通过查询日志系统的记载可追溯到事件发生的所有过程。另外,日志系统还可以使系统管理员分类检索日志内容,通过智能推理日志内容,寻找系统中可能存在的不安全因素。可见,智能型日志的记录时间比 Oracle 的日志时间要长,而且能够获得更多的系统信息。5、试从 ORACLE 数据库的存储结构谈谈 ORACLE 的先进性、灵活性?答:从数据库的存储结构来看,ORACLE 的先进性、灵活性体现在:(1) racle 块,是操作系统块的整数倍。这样可以使得联机事务处理获益,因为这些应用在每个事
34、务期间,通常要读写少量的数据,因此较小的块在 I/O 性能方面更为有效。(2) 数据仓库或决策支持系统数据库来说,较大的数据库块能够极大地提高性能。这些类型的应用在一个事务过程中,常常需要处理大量的数据,并且通常考虑系统的响应时间以分钟来计时,而不以秒来计时。一个数据文件的大小是根据 CREATE 语句中指定的大小来建立的,而不是由它所贮存的数据量决定的。由一个或者多个 oracle 数据块组成的区间是 oracle 的一个存储单位。 每个数据库段都是由一个或多个区间组成,在一个数据库段中的每个区间的大小可以相同或不同。这里体现了 oracle 的灵活性。一个数据库段在对象创建时,完全按照CR
35、EATE 命令的存储子句中所指定的来分配区间。将相似访问的数据放在同一个表空间里。以便于访问,体现了 oracle 的先进性。因为一个表空间直接映射着一个或多个数据文件,使得备份和恢复数据可以在表空间下进行。表簇的建立。可以将那些经常在相同数据块中一起使用的表进行物理分组。从而可以减少某一些查询的时间。动态性能试图;包含了大量数据库函数运行时的性能和统计信息。可用于系统管理员解决和诊断问题。4.2 Oracle 数据库实例管理 1、何谓 ORACLE 实例?答:ORACLE 实例是指有自己的内存结构和相关的服务器进程及后台进程的DBMS。即为一系列复杂的内存结构和操作系统进程,它为 ORACL
36、E 用户提供所期望的不同程度的服务。一个实例只能打开一个数据库,或者说一个数据库被唯一的一个实例装载。2、为什么 ORACLE 有 SGA?答:SGA(System Global Area) ,即 ORACLE 的系统全局区。ORACLE 中设SGA 是因为:(1)ORACLE 的实例中每一个进程都有各自的一个内存块,该内存块用于保存私有变量、地址堆栈和其他运行时的信息。而一些共享信息,如最近使用的 SQL 语句、最近使用的数据、最近使用的数据字典等,则放在 SGA 这样的共享区域中,供各个进程调用。 SGA 是实例的主要部分,含有数据维护、SQL 语句分析和重做缓存所必须的所有内存结构,多个进程可以在同一时间对 SGA 中的数据进行访问和修改。(2)SGA 由共享池、数据库缓冲区高速缓存、重做日志缓冲区组成。这些内存结构可以提高系统执行 SQL 语句的性能,或是改善整个系统性能。