数据库原理教程习题答案(全)

更新时间:2024-06-16 05:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

0000000000

第1章 数据库系统概述

习题参考答案 税务局使用数据库存储纳税人(个人或公司)信息、纳税人缴纳税款信息等。典型的数据处理包括纳税、退税处理、统计各类纳税人纳税情况等。

银行使用数据库存储客户基本信息、客户存贷款信息等。典型的数据处理包括处理客户存取款等。

超市使用数据库存储商品的基本信息、会员客户基本信息、客户每次购物的详细清单。典型的数据处理包括收银台记录客户每次购物的清单并计算应交货款。

1.2 DBMS是数据库管理系统的简称,是一种重要的程序设计系统。它由一个相互关联的数据集合和一组访问这些数据的程序组成。

数据库是持久储存在计算机中、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储,可以被各种用户共享,具有较小的冗余度、较高的数据独立性,并且易于扩展。

数据库系统由数据库、DBMS(及其开发工具)、应用系统和数据库管理员组成。

数据模型是一种形式机制,用于数据建模,描述数据、数据之间的联系、数据的语义、数据上的操作和数据的完整性约束条件。

数据库模式是数据库中使用数据模型对数据建模所产生设计结果。对于关系数据库而言,数据库模式由一组关系模式构成。

数据字典是DBMS维护的一系列内部表,用来存放元数据。所谓元数据是关于数据的数据。

1.3 DBMS提供如下功能:

(1) 数据定义:提供数据定义语言DDL,用于定义数据库中的数据对象和它们的结构。 (2) 数据操纵:提供数据操纵语言DML,用于操纵数据,实现对数据库的基本操作(查

询、插入、删除和修改)。

(3) 事务管理和运行管理:统一管理数据、控制对数据的并发访问,保证数据的安全性、

完整性,确保故障时数据库中数据不被破坏,并且能够恢复到一致状态。

(4) 数据存储和查询处理:确定数据的物理组织和存取方式,提供数据的持久存储和有

效访问;确定查询处理方法,优化查询处理过程。

(5) 数据库的建立和维护:提供实用程序,完成数据库数据批量装载、数据库转储、介

质故障恢复、数据库的重组和性能监测等。

(6) 其他功能:包括DBMS与其它软件通信、异构数据库之间数据转换和互操作等。

1.4 使用数据库进行信息管理具有如下优点:

(1) 数据整体结构化:在数据库中,数据的组织面向整个机构、面向所有可能的应用,

而不是某个具体部门或某个特定的应用。数据结构不仅描述现实世界的对象,而且描述对象之间的联系。

(2) 数据可以充分共享:数据库中的数据的面向整个机构组织使得它能够更好地被多个

用户、多个应用程序共享。

(3) 数据独立性:数据独立性是指数据与应用程序相互独立,包括数据的物理独立性和

数据的逻辑独立性。数据的结构用数据模型定义,无需程序定义和解释。

(4) 数据由DBMS同一管理和控制,使得系统能够为数据管理提供更多的支持。这些支

持包括:提供事务支持、增强安全性、保证完整性、平衡相互冲突的请求和面对故障的弹性。

(5) 标准化:使用数据库进行信息管理有利于制定部门标准、行业标准、工业标准、国

家标准和国际标准,促进数据库管理系统和数据库开发工具的研制、开发,推动数据管理应用的健康发展。

1.5 数据模型的三个基本要素是:

数据结构:描述数据库的对象和对象之间的联系,是对数据的静态描述。

数据操作:数据库中各种对象允许的操作和操作规则,使对系统的动态描述。

完整性约束:一组完整性规则,用以限定符合数据模型的数据库状态和状态的变化,保证数据的正确、有效和相容。

对于关系数据库而言,关系模型只有一种数据结构——关系。现实世界中的对象和对象之间的联系都用关系表示。关系是元组的集合。从用户角度来看,关系是一张二维表。

在关系模型中,定义数据操作的方法有两种:关系代数和关系演算。关系代数显式地定义了一些关系运算,而关系演算的基础是一阶谓词逻辑,它用逻辑公式表示查询结果必须满足的条件。

关系模型的完整性约束包括实体完整性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是通用完整性约束,由关系模型明确定义。

1.6 数据库系统的三级模式是指外模式、模式和内模式。外模式是特定数据库用户的数据视图,是与某一具体应用相关的数据局部逻辑结构的描述。模式是数据库中全体数据的总体逻辑结构描述,是所有用户的公共数据视图。内模式是数据物理结构和存储方式的描述,定义数据在数据库内部的表示方式。

数据库系统的三级模式提供了三个层次的数据抽象。这样做的一个优点是可以隐蔽数据存储细节,从而隐蔽系统内部的复杂性,简化系统的用户界面。另一个优点是可以带来数据的独立性。

1.7 所谓数据独立性是指数据独立于应用程序,分数据的逻辑独立性和数据的物理独立性两种。

数据的逻辑独立性是指应用程序与数据库的逻辑结构之间的相互独立性。当数据的逻辑

结构改变时,通过修改外模式-模式映像,保持外模式不变,从而使得建立在外模式上的应用程序也可以不变。

数据的物理独立性是指应用程序与存储在磁盘上的数据库中数据之间的相互独立性。 当数据的物理存储结构改变时,通过修改模式-内模式映像,保持模式不变。由于外模式是定义在模式上的,模式不变,则外模式不需要改变,从而使得建立在外模式上的应用程序也可以不变。

数据的逻辑独立性是指数据的逻辑结构改变不影响应用程序,而数据的物理独立性是指数据的物理组织(存储结构)改变不影响应用程序。

1.8 DBA的主要职责包括:

(1) 决定数据库中的信息内容和数据的逻辑结构。 (2) 决定数据库的存储结构和存取策略。

(3) 定义数据的安全性要求和完整性约束条件。

(4) 数据库系统的日常维护:周期性转储数据库、故障恢复、监督系统运行、优化系统

性能、设置必要的审计。

(5) 重组和重构数据库。

第2章 实体-联系模型

部分习题参考答案

2.1 解释术语:

实体是客观存在并且可以相互区分的任何事物。 实体集是具有相同属性的实体的集合。 联系是多个实体之间的相互关联。

联系集是相同类型联系的集合。形式地说,设E1, E2, …, En是n(n ? 2)个实体集,它们不必互不相同。联系集R是{(e1, e2, …, en) | e1? E1, e2? E2, …, en? En}的一个子集,其中(e1, e2, …, en) ? R是一个联系,并称ei(1? i ? n)是该联系的参与者,n是联系的度(元)。

简单属性是不能划分成更小的部分的属性。

复合属性是可以划分成更小部分的属性(即可以分成一些其他属性)。 单值属性是一个特定的实体在该属性上只能取单个值的属性。 多值属性是特定的实体在该属性上可以取多个值的属性。 基本属性是其值不能通过其他属性的值推导出来的属性。

派生属性又称计算属性,是其值可以从其他相关属性或实体计算得到的属性。 码是主码或候选码的简称。

主码是指数据库的设计者选中的,用来区分同一实体集中不同实体的候选码。 候选码:其真子集都不是超码的极小超码称为候选码。

超码:其值可以惟一确定实体集中每个实体的属性集称为该实体集的超码。

一对一联系:如果E1中的每个实体最多与E2中的一个实体相关联,并且E2中的每个实体也最多与E1中的一个实体相关联,则称E1和E2之间联系为一对一联系。

一对多联系:如果E1中的每个实体都可以与E2中任意多个实体相关联,而E2中的每个实体最多与E1中一个实体相关联,则称这种联系为E1到E2的一对多联系。

多对一联系:如果E1中的每个实体最多与E2中的一个实体相关联,而E2中的每个实体都可以与E1中任意多个实体相关联,则称这种联系为E1到E2的多对一联系。

多对多联系:如果E1中的每个实体都可以与E2中任意多个实体相关联,并且E2中的每个实体也可以与E1中任意多个实体相关联,则称E1和E2之间联系为多对多联系。

2.2 商品应当包含如下属性:

商品条码:标识商品。 商品名称:用户识别。 商品类别:用于商品分类。 生产商: 生产时间: 进价: 销售价: 存货数量:

2.3 所有部门形成一个实体集,所有经理形成一个实体集。假定每个部门最多只有一个经理,而每个人只能在一个部门出任经理,那么部门与经理之间的联系“管理”是一对一联系。如果允许部门经理空缺,但一个人是经理的话,必须在一个部门任职,那么经理对联系“管理”的参与是全部参与,而部门是部分参与。

所有学生形成一个实体集,所有院系形成一个实体集。每个院系由多个学生,而每个学生只能在一个院系。因此,学生与院系之间的联系是多对一联系。通常,一个学生总在一个院系中,而每个院系都有学生。因此,学生和院系对该联系都是全部参与。

商品是一个实体集,订单是一个实体集。每个订单可以包括多种商品,而一种商品可以被多个订单订购。这样,商品与订单之间的联系“订购”是多对多联系。通常,每个订单至少包含一种商品,而每种商品都会被某个订单订购(否则就不再销售这种商品)。这样,商品和订单对该联系的参与都是全部参与。

2.4 按以下要求各举一个实际例子:(1)三个实体集两两之间都存在多对多联系(在你的例子中,三个实体集之间还存在有意义的联系吗?),(2)三个实体集之间存在多对多联系(在你的例子中,其中两个实体集之间还存在有意义的联系吗?)。 (1) 实体集教师、课程和学生两两之间的多对多联系

教师和课程之间的联系“讲授”是多对多的:一个教师教多门课程,一门课程由多位教师讲授

课程和学生之间的联系“选修”是多对多的:一门课程可以被多个学生选修,一个学生可以选多门课程。

学生和教师之间的联系“师生”也是多对多的:一个学生可以有多位教师,一个教师可以有多个学生。

教师、课程和学生三者之间也存在有意义的联系,表明特定的学生选修了特定教师讲授的特定课程。

(2) 供应商、零件和项目之间的多对多联系“供应”

一个供应商向多个项目提供多种零件;一种零件由多个供应商提供,并用于多个项目;一个项目使用多个供应商提供的多种零件。

这三个实体集中两个实体集之间的有意义联系实际上“供应”的投影。

2.5 弱实体集的主码可以通过它与强实体集的联系推断。如果将强实体集的主码属性添加到弱实体集,那么这些属性将通过实体集和联系两种方式提供,从而导致冗余。此外,实体集应当只包含描述该实体的属性,强实体集的主码属性并不是描述弱实体集的,因此添加它们使得模型不清晰。

2.6 如果一部分实体集通过E-R图的一条路径相连接,则这些实体集是相关的,或许是间接相关的。一个非连通的图意味一部分实体集与另一部分实体集是不相关的。如果我们将E-R图划分成连通分支,则事实上我们就有了一些分离的数据库,每个对应一个连通分支。

如上所述,一对实体集之间的路径指明这两个实体集之间的一种联系(可能是间接的)。如果图中存在环,则环中每对实体集至少可以通过两种不同的方式相关联。如果E-R图是无环的,则每对实体集之间至多存在一条路径,因此每对实体集之间至多存在一种联系。

2.7 假定每辆汽车只属于一位客户。

涉及的实体集有:客户、汽车和事故。 需要建立如下联系:

拥有:客户与汽车之间的多对一联系

发生:客户、汽车和事故之间的多对多联系。

损坏估计最好作为联系“发生”的属性,因为损坏估计不仅与事故有关,而且与特定客户的特定汽车有关。

E-R图如图2.1所示。

姓名 客户ID 客户 地址 电话 车辆编号 车型 出厂年份 拥有 汽车 发生 事故编号 事故 发生时间 损坏估计 事故地点 图2.1 习题2.7的E-R图

2.8 假定一个客户可以有多个账户,但一个账户只属于一个客户。

涉及的实体集有:账户、支行、客户和贷款。题中已经清楚描述。 建立如下联系:

账户-支行:账户与支行之间的多对一联系,其中账户全部参与。 贷款-支行:贷款与支行之间的多对一联系,其中贷款全部参与。 借贷:客户与贷款之间的多对一联系,其中贷款全部参与。 账户与客户之间有两种联系:

存取款:客户与账户之间的多对多联系,包括属性存取金额和存取日期。 属于:客户与账户之间的一对多联系。 E-R图如图2.2所示。

城市 账号 余额 支行名称 账户-支行 支行 街道 资产 账户 存取金额 存取款 存取日期 属于 贷款-支行 客户 客户ID 姓名 地址 联系电话 借贷 贷款 贷款号 贷款金额 贷款日期 图2.2 习题2.8的E-R图

2.9 方法一:使用弱实体

建立弱实体集“贷款偿还”,包括属性:偿还编号(顺序号)、偿还日期、偿还金额; 建立建立“贷款偿还”与其标识实体集“贷款”之间的标识性联系“还贷” 方法二:使用多值属性

将“贷款偿还”作为贷款的多值复合属性,它包括属性:偿还编号(顺序号)、偿还日期、偿还金额

方法三:使用强实体集 建立强实体集“贷款偿还”,包括属性:贷款编号、偿还编号(顺序号)、偿还日期、偿还金额;

建立建立“贷款偿还”与 “贷款”之间的联系“还贷” 方法一最好,方法三最差,理由与职工-家属的例子类似。

2.10 假定:

每位职工在同一时间段只从事一项工作。

每位职工不能同时在多个部门工作,也不能是多个部门的经理。 每位职工不能同时参加多个项目。 每位职工的办公室唯一。 一个项目只由一个部门承担。 一个办公室职能属于一个部门。

该问题涉及的实体集有:部门、职工、项目、办公室和职工的工作经历,其中工作经历存在依赖于职工,是弱实体集,其余是强实体集。

电话只有一个属性“电话号码”,不把它视为实体集。一个办公室有多部电话,但假定每位职工只有一部电话。

需要建立如下联系:

管理:职工与部门之间一对一联系 工作:职工与部门之间多对一联系

部门名称 部门号 承担 项目名称 项目 项目预算 参加 职工号 属于 姓名 地址 电话号码 开始日期 任务 截止日期 工资 工作简历 职工 职-办 管理 工作 办公室 位置 电话号码 部门 预算 部-办 办公室名称 图2.3 习题2.10的E-R图

承担:部门与项目之间一对多联系 部-办:部门与办公室之间一对多联系 参加:职工与项目之间多对一联系 职-办:职工与办公室之间多对一联系

属于:弱实体集工作简历与标识实体集职工之间的多对一联系 E-R图如图2.3所示。

第3章 关系模型

习题参考答案

3.1 解释术语:

域是具有相同类型的值的集合。

笛卡尔积:给定n个域D1, D2, …, Dn(它们不必互不相同)上的笛卡尔积记作D1? D2?…?Dn,定义为{(d1, d2, …, dn)| d1?D1? d2? D2 ? …? dn ?Dn}。

关系:域D1, D2, …, Dn上的关系r是笛卡尔积D1? D2?…?Dn的任意子集。 元组:笛卡尔积或关系的每个元素(d1, d2, …, dn)称为一个n-元组(简称元组) 属性:关系用一个二维表表示。列通常是命名的,称为属性。

关系的码:关系R的属性集K是它的码,如果K是R的超码,并且K的任何真子集都不是R的超码(即K是极小超码)。或X是关系R的超码,如果t1和t2是R的任意实例中的元组,并且t1[X] = t2[X],则t1 = t2。

候选码:所有的码都称候选码。

主码:由多个码中选出的作为惟一识别关系元组的码

外码:如果FK是关系R的属性集,并且不是R的码,但是FK与关系R’的主码K’对应,则称FK是关系R的外码。

关系模式:关系模式用关系模式名、关系模式的诸属性和属性对应的域,以及属性间的数据依赖集定义。通常简单地用关系模式名和属性列表表示R (A1, A2, …, An)。

关系数据库模式:由若干域的定义和一组定义在这些域上的关系模式组成。

3.2 实体完整性:关系R的所有元组在主码上的值必须惟一,并且在主码的任何属性上都不能取空值。

参照完整性:如果属性集FK是关系R的外码,它参照关系S的主码Ks,则R的任何元组在FK上的值或者等于S的某个元组在主码Ks上的值,或者为空值。

3.3 除了语义约束之外,关系数据库对关系的主要限制是:

(1) 在关系数据库中,我们只考虑有限关系(笛卡尔积的有限子集),因为无限关系既不能

显式存储,也不能有效地显示。

(2) 关系的每个属性都必须是原子的,即每个属性只能取原子值。在关系数据库中,原子值

是数据访问的最小单位。属性的原子性要求是规范化关系的基本要求。

3.4 事实上,关系R的外码参照被参照关系S(目标关系)反映R的某些元组每个都与S的某个特定元组之间存在联系。有些实际问题允许R的某些元组与S的任何元组都没有联系,在这种情况下,允许R的这些元组在外码上取空值。例如,在关系Employees (Eno, Ename, Salary, Dno)中,Dno是外码。有些公司允许某些职工(如公司总裁)不属于任何特定的部门,这些职工的元组在Dno上可以取空值。

假定所有的关系模式都是E-R图转换得到的。

(1) 如果关系R是联系集转换的,则R代表联系集,其外码的值代表参与联系的特定实体集

的一个特定实体。此时,R外码都不能取空值。

(2) 设关系R的外码FR参照被参照关系S。如果关系R是实体集E1转换的,则E1必然通过

某个联系R’与S对应的实体集相关联。当这种联系不要求是完全的时,R的某些元组可以不参照S的任何元组,此时外部码FR的属性值可以为空;反之不能为空。

3.5 自然连接和等值连接的相同之处是二者都是根据属性值相等进行连接。二者的不同之处是:自然连接在相同属性上进行相等比较,并投影去掉重复属性;等值连接并不要求一定在相同属性上进行相等比较,也不删除重复属性。

3.6 由强实体集得到的关系模式:

Employees (Eno, Ename, Salary) Departments (Dno, Dptname) Suppliers (Sno, Sname, Saddress) Items (Ino, Iname, Stocks) Orders (Ono, Data) Customers (Cno, Cname, Caddress, Balance) 其中主码用下横线标示(下同)。注意,Departments的Dptname也是码,但我们选择Dno为主码。由弱实体集Dependents得到如下关系模式:

Dependents (Eno, Dname, ReltoEmp, Birthday) 将联系转换成关系模式时,不再考虑弱实体集的存在依赖联系。其余6个联系产生如下关系模式:

Manages (Dno, Eno) Works_in (Eno, Dno) Carries (Dno, Ino) Supplies (Sno, Ino, Price) Includes (Ono, Ino, Quantity) Placed_by (Cno, Ono) 其中Works_in和Manages有相同的属性,但它们的实际意义不同。

下一步,我们合并具有相同码的关系模式。首先,考虑Manages。它与Employees和Departments都包含相同的码。Maneges与Employees合并更容易回答“某职工的经理是谁”这类问题,而与Departments合并更容易回答“某部门的经理是谁”这类问题。考虑到后一类问题更经常出现,我们决定将Manages合并到Departments,并将Manages中属性Eno改名为Mrgno(表示经理的职工号),得到如下关系模式:

Departments (Dno, Dptname, Mrgno) 还有三对关系具有相同的码,它们是Employees和Works_in,Items和Carries,Orders和Placed_by。它们都可以直接合并。最后,我们得到图3.11所示E-R模型的一组关系模式:

Employees (Eno, Ename, Salary, Dno) Department (Dno, Dptname, Mrgno) Suppliers (Sno, Sname, Saddress) Items (Ino, Iname, Stocks, Dno) Orders (Ono, Data, Cno) Customers (Cno, Cname, Caddress, Balance) Dependents (Eno, Dname, ReltoEmp, Birthday) Supplies (Sno, Ino, Price) Includes (Ono, Ino, Quantity)

3.7 习题3.6的关系模式的模式图如图3.1所示。

Departments Dno Dptname Mrgno Employees Eno Ename Salary Dno Includes Ono Ino Quantity Dependents Eno Dname ReltoEmp Birthday Orders Ono Date Cno Customers Items Ino Iname Stocks Dno Supplies Sno Ino Quantity Suppliers Sno Sname Saddress Cno Cname Caddress Balance 图3.1 某公司数据库系统的数据库模式图

3.8 得到的一组关系模式如下:

客户(客户ID,姓名,地址,电话)

汽车(车辆编号,车型,出厂年份,车主ID) 事故(事故编号,发生时间,事故地点)

发生(驾照号,车辆编号,事故编号,损坏估计)

其中,客户与汽车之间的联系已经合并到关系模式“汽车”中,并将“客户ID”改为“车主ID”。

3.9 由实体集得到如下关系模式:

账户(账号,余额)

支行(支行名称,城市,街道,资产) 客户(客户ID,姓名,地址,联系电话) 贷款(贷款号,贷款日期,贷款金额) 由联系得到如下关系模式:

账户-支行(账号,支行名称) 贷款-支行(贷款号,支行名称) 借贷(客户ID,贷款号)

存取款(客户ID,账号,存取金额,存取日期) 属于(账号,客户ID) 合并具有相同码的关系模式:

账户、账户-支行、属于具有相同码,合并成一个关系模式账户,并用开户行替换支行名称,开户人替换客户标识。合并后的关系模式如下:

账户(账号,余额,开户行,开户人)

贷款和贷款-支行具有相同码,合并成一个关系模式贷款,并用贷款支行替换支行名称。合并后的关系模式如下:

贷款(贷款号,贷款日期,贷款金额,贷款支行) 最后得到的一组关系模式如下:

账户(账号,余额,开户行,开户人) 支行(支行名称,城市,街道,资产) 客户(客户标识,姓名,地址,联系电话)

贷款(贷款号,贷款日期,贷款金额,贷款支行) 借贷(客户ID,贷款号)

存取款(客户ID,账号,存取金额,存取日期)

3.10 电话号码是多值属性,需要创建一个关系模式。我们称该关系模式为电话,它的码为电话号码。该关系模式定义如下:

电话(电话号码,办公室名称) 由强实体集得到如下关系模式: 部门(部门号,部门名称,预算) 项目(项目名称,项目预算) 办公室(办公室名称,位置)

职工(职工号,姓名,地址,电话号码) 由弱实体集“工作简历”得到如下关系模式:

工作简历(职工号,开始时间,任务,工资,截止时间) 由联系集得到如下关系模式: 承担(项目名称,部门号) 部-办(办公室名称,部门号) 管理(职工号,部门号) 参加(职工号,项目名称) 工作(职工号,部门号)

职-办(职工号,办公室名称) 合并具有相同码的关系模式:

项目与承担具有相同码,合并为项目,并将部门号改为承担部门,得到: 项目(项目名称,项目预算,承担部门)

办公室与部-办具有相同码,合并为办公室,并将部门号改为所属部门,得到: 办公室(办公室名称,位置,所属部门)

管理有两个码,可以与职工合并(有利于回答“某职工的经理是谁”这类问题),也可以与部门合并(有利于回答“某部门的经理是谁”这类问题)。考虑“某部门的经理是谁”这类问题更常出现,决定于部门合并,并将职工号改为经理,得到:

部门(部门号,部门名称,预算,经理)

职工、参加、工作和职-办都具有相同码,合并为职工,得到:

职工(职工号,姓名,地址,电话号码,项目名称,部门号,办公室名称) 最后,我们得到如下关系模式:

部门(部门号,部门名称,预算,经理) 项目(项目名称,项目预算,承担部门) 办公室(办公室名称,位置,所属部门)

职工(职工号,姓名,地址,电话号码,项目名称,部门号,办公室名称) 工作简历(职工号,开始时间,任务,工资,截止时间) 电话(电话号码,办公室名称)

3.11

(1) 求上海的所有供应商的信息。

?Scity=?上海?(Suppliers)

(2) 求位于郑州的所有工程的信息。

?Jcity=?上海?(Projects)

(3) 求数量在100~150之间的供应。

?Quantity?100 ? Quantity?150(SPJ) (4) 求为工程J1提供零件的供应商号。

?Sno (?Jno=?J1? (SPJ))

(5) 求供应工程J1红色零件的供应商号。

?Sno(?Jno=?J1? ?Color=?红色?(SPJParts)) (6) 求至少提供一种红色零件的供应商名称。

?Sname(?Color=?红色?(SuppliersSPJParts)) (7) 求不提供零件P2的供应商名称

?Sname(Suppliers) ? ?Sname(?Pno=?P2?(SuppliersSPJ)) (8) 求没有使用天津供应商生产的红色零件的工程号。

使用了天津供应商生产的红色零件的工程号

?Jno(?Scity=?天津?(Suppliers)SPJ? Color=?红色?(Parts)) 该题的解

?Jno(Projects) ? ?Jno(?Scity=?天津?(Suppliers)SPJ? Color=?红

色?

(Parts))

(9) 求使用了本地供应商提供的零件的工程号和工程名称。

?Jno,Jname(?Scity=Jcity(ProjectsSPJSuppliers))

(10) 求未使用本地供应商提供的零件的工程号和工程名称。

?Jno,Jname(Projects)

?Jno,Jname(?Scity=Jcity(ProjectsSPJSuppliers)) (11) 求至少用了供应商S1所供应的全部零件的工程号。

?Jno,Pno(SPJ)? ?Pno(?Sno=?S1?(SPJ)) (12) 求提供所有零件的供应商名称。

?Sname?Sno,Pno(SPJ)? ?Pno (Parts))Suppliers)

3.12对于供应商-工程-零件数据库,用元组/域关系演算表示习题3.9中的查询 (1) 求上海的所有供应商的信息。

{t | Suppliers(t) ? t[Scity]=?上海?)}

(2) 求位于郑州的所有工程的信息。

{t | Projects(t) ? t[Jcity]=?郑州?)}

(3) 求数量在100~150之间的供应。

{t | SPJ(t) ? t[Quantity]?100 ? t[Quantity]?150)}

(4) 求为工程J1提供零件的供应商号。

{t(1) | (?u)(SPJ(u) ?u[Jno]=?J1? ? t[Sno]=u[Sno])}

(5) 求供应工程J1红色零件的供应商号。

{t(1) | (?u)( ?v)(SPJ(u) ? Parts(v) ? u[Pno]=v[Pno] ?

u[Jno]=?J1? ? v[Color]=?红色? ? t[Sno]=u[Sno])}

(6) 求至少提供一种红色零件的供应商名称。

{t(1) | (?u)(?v)(?w)(Suppliers(u) ? SPJ(v) ? Parts(w) ? u[Sno]=v[Sno] ?

v[Pno]=w[Pno] ? v[Color]=?红色? ? t[Sname]=u[Sname])}

(7) 求不提供零件P2的供应商名称

{t(1) | (?u) (Suppliers(u) ? t[Sname]=u[Sname] ?

?(?v)(SPJ(v) ? u[Sno]=v[Sno] ? v[Pno]=?P2? ))}

(8) 求没有使用天津供应商生产的红色零件的工程号。

{t(1) | (?u) (Projects (u) ? t[Jno]=u[Jno] ?

? ((?v1)(?v2)(?v3) (Suppliers(v1) ? SPJ(v2) ? Parts(v3) ?

u[Jno]=v2[Jno] ?v1[Sno]=v2[SnoO] ? v2[Pno]= v3[Pno] ?

v1[Scity]=?天津? ? v3[Color]=?红色?))} (9) 求使用了本地供应商提供的零件的工程号和工程名称。

{t(2) | (?u)(?v)(?w) (Projects(u) ? SPJ(v) ? Suppliers(w) ?

u[Jno]=v[Jno] ?v[Sno]=w[Sno]?u?Jcity]=w[Scity]? t[Jno]=u[Jno] ?t[Jname]=u[Jname])}

(10) 求未使用本地供应商提供的零件的工程号和工程名称。

{t(2) | (?s)(Projects(s)

?

? ((?u)(?v)(?w) (Projects(u) ? SPJ(v) ? Suppliers(w) ? u[Jno]=v[Jno] ?v[Sno]=w[Sno]?u?Jcity]=w[Scity]? t[Jno]=u[Jno] ?t[Jname]=u[Jname])

(11) 求至少用了供应商S1所供应的全部零件的工程号。 {t(1) | (?u) (Projects(u) ? t[Jno]=u[Jno] ? ? (?v)(SPJ(v) ? v[Sno]=?S1? ? ? (?w)(SPJ(w) ? u[Jno]=w[Jno] ? v[Sno]=w[Sno])))} (12) 求提供所有零件的供应商名称。 {t(1) | (?u) (Suppliers(u) ? t[Sname]=u[Sname] ? ? (?v)(Parts(v) ? (?w)(SPJ(w) ? u[Sno]=w[Sno] ? v[Pno]=w[Pno])))}

3.13用域关系演算完成例3.12和例3.13中的查询 例3.12

(1) 列出系编号为MA(数学系)的所有学生的详细信息。

{(x1, x2,x3,x4,x5,?MA?) | Students(x1,x2,x3,x4,x5,?MA?) }

(2) 列出所有课程的课程号、课程名和学分。

{(x1,x2,x3) | (?y)(Courses(x1,x2,y,x3))}

(3) 列出年龄不超过45岁的所有副教授的姓名、性别和年龄。

{(x1,x2,x3) | (?y1,y2) (Teachers(y1,x1,x2,x3,?副教授?,y2))}

(4) 列出选修了课程号为CS201的课程的所有学生的学号。

{(x) | (?y) (SC(x,?CS201?, y))} ? 例3.13

(1) 列出选修了课程号为CS201的课程的所有学生的学号和姓名。

{(x1,x2) | (?x3,x4,x5,x6)(?y)(Students(x1,x2,x3,x4,x5,x6) ? SC(x1,?CS201?,y))}

(2) 列出每个学生选修的每门课程的成绩,要求列出的学号、姓名、课程名和成绩。

{(x1,x2,x3,x4) | (?(y1,y2,y3,y4)(?z)(?w1,w2,w3,w4)(Students(x1,x2, y1,y2,y3,y4) ?

SC(x1,w1,z) ? Courses(w1,w2,w3,w4)}

(3) 求评估得分高于90分的教师所在院系名称、教师姓名、课程名和评估得分。

{(x1,x2,x3,x4) | (?(y1,y2)(?z1,z2,z3,z4,z5)(?w1,w2,w3) (?v)(Departments (y1,x1, y2) ? Teachers(z1,x2,z2,z3,z4,z5) ? Courses(w1,x3,w2,w3) ?

Teaches(x1, w1, v))}

3.14

(1) 求提供了零件的供应商的个数。

gcount-distinct(Sno) (SPJ)

(2) 求所有零件的平均重量。

gavg(Weight) (Parts)

(3) 求供应商S1提供的每种零件的总数量。

(2) 求位于郑州的所有工程的信息

SELECT * FROM Projects

WHERE Jcity=?郑州?;

(3) 求数量在100~150之间的供应

SELECT * FROM SPJ

WHERE Quantity BETWEEN 100 AND 150; (4) 求为工程J1提供零件的供应商号

SELECT Sno FROM SPJ

WHERE Jno=?J1?;

(5) 求供应工程J1红色零件的供应商号

SELECT Sno FROM SPJ, Parts

WHERE SPJ.Pno=Parts.Pno AND Jno=?J1? AND Color=?红色?; (6) 求至少提供一种红色零件的供应商名称

SELECT Sname

FROM SPJ, Parts, Suppliers

WHERE SPJ.Pno=Parts.Pno AND SPJ.Sno=Suppliers.Sno AND Color=?红色?; (7) 求不提供零件P2的供应商名称

SELECT Sname FROM Suppliers

WHERE NOT EXISTS (SELECT * FROM SPJ

WHERE SPJ.Sno= Suppliers.Sno AND Pno=?P2?); (8) 求没有使用天津供应商生产的红色零件的工程号

SELECT Jno FROM Projects

WHERE NOT EXISTS (SELECT *

FROM SPJ, Parts, Suppliers

WHERE SPJ.Sno= Suppliers.Sno AND

Parts.Pno=SPJ.Pno AND

Color=?红色? AND Scity=?天津?);

(9) 求使用了本地供应商提供的零件的工程号和工程名称

SELECT Jno, Jname

FROM Projects,Suppliers,SPJ

WHERE SPJ.Sno= Suppliers.Sno AND

Projects.Jno=SPJ.Jno AND Projects.Jcity= Suppliers.Scity;

SELECT Jno,Jname

FROM Projects WHERE EXISTS (SELECT *

FROM SPJ, Suppliers

WHERE SPJ.Sno= Suppliers.Sno AND

Projects.Jno=SPJ.Jno AND Projects.Jcity= Suppliers.Scity);

(10) 求未使用本地供应商提供的零件的工程号和工程名称

SELECT Jno,Jname FROM Projects

WHERE NOT EXISTS (SELECT *

FROM SPJ, Suppliers

WHERE SPJ.Sno= Suppliers.Sno AND

Projects.Jno=SPJ.Jno AND Projects.Jcity= Suppliers.Scity);

(11) 求至少用了供应商S1所供应的全部零件的工程号

SELECT Jno FROM Projects

WHERE NOT EXISTS (SELECT *

FROM SPJ SPJ1

WHERE SPJ1.Sno = ?S1? AND NOT EXISTS (SELECT *

FROM SPJ SPJ2

WHERE SPJ2.Jno= Projects.Jno AND

SPJ2.Pno= SPJ1.Pno));

(12) 求提供所有零件的供应商名称

SELECT Sname FROM Suppliers

WHERE NOT EXISTS (SELECT *

FROM SPJ SPJ1

WHERE NOT EXISTS (SELECT *

FROM SPJ SPJ2

WHERE SPJ2.Sno= Suppliers.Sno AND

SPJ2.Pno= SPJ1.Pno));

4.7

(1) 求提供了零件的供应商的个数

SELECT distinct Sno FROM SPJ;

(2) 求所有零件的平均重量

SELECT avg(weight) FROM Parts;

(3) 求供应商S1供应工程J1的每种零件的总重量

SELECT sum(weight) FROM Parts,SPJ

WHERE SPJ.Pno=Parts.Pno AND Sno=?S1? AND Jno=?J1? GROUP BY Pno;

(4) 求供应商S1提供的每种零件的总数量

SELECT Pno, sum(weight) FROM SPJ

WHERE Sno=?S1? GROUP BY Pno; 4.8

(1) 将Cno、Cname、Caddress和Balance分别为C0199、李华、郑州市大学北路46号、6000的客户信息插入Customers

INSERT INTO Customers

VALUES(?C0199?,?李华?,?郑州市大学北路46号?,6000)

(2) 从Dependents(家属)中删除删除1979年前出生的子女(ReltoEmp=?子女?)

DELETE FROM Dependents

WHERE ReltoEmp=?子女? AND year(Birthday)<1979;

(3) 将销售部门(Dname=?销售?)的职工工资(Salary)提高4%

UPDATE Employees SET Salary=Salary*1.04 WHERE Dno IN (SELECT Dno

FROM Departments

WHERE Dname=?销售?);

4.9

(1) 找出2006年其车辆出过事故的总人数

SELECT Count(Distinct Driver_id) FROM Participated, Accidents

WHERE Participated.Report_no= Accidents.Report_no

AND Date=2006;

(2) 找出与王明的车有关的事故数量

SELECT Count(Report_no) FROM Participated, Clients

WHERE Participated.Driver_id= Clients. Driver_id AND Cname=?王明?; (3) 删除李莉的Mazada车

DELETE FROM Cars

WHERE Model=?Mazada? AND Car_no IN

(SELECT Car_no FROM Owns, Clients

WHERE Owns.Driver_id=Clients. Driver_id AND Cname=?李莉?);

(4) 对于一个新事故,需要将相应信息插入表Accidents和Participated中。

4.10 所谓基本表是其关系元组存储在数据库中的表。视图是一种用查询定义的命名的导出表,其关系不存储在数据库中,而是在查询时执行定义视图的查询,由基本表导出。

基本表与视图之间的主要区别是前者对应的关系存储在数据库中,而后者对应的关系不在数据库中存储(物化视图除外)。从使用角度而言,对于查询,二者没有区别;而对于更新,只有可更新视图才可以更新。

二者之间的联系体现在:所有视图都是直接或间接由基本表定义的。

4.11 使用视图的优点有:

(1) 使用视图可以使一些查询表达更加简洁。 (2) 视图提供了一定程度的逻辑独立性。

(3) 视图与授权配合使用,可以在某种程度上对数据库起到保护作用。 (4) 视图使得用户能够以不同角度看待相同的数据。

4.12 并非所有的视图都是可以更新的,因为对视图的更新要转化为对相应基本表的更新,而对于某些视图,有些更新不能唯一地转换成对基本表的更新。

所有更新都能唯一转换成对基本表的更新的视图是可更新的,否则是不可更新的。目前,二者之间的明确边界尚不清楚。我们知道“行列子集”视图是可更新的,而使用聚集函数定义的视图不是可更新的。

4.13 在需要使用数据库管理数据时,使用SQL语言建立数据库,并对数据进行操作比使用其他通用程序设计语言更便捷,常常也更有效。然而,由于(1)SQL能够表达常见的查询,但是不能表达所有查询。(2)一些非数据库操作,如打印报表、将查询结果送到图形用户界面中,都不能用SQL语句实现。一个应用程序通常包括多个组件,查询、更新只是一个组件,而许多其他组件都需要用通用编程语言实现。这时,我们需要使用嵌入式SQL,而不是单独使用SQL或某种通用程序设计语言。

第5章 完整性和安全性

习题参考答案

5.1 数据库的完整性是指数据库中的数据的正确性、一致性和相容性。

所谓计算机系统安全性是指为计算机系统建立和采取各种安全保护措施,以保护计算机系统中的硬件、软件及数据,防止因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露。所谓数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏。

数据的完整性和安全性是一个问题的两个方面,都是为了保护数据库中的数据。前者旨在保护数据库中的数据,防止合法用户对数据库进行修改时破坏数据的一致性;而后者旨在保护数据库,防止未经授权的访问和恶意破坏和修改。

5.2 为了维护数据库的完整性,完整性控制应当作为DBMS核心机制,必须提供:

(1) 说明和定义完整性约束条件的方法:DBMS的DDL允许用户根据实际问题的语义说明

和定义各种完整性约束条件。

(2) 完整性检查机制:DBMS在数据更新可能破坏完整性时自动进行完整性检查。检查可

以在更新操作执行时立即执行,也可以在事务提交时进行。

(3) 违约处理:当数据更新违反完整性约束时,DBMS应当采取相应的措施,确保数据的

完整性。

5.3 当违反参照完整性时,除了简单的拒绝之外,还可以:

(1) 级联:进行更新,并且对更新导致违反参照完整性的参照关系元组进行相应更新。

通常,这种情况发生在被参照关系的主码改变时。例如,部门调整时将部分或所有部门重新编号,可以级联地更新其他包含部门号的关系元组。

(2) 置空值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置空值。这

种处理方法仅当外码允许取空值时才能使用。

通常,这发生在被参照关系的元组被删除,并且允许参照关系的元组不参照时。例如,通常允许某个职工不在任何具体部门,这种职工的部门号(外码)可以取空值。当一个部门被撤销时,可以删除该部门在Departments中的对应元组,并且同时将原来在该部门的职工的EMPS元组置空值。 (3) 置缺省值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置缺省值;

其中缺省值必须是被参照关系某元组主码上的值。 通常,这发生在被参照关系的元组被删除,并且参照关系的元组在外码上有合理缺省值时。例如,许多单位都有人才交流中心这样的部门,对职工进行再培训和重新安排。当一个部门被撤销时,该部门原有职工可以到人才交流中心。这时,可以将这些职工的部门号设置成缺省值——人才交流中心的部门号。 5.4

CREATE TABLE Suppliers (Sno CHAR (8) PRIMARY KEY, Sname CHAR (8) NOT NULL, Status INT, Scity CHAR(10));

第6章 关系数据库的设计理论

习题参考答案

6.2 函数依赖

Driver-id ? Name,Driver-id ? Address,Driver-id ? Phone-no Car-no ? Model,Car-no ? Year Report-no ? Date,Report-no ? Location,Report-no ? Damage

6.3 函数依赖

Cno ? Balance,Cno ? CreditLimit Ono ? Date,Ono ? Address

Ono,Ino ? QTY

Ino ? Description(假设同一种货物可以由不同制造商制造,但具有相同描述) Ino,Plant ? QTYOH

6.4

(1) S→D表示股票红利由股票唯一确定 I→B表示每个投资人至多有一个经纪人 IS→Q表示投资人和股票唯一确定他/她对该股票的拥有量

B→O表示每个经纪人都有唯一的办公室 (2) R(B, O, I, S, Q, D)的一个码为IS

6.5 初始:Result ? BD

Result ? BDEG(使用D?EG) Result ? BCDEG(使用BE?C) 使用CG?BD不改变Result

Result ? ABCDEG(使用CE?AG)

Result已包含所有属性,不可能再增大。因此 (BD)+= ABCDEG

6.6 初始:Result=AC

Result ? ABC(使用A→B)

Result ? ABCDE(使用BC→DE)

再无可用的函数依赖。因此(AC)+= ABCDE。

F不逻辑蕴涵函数依赖ACF→DG,因为DG不在AC的闭包中。

6.7 F1和F2等价。这是因为

显然A→B在F2+中。而AB关于F2的闭包为ABC,因此AB→C在F2+中。而D关于F2的闭包为ABCDE,因此D→AC和D→E都在F2+中。这就证明了F1?F2+。

反过来,A关于F1的闭包为ABC,因此A→BC在F1中。D关于F1的闭包为ABCDE,因此D→AE在F1中。这表明F2?F1+。

综上,F2+?F1+。

6.8 事实上,F还有3个极小依赖集。对F右端极小化,得到:

A?B, A?C, B?A, B?C, C?A, C?B

依次删除A?C和C?A得到F的一个极小覆盖Fm2={A?B, B?A, B?C, C?B} 依次删除B?C和C?B得到F的一个极小覆盖Fm3={A?B, A?C, B?A, C?A} 依次删除A?B和B?A得到F的一个极小覆盖Fm4={A?C, B?C, C?A, C?B}

6.9 F不是极小函数依赖集。

显然,F右部是极小的。

考虑ABD?E:(AB)+=ABGH,不包含E;(AD)+=AD,不包含E;(BD)+=BDK,不包含E;因此,ABD?E的左部是极小的。

考虑AB?G:A+=A,不包含G;B+=BK,不包含G;因此,AB?G的左部是极小的。 考虑CJ?I:C+=CIJ,包含I;因此CJ?I的左部不是极小的。可以删除J,得到C?I。 现在,我们有F的等价函数依赖集F’={ABD?E, AB?G, B?K, C?J, C?I, G?H}。容易验证它是极小的。

关系模式R的码是ABCD。

6.10 初始化表在(a)中。

A?C将b23和b53改变为b13,B?C将b33改变为b13,结果表在(b)中。

A

B

C

D

E

A

B

C

D

E

a1 b12 b13 a4 b15 a1 b12 b13 a4 b15 a1 a2 b23 b24 b25 a1 a2 b13 b24 b25 b31 a2 b33 b34 a5 b31 a2 b13 b34 a5 b41 b42 a3 a4 a5 b41 b42 a3 a4 a5 a1 b52 b53 b54 a5 a1 b52 b13 b54 a5 (a) (b)

C?D将b24、b34和b54改变为a4,DE?C将b13改变为a3,结果表在(c)中。

CE?A将b31和b41改变为a1,结果表在(d)中。此时,表的第三行为 a1a2a3a4a5,因此?是无损连接分解。

A a1 a1 b31 b41 a1

B b12 a2 a2 b42 b52

C a3 a3 a3 a3 a3 (c)

D a4 a4 a4 a4 a4

E b15 b25 a5 a5 a5

A a1 a1 a1 a1 a1

B b12 a2 a2 b42 b52

C a3 a3 a3 a3 a3 (d)

D a4 a4 a4 a4 a4

E b15 b25 a5 a5 a5

6.11 因为R1? R2=S,R1? R2=A,而S?A?F,所以?={R1(S, A), R2(S, I, P)}是无损连接分解。

6.12 使用完全函数依赖概念,2NF的等价定义如下:

如果关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。

6.13 证明:我们用反证法证明。

设R满足6.5.2节的3NF定义。假设R不满足习题中的3NF定义,则存在非主属性A,它传递地依赖于R的某个码,设为K。于是,存在Y使得Y→K在R中不成立,但是A既不属于K也不属于Y,并且Y→A。由于Y→K在R中不成立,Y不是R的超码。又因为A不

是主属性,因此Y→A违反6.5.2节的3NF定义,这与R满足6.5.2节的3NF定义相矛盾。这一矛盾表明“R不满足习题中的3NF定义”的假设不成立。

设R满足习题中的3NF定义。假设R不满足6.5.2节中的3NF定义,则存在属性A,属性集Y使得Y→A,但是A不是主属性,而Y不是R的超码。设K为R的超码,则K→Y,但Y→K在R中不成立。于是非主属性A传递地依赖于R的码K,与R满足习题中的3NF定义相矛盾。这一矛盾表明“R不满足6.5.2节中的3NF定义”的假设不成立。

综上,习题中的3NF定义与6.5.2节的3NF定义等价。

6.14 证明:

(1) 如果R的所有属性都是主属性,则R中的任何函数依赖都不违反3NF条件,因此R是3NF。

(2) (反证法)设R的码包含R的的所有属性(全码),但R不是BCNF。于是,R中存在X→A(即X?A?F+),并且A?X,但是X不是R的超码。令Y=R?{A}。由于A?X,于是X?Y。由此,Y→X。注意到X→A,于是Y→A。又因为Y=R?{A},于是Y→R。这与R的码包含所有属性矛盾。这一矛盾表明“R不是BCNF”的假设不成立。

6.15 证明:

(1) 证明:如果关系模式R是3NF,则R一定是2NF。举例说明其逆不真。

设R是3NF。假设R不是2NF。于是,R中存在X→A,并且A?X,但是A不是主属性,而X是R的某个码(设为K)的真子集。因为X是K的真子集,因此X不可能是R的超码(否则与K是R的码矛盾)。X→A违反3NF定义,于是R不是3NF,与设R是3NF矛盾。这一矛盾表明“R不是2NF”的假设不成立。

例如,考虑关系模式SDL(Sno, Sdept, Sloc),其中Sn0、Sdept和Sloc分别为学生的学号、所在系和住处。假设每个系的学生住在同一座楼,我们有函数依赖:

Sno→Sdept,Sdept→Sloc

SDL的码为Sno。容易验证SDL是2NF,但不是3NF。

(2) 如果关系模式R是BCNF,则R一定是3NF。举例说明其逆不真。

设R是BCNF。假设R不是3NF。于是,R中存在X→A,并且A?X,但是A不是主属性,并且X不是R的超码。这显然与R是BCNF矛盾。这一矛盾表明“R不是3NF”的假设不成立。

例如,考虑关系模式STC(S, T, C),其中S、T和C分别表示学生、教师和课程。这里,非平凡的函数依赖为SC→T和ST→C。STC有两个码(S,C)和(S,T)。STC∈3NF,但STC不是BCNF。

(3) 如果关系模式R是4NF,则R一定是BCNF。举例说明其逆不真。

设R是4NF。假设R不是BCNF。于是,R中存在X→A,并且A?X,但是X不是R的超码。如果XA=R,则X是超码。因此,XA不包含所有属性。根据A8,X→A意味X→→A。由于XA?R,并且A?X,X→→A违反4NF条件,与R是4NF矛盾。

例如,考虑关系模式CTB(C,T,B),其中C表示课程,T表示教师,B表示参考书。一门课程可以由多位教师讲述,但他们必须使用通一组参考书。CTB中存在如下多值依赖:

C→→T, C→→B

CTB为全码,因此是BCNF(习题16.14)。但C→→T违反4NF条件,因此CTB不是4NF。

6.16 该关系模式的码是HS(例6.14),所以不是BCNF。C?T违反BCNF条件,使用它将CTHRSG分解为{CT, CHRSG}。

CHRSG的码仍然是HS,不是BCNF。CS?G违反BCNF条件,使用它将CHRSG分解为{CSG, CHRS}。

CHRS的码仍然是HS,不是BCNF。HR?C违反BCNF条件,使用它将CHRS分解为{HRC, HRS}。

现在,所有的模式都是BCNF。我们得到的具有无损连接性的BCNF分解{CT, CSG, HRC, HRS}

6.17 R (B, O, I, S, Q, D)的函数依赖为 S→D,I→B,IS→Q,B→O,码为IS。

(1) S→D违反BCNF条件,使用它将R分解为{SD, BOISQ}。

BOISQ的码为IS。B→O违反BCNF条件,使用它将BOISQ分解为{BO, BISQ}。 BISQ的码为IS。I→B违反BCNF条件,使用它将BISQ分解为{IB, ISQ}。 最后得到R的一个具有无损连接性的BCNF分解{SD, BO, IB, ISQ}

(2) R的函数依赖已经是正则的,R的一个具有无损连接性和保持函数依赖的3NF分解为{ SD, IB, ISQ, BO}

6.18 容易明白,R的码为VD和SD。

(1) S?T违反BCNF条件,使用它将R分解为{ST, SVCPD}. SVCPD的码为VD和SD。V?SC违反BCNF条件,使用它将SVCPD分解为{VSC, VPD}。最后得到R的一个具有无损连接性的BCNF分解{ST, VSC, VPD}

(2) R的函数依赖已经是正则的,R的一个具有无损连接性和保持函数依赖的3NF分解为{ST, VSC, SDPV}

(3) 解释R为什么不存在具有无损连接性和保持函数依赖的BCNF分解. S?T,V?SC和SD?PV

6.19 例子很多,但需要注意的是:多值依赖的成立依赖于属性集,举例时需要说明属性集。

6.20 (1)用定义和公理两种方法证明,其余用公理证明。

(1) 多值依赖的合并规则:如果X→→Y,X→→Z成立,则X→→YZ成立。 证明:方法一:使用公理证明:

对X→→Y用X增广得到X→→XY。对X→→Z用Y增广得到XY→→YZ。使用自反律,得到XY→→(U?XY?YZ)。而U?XY?YZ=U?X?Y?Z,于是XY→→(U?X?Y?Z)。由X→→XY和XY→→(U?X?Y?Z),使用多值依赖的传递律得到X→→((U?X?Y?Z) ?XY)。而(U?X?Y?Z)?XY =U?X?Y?Z。因此,我们有X→→(U?X?Y?Z)。再次利用自反律,得到X→→(U?X? (U?X?Y?Z))。由于U?X? (U?X?Y?Z)= YZ,于是我们有X→→YZ。

方法二:使用定义证明:设U为属性全集。

设r是属性集U上的任意关系,满足X→→Y和X→→Z。设t1和t2是r的任意元组,满足t1[X]= t2[X]。为证明X→→YZ成立,我们只要证明存在t3,t4?r,使得 (1) t3[X]=t4[X]= t1[X]= t2[X],(2) t3[YZ]= t1[YZ],并且t3[U?XYZ]= t2[U?XYZ],(3) t4[YZ]= t2[YZ],并且t4[U?XYZ]= t1[U?XYZ]。

由于t1,t2?r,X→→Y,存在u1,u2?r,使得 (1) u1[X]= u2[X]= t1[X]= t2[X],(2) u1[Y]= t1[Y],并且u1[U?XY]= t2[U?XY],(3) u2[Y]= t2[Y],并且u2[U?XY]= t1[U?XY]。

t1,u1?r,X→→Z,存在u3,u4?r,使得 (1) u3[X]= u4[X]= t1[X]= u1[X],(2) u3[Z]= t1[Z],并且u3[U?XZ]= u1[U?XZ],(3) u4[Z]= u1[Z],并且u4[U?XZ]= t1[U?XZ]。

t2,u2?r,X→→Z,存在u5,u6?r,使得 (1) u5[X]= u6[X]= t2[X]= u2[X],(2) u5[Z]= t2[Z],并

且u5[U?XZ]= u2[U?XZ],(3) u6[Z]= u2[Z],并且u6[U?XZ]= t2[U?XZ]。

这些元组如下所示: X Y Z U?X?Y t1 a1 … ai ai+1 … aj aj+1 … ak ak+1 … an t2 a1 … ai bi+1 … bj bi+1 … bk bk+1 … bn u1 a1 … ai ai+1 … aj bj+1 … bk bj+1 … bn u2 a1 … ai bi+1 … bj ai+1 … ak aj+1 … an u3 a1 … ai ai+1 … aj aj+1 … ak bj+1 … bn u4 a1 … ai ai+1 … aj bj+1 … bk aj+1 … an u5 a1 … ai bi+1 … bj bj+1 … bk aj+1 … an u6 a1 … ai bi+1 … bj ai+1 … ak bj+1 … bn 令t3= u3,t4=u5,于是t3,t4?r,并且(1) t3[X]=t4[X]= t1[X]= t2[X],(2) t3[YZ]= t1[YZ],并且t3[U?XYZ]= t2[U?XYZ],(3) t4[YZ]= t2[YZ],并且t4[U?XYZ]= t1[U?XYZ]。

(2) 多值依赖的伪传递规则:如果X→→Y,WY→→Z成立,则WX→→(Z?WY) 成立。 证明:用W增广X→→Y,得到WX→→WY。注意到WY→→Z成立,使用多值依赖的传递率,我们有WX→→(Z?WY)。

(3) 混合伪传递规则:如果X→→Y,XY→Z成立,则X→(Z?Y) 成立。 证明::用X增广X→→Y,得到X→→XY。由XY→Z和A7得到XY→→Z。由X→→XY和XY→→Z,利用多值依赖的传递率得到X→→(Z?XY)。由于X→→(Z?XY),(Z?XY)?(Z?XY),XY与(Z?XY)不相交,并且XY→Z,A8表明X→(Z?Y) 成立。

(4) 多值依赖的分解规则:如果X→→Y,X→→Z成立,则X→→(Y?Z),X→→(Y?Z),X→→(Z?Y) 成立。

证明:由(Y?Z)?Y得到Y→(Y?Z)。再利用A7,得到Y→→(Y?Z)。由X→→Y和Y→→(Y?Z),利用多值依赖的传递率得到X→→((Y?Z) ?Z)。此即X→→(Y?Z)。

类似地,可以证明X→→(Z?Y)。 由X→→Y和Y→→(Y?Z(上面已证)),利用多值依赖的传递率,我们有X→→(Y? (Y?Z))。而Y? (Y?Z)= Y?Z,因而有X→→(Y?Z)。

6.21 只考虑函数依赖,?={CHR, CT, CSG}不是无损连接分解。这可以用算法6.3检测。初始表如(a)所示。

C T H R S G C T H R S G

a1 a1 a1

b12 a3 a4 b15 a2 b23 b24 b25 b32 b33 b34 a5 (a)

b16

b26 a6

a1 a1 a1

a2 a2 a2

a3 b23 b33 (b)

a4 b24 b34

b15 b16 b25 b26 a5 a6

C?T将b12和b32改为a2,结果如(b)所示。任何函数依赖都不能再改变该表,算法结束。由于不存在一行为a1a2a3a4a5a6,因此?={CHR, CT, CSG}不是无损连接分解。

6.22 通过模式分解产生关系模式(仅考虑函数依赖)的三个目标是:无损连接分解、BCNF和保持函数依赖的分解。

分解的无损连接性是对分解的基本要求,是必须保证的。不具有无损连接性的分解是有害的。这是因为关系模式R的分解?={R1, R2,…, Rk}将原关系模式下的关系r分解成k个关系r1, r2,…, rk。除了自然连接之外,没有其他一般性方法从这些关系得到原来的关系。因此,对r和r1, r2,…, rk进行相同的查询可能得到不同的结果。这样,我们就不能认为R和{R1, R2,…, Rk}反映相同的现实世界。

分解的目的是减少冗余,从而消除存储异常。仅考虑函数依赖,不达到BCNF不能完全避免冗余,因此分解后的关系模式,如果可能的话,应该达到BCNF。

函数依赖反映了数据之间的一种约束。如果分解保持函数依赖,这些约束可以比较有效地在分解后的一个关系中进行验证,否则有些约束需要将多个关系连接才能验证。因此,分解要尽可能保持函数依赖。

在某些情况下,BCNF和保持函数依赖这两个目标不可兼得,因为有些关系模式不存在保持函数依赖的BCNF分解。在这种情况下,我们必须在BCNF和保持函数依赖之间进行取舍。

6.23 在关系数据库设计时,我们可能选择非BCNF设计的原因是有些关系模式不存在保持函数依赖的BCNF分解。当函数依赖是重要的时,为了使的函数依赖的验证更加有效,我们需要选择保持函数依赖的分解,而放弃BCNF.

6.24 在关系数据库设计时,没有理由设计一个属于2NF,但不属于更高范式的关系模式。因为关系模式达到2NF,但不属于更高的范式将存在明显的数据冗余,进而导致存储异常。另一方面,对于任意2NF,我们总可以通过模式分解将它转换成更高的关系模式,这些关系模式与原来的关系模式反映相同的现实世界(分解具有无损连接性),并且能够消除或减少数据冗余。

第7章 数据库设计

部分习题参考答案 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16

数据库设计人员应具备哪些方面的知识? 简述数据库设计的步骤。 什么是数据库设计? 简述需求分析的步骤。

简述数据字典的内容及其作用。 概念数据库设计使用那些策略?

简述概念结构设计的基本方法和步骤。 什么是数据库的逻辑设计?简述其步骤。 在合并局部E-R图中,如何消除各种冲突? E-R图向关系模型转换的原则是什么?

简述物理数据库设计的任务、目标和步骤。 在数据库的物理设计中如何选择索引方法? 试述聚簇设计的原则。

为什么要对数据库进行重组和重构? DBA的作用是什么?

考察自己学校的学生成绩管理方法,编写出建立成绩管理的可行性分析报告、需求分析说明书、系统的概念结构设计和逻辑结构设计。

7.17 一个图书借阅管理数据库有以下需求,请设计该数据库的E-R模式和关系模式。

(1) 希望能查询书库中现有书籍的种类、数量和存放位置。这里假设各种书籍均由书

号惟一标识。 (2) 希望能查询书籍的借还情况信息,包括借书人单位、借书人单位电话、姓名、借

书证号、借书日期、还书日期。这里规定,每个人最多可以借6本书,借书证是读者的惟一标识符。 (3) 希望通过查询出版社的名称、电话、邮编、通讯地址等信息能向出版社订购有关

书籍。这里假设一个出版社可以出版多种图书,同一书名的书仅由一个出版社出版,出版社名称具有惟一性。

第8章 查询处理与优化

部分习题参考答案

8.1 对于相同的查询,不同的查询执行计划的时间开销可能相差几个数量级。这意味好的执行计划可能是可行的,而差的执行计划在实践上是不可行。因此,即使查询只执行一次,查询优化也是必须的。

在非关系系统中,用户使用过程化的语言表达查询要求,执行何种操作,以及操作的序列都是由用户来决定的。系统为用户提供选择存取路径的手段,而用户必须了解存取路径,为自己的查询选择合适的存取路径。如果用户做了不当的选择, 系统很难加以改进。关系数据库语言(如SQL)是非过程化语言;为了表达查询,用户只需要说明做什么(查询什么、在什么关系上查询和查询结果满足的条件),而不必说明怎么做。这就为查询优化提供了更大的空间,使得系统可以分析查询语义,选择最佳的查询处理方案。

8.2 系统进行查询优化的优点是:系统进行查询优化减轻了用户选择存取路径的负担,使得用户可以将注意力放在如何正确地表达查询请求上,而不必考虑如何最有效地表达查询。此外,系统进行查询优化还可以比用户做得更好,因为

(1) 优化器可以从数据字典中获取许多统计信息,如每个关系的当前元组数目、每个属性上的不同值个数、有哪些索引等。这些信息对于选择高效的执行策略是重要的,但是用户难以获得这些信息。

(2) 当数据库的统计信息改变时,可能需要改变执行策略。优化器可以自动对查询重新进行优化,以选择相适应的执行策略。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。

(3) 优化器可以更全面地考虑,考察数百种不同的执行计划,从中确定最佳的执行计划。而用户一般只能考虑有限的几种可能性(很难超过三、四种)。

(4) 优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术。

8.3 代数优化的启发式规则包括:选择尽可能先做、投影机可能先做和尽量避免计算笛卡尔积等。

选择尽可能先做是最重要的启发式规则。这是因为尽管通常一个关系很大,但是满足某种选择条件的元组的数量却相对较小,并且选择条件越强,满足条件的元组越少。尽早进行选择能够大幅度减少下一步参与运算的元组数目,使得其后的运算可以更加有效的进行。

8.4 由于索引是非聚簇索引,如果对于连接属性的相同值,内层关系存在多个元组,这些元组可能散布在多个物理块,则对于外层关系的每个元组,我们可能需要访问内层关系的多个块。因此,索引嵌套循环的效率不高。

8.5 如果关系r和s在公共属性上无序,也没有索引。如果内存足够大,就I/O开销而言,计算r s的最有效方法是:将较小的关系整个读入内存,逐块读入较大的关系,使用较大的关系作为外层关系,执行嵌套循环连接。此时,I/O操作数为br + bs,而内存需求为min(br, bs) + 2页,其中br和bs分别为关系r和s所占用的块数。

8.6 假设关系r和s的公共属性JoinAttrs是r的主码、s的外码,并且r和s在连接属性上是

有序的(假设为递增序)。用排序-归并方法计算r s的伪代码如下:

指针pr和ps分别指向r和s的第一个元组; while (pr?null and ps?null) do { tr? pr指向的元组; ts? ps指向的元组;

while (ps?null and ts[JoinAttrs]< tr[JoinAttrs]) do 让ps指向s的下一个元组; while (ps?null and ts[JoinAttrs]= tr[JoinAttrs]) do {

把tr.ts添加到结果中;

让ps指向s的下一个元组;

}

if (pr?nulll) then

让pr指向r的下一个元组; }

8.7 可以采用排序或散列方法来消除重复元组。

排序时等值元组相互邻近,删除其他副本,只留一个元组副本即可。如果使用外部归并排序,则可以直接在归并时删除重复元组。

散列时,重复元组会分到同一桶中。可以在元组加入桶中时检查元组是否已在桶中,无须加入已在桶中的元组。 8.8

(1) 使用散列方法实现集合运算r?s的算法

初始:结果关系为空;

使用相同的散列函数H对两个关系r和s进行划分,产生r0, r1, ..., rn和s0, s1, ..., sn; for (i=1; i<=n; i++) do {

对ri建立内存散列索引; for (si中的每个元组ts) do

if (ts不在ri的散列索引中) then 将ts加入到ri的散列索引中;

将ri的内存散列索引中的元组加入结果关系中; }

设关系r和s分别占br和bs块。使用散列函数H对两个关系r和s进行划分,需要读入和写出br+bs块。读入每个ri建立它的内存散列索引,并将si的不在ri的散列索引中的元组插入需要读入br+bs块。整个算法需要的I/O量为3(br+bs)块。

如果内存足够大,可以将关系r和s读入到内存,I/O减少到br+bs块。

(2) 使用散列方法实现集合运算r?s的算法

初始:结果关系为空;

使用相同的散列函数H对两个关系r和s进行划分,产生r0, r1, ..., rn和s0, s1, ..., sn; for (i=1; i<=n; i++) do {

对ri建立内存散列索引; for (si中的每个元组ts) do

if (ts在ri的散列索引中) then

将ts加入到结果关系中; }

使用散列方法实现集合运算r?s的算法

初始:结果关系为空;

使用相同的散列函数H对两个关系r和s进行划分,产生r0, r1, ..., rn和s0, s1, ..., sn; for (i=1; i<=n; i++) do {

对ri建立内存散列索引; for (si中的每个元组ts) do

if (ts在ri的散列索引中) then 将ts从ri的散列索引中删除;

将ri的内存散列索引中的元组加入结果关系中; } 8.9

(1) 图8.2的语法树见(a),分解合取选择后的语法树在(b)中。

选择条件Pno=?P001?只涉及关系SP,因此可以将对应的选择下移,结果见(c)。 将选择与其下的笛卡尔积转换成自然连接,结果见(d)。

引入新的投影,去掉其后运算不需要的属性:关系Suppliers的属性Sno和Sname是其后需要的,其余属性不需要。使用条件Pno=?P001? 选择后,关系SP的属性Sno是需要的,其余属性不需要。引入投影后的结果在(e)中。

?Sname

?Suppliers.Sno=SP.Sno ? Pno=?P001?

?

Suppliers

SP

?Sname

?Suppliers.Sno=SP.Sno ? Pno=?P001?

?

Suppliers

SP

?Sname

?Suppliers.Sno=SP.Sno

?

Suppliers

? Pno=?P001?

SP

(a) (b) (c)

?Sname

?Sname ?Sname

流水线

Suppliers

? Pno=?P001?

SP

?Sno,Sname ?Sno

Suppliers

?Sno,Sname ?Sno

流水线

Suppliers

? Pno=?P001?

SP

? Pno=?P001?

SP

(d)

(e)

图8.1 习题8.9的初始语法树及其优化

(f)

本文来源:https://www.bwwdw.com/article/ufz3.html

Top