数据库基本概念
- 数据库系统的基本概念
- 三层模式两层映射
- 数据库的设计过程
- 数据模型
数据流图
- 数据流图的画法
- 其他需求分析工具
- 数据字典
- 判定树
- 判定表
概念模型
- 实体、属性和联系
关系模型
- 候选键、主键、外键等概念
- E-R图转关系模式
关系运算
- 交、并、差、选择、笛卡尔积、自然选择
SQL语言
- 创建表、修改与删除、数据更新
- 创建索引、查询语句、别名和匹配
数据库控制
- 数据库的控制功能
- 事务的性质
9.1 数据库基本概念
9.1.1 数据库与数据库系统
数据 data:描述事物的符号记录,可以是文字、图形、图像、声音和语言等。
数据库系统(Database System ,DBS):一个采用了数据库技术,有组织的动态地存储大量相关数据,方便多用户访问的计算机系统。数据库系统由数据库、硬件、软件、人员组成。
-
数据库 database:长期存储在计算机内、有组织、可共享的数据集合。特点是数据间联系密切、冗余度小、独立性高、易扩展,并可为各类用户共享。
-
硬件:硬件是构成计算机系统的各种物理设备,包括存储数据所需的外部设备。
-
软件:软件包括操作系统、数据库管理系统及应用程序。
数据库管理系统 DBMS 是数据库系统的核心,主要以下6大功能:
-
数据定义:DMBS提供数据定义语言(DDL),对数据库结构进行描述,包括外模式、模式和内模式的定义;数据库的完整性定义;安全保密定义;
-
数据库操作:DBMS提供数据操纵语言(DML),实现对数据库中数据的基本操作,如增删改查。
DML 分为2类,即宿主性和自含型
- 宿主性:嵌入某种语言(如C、COBOL 等)中使用
- 自含型:自含型是指可以单独使用的DML语言
-
数据库运行管理
- 多用户环境下的并发控制
- 安全性检查和存取控制
- 完整性检查和执行
- 运行日志的组织管理
- 事务管理和自动恢复。
-
数据的组织、存储和管理:DBMS分类组织、存储和管理各种数据(数据字典、用户数据、存取路径等)。因此要确定以何种文件结构和存取方式组织数据,以提高效率。
数据的组织、存储和管理
的目标是提高存储空间的利用率。 -
数据库的建立和维护:
- 数据库的初始建立
- 数据的转换
- 数据库的转储和恢复
- 数据库的重构
- 性能监测和分析
-
其他功能
- DBMS 的网络通信
- 一个DBMS 与另一个DBMS 的数据转换
- 异构数据库之间的互访和互操作能力
-
-
人员:主要有4类。
- 系统分析员、数据库设计人员
- 应用程序员:负责编写使用数据库的应用程序
- 最终用户
- 数据库管理员(DBA):负责数据库的总体信息控制
9.1.2 数据库管理系统的特征及分类
DBMS 特性
- 数据结构化且统一管理。数据由DMBS统一管理。数据库系统采用复杂的数模型表示数据结构。数据不在面向某个应用,而是面向整个应用系统。真正实现了数据共享。
- 有较高的数据独立性。独立性指数据与应用程序独立,将数据的定义从程序中分离出去,应用程序只关心数据的逻辑结构。
- 数据控制功能。DBMS 提供数据控制功能,以适应共享数据的环境。数据控制功能包括对数据库中数据的安全性、完整性、并发和恢复的控制。
- 数据的安全性:指保护数据库,防止不合法的使用,导致数据泄露、更改、破坏。例如划分了不同的权。
- 数据的完整性:指数据库的正确性和相容性,防止合法用户的非法更新。
- 并发控制:多用户可能同时对同一数据进行操作。DBMS的并发控制子系统负责协同并发事务的执行,保证数据的完整性。
- 故障恢复:数据库存在4类故障,事务内部故障、系统故障、介质故障及计算机病毒。故障恢复主要指恢复数据库本身,即在故障引起数据库当前状态不一致时,将数据库恢复到某个正确状态。恢复原理就是建立冗余数据,换句话说,确定数据库是否可恢复就是其每条信息是否都可以利用冗余存储在别处的信息重构。冗余是物理级的,逻辑级是没有冗余的。
DBMS的分类
- 关系数据库系统:关系数据库是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据。主流的关系数据库有 Oracle、Db2、Sybase、Microsoft SQL Server、Microsoft Access、MYSQL等。
- 面向对象的数据库系统:面向对象的数据库系统是支持以对象形式对数据建模的数据库管理系统,包括对象的类、类属性的继承和子类的支持。
- 对象关系数据库系统:对象关系数据库系统是在传统的关系数据模型基础上提供元组、数组、集合等更为丰富的数据类型以及处理新的数据类型操作的能力,这样形成的数据模型被称为“对象关系数据模型”。
9.1.3 数据库系统的体系结构
集中式数据库系统
分时系统环境下的集中式数据库系统诞生于20世纪60年代中期。在这种系统中,不仅数据是集中的,数据库系统的所有功能都集中在DBMS所在的计算机上。其他的DBMS的产品也是从这种结构开始发展的。
客户端/服务器结构
随着网络技术的发展,很多软件采用客户端/服务器结构体系结构。在这种结构中,一个客户端请求被送到服务器上执行。客户端主要负责表示服务,服务器主要负责数据库服务。采用客户端/服务器结构后,数据库系统被分成前端和后端,前端主要包括图形界面、表格生成、报表处理等工具,后端负责数据存取结构、查询计算和优化、并发控制以及故障恢复等。前端与后端通过SQL或应用程序来接口。
ODBC(开放式数据库互连)和JDBC(Java程序数据库链接)标准定义了应用程序和数据库服务器通信的方法,应用程序用它来打开与数据库链接、发生查询和更新以及获取返回结果等。
数据库服务器一般分为事务服务器和数据服务器
- 事务服务器:也称查询服务器。它提供一个接口,使得客户端可以发出请求,服务器响应请求,并返回执行结果。用户端可以用SQL、应用程序、远程过程调用机制 来表达请求。一个典型的事务服务器包括服务器进程、锁管理进程、写进程、监视进程和检查点进程。
- 数据服务器。使得客户端可以与服务器交互,以文件或页面为单位对数据进行更新或读取。数据服务器与文件服务器相比提供更强功能,所支持的数据单位可以比文件还要小,如页、元组或对象;提供数据的索引机制和事务机制,使得客户端或进程发生故障时,也不会处于不一致状态。
并行数据库系统
并行体系结构的数据库系统是多个物理上连在一起的CPU,而分布式系统是多个地理上分开的CPU。并行体系结构的数据库系统分为共享内存式多处理机和无共享式并行体系结构。
-
共享内存式多处理机
一台计算机上有多个活动的CPU,它们共享一个内存和一个公共磁盘。这种并行体系结构最接近与传统的但CPU处理器结构,其设计主要是用N个CPU得到N倍单CPU的性能。但是由于不同的CPU对于内存的访问是平等的,这样会导致一个CPU访问的数据被另一个CPU修改,所以有特殊的处理。然而,内存访问是高速的,很难保证进行内存划分时不损失效率,所以随着CPU个数的增加,共享内存问题变得难以解决。
-
无共享式并行体系结构
一台计算机上有多个活动的CPU,它们有自己的内存和磁盘。各个承担数据库服务的CPU划分它们自身的数据,通过划分的任务以及通过每秒兆级的高速网络通信完成事物查询。
分布式数据库系统
分布式DBMS包括,物理上分布、逻辑上集中的分布式数据库结构,物理上分布、逻辑上分布的分布式数据库结构。
前者的思想是把单位的数据模式按数据来源和用途合理地分布在系统的多个点上,使大部分数据可以就地或就近存取。数据在物理上分布后,由系统同一管理,使用户不感到数据的分布。
后者一般由两部分组成:一是本结点的数据模式,二是本节点共享的其他结点上有关的数据模式。节点间的数据共享由双方协商确定。这种数据库结构有利于数据的集成、扩展和重新配置。
9.1.4 数据库的三级模式
数据库产品很多,它们支持不同的数据模型,使用不同的数据库语言,建立在不同的操作系统上,存储结构也各不相同,但体系结构上都具有相同的特征,采用“三级模式和两级影响”,如下所示。
数据库系统采用三级模式结构,这是数据库管理系统内部的系统结构。数据库有“型”和“值”的概念,“型”是指对某一数据的结构,“值”是型的一个具体赋值。
数据库系统设计员可以在视图层、逻辑层和物理层和物理层对数据进行抽象,通过外模式、概念模式和内模式来描述不同层次上的数据特性。
-
外模式
外模式也称用户模式或子模式,是用户与数据库系统的接口,是用户用到的那部分数据的描述。它由若干个外部记录类型组成。用户使用数据操纵语言对数据库进行操作,实际上是对外部记录进行操作。
描述外模式的数据定义语言称为“外模式DDL”。有了外模式,程序员不必关系概念模式,只与外模式发生联系,按外模式的存储结构操作数据。
-
概念模式
概念模式也称模式,它是数据库中全部数据的逻辑结构和特征描述,由若干个概念记录组成,只涉及型的描述,不涉及具体的值。概念模式的具体值称为模式的实例,同一模式有很多实例。
概念模式反映的是数据库的结构及其联系,相对稳定;实例反映的是数据库某一时刻的状态,所以是相对变动的。
概念模式不仅描述概念记录类型,还要描述记录间的联系、操作以及数据的完整性和安全性要求。概念模式不涉及存储结构、访问技术等细节。只有这样概念模式才算做到了“物理数据独立性”。
描述概念模式的数据定义语言称为“模式DDL”。
-
内模式
内模式也称存储模式,是数据物理结构和存储方式的描述,内模式定义所有的内部记录类型、索引和文件的组织方式,以及数据控制方面的细节。如,记录的存储方式(顺序存储、B树结构存储、Hash方式存储),索引按照什么方式组织,数据是否压缩、加密,数据的存储记录结构有何规定。
描述内模式的数据定义语言称为“内模式DDL”。
注意,内部记录不涉及物理记录,也不设计设备的约束。它比内模式更接近于物理存储和访问的哪些软件机制,是操作系统的一部分(即文件系统)。例如磁盘上读写数据。
总之,数据安外模式的描述提供给用户,按内模式的描述存储在磁盘,而概念模式提供了这两级模式的相对稳定的中间层,并使得两级中任意以及的改变都不受另一极影响。
-
两级映像
数据库系统在三级模式之间提供了两级映像:模式/内模式映像、外模式/模式映像。因为这两级映像保证了数据库中的数据具有较高的逻辑独立和物理独立性。
- 模式/内模式映像:在概念级和内部级之间,实现了概念模式和内模式之间的互相转换。
- 外模式/模式映像:在概念级和外部级之间,实现了概念模式和外模式之间的互相转换。
数据独立性是指数据域程序独立。数据的独立性由二级映像功能来保证。数据独立性包括物理独立性和逻辑独立性
- 数据的物理独立性:当内模式发生改变时,数据的逻辑结构不变。当数据的物理独结构改变时,应用程序不变。但是,需要修改概念模式与内模式之间的映像。
- 数据的逻辑独立性:数据的逻辑结构发生变化后,用户程序也可以不修改。但是,需要修改概念模式与外模式之间的映像。
9.1.5 大数据
大数据(BigData)是指无法用拥有的软件工具提取、存储、搜索、共享、分析和处理的海量的、复杂的数据集合。大数据的产生背景有以下4个方面:
- 数据来源和承载方式的变革
- 全球数据出现爆炸式增长
- 大数据已经成为一种自然资源
- 大数据日益重要,不被利用就是成本
大数据(BigData)的特征如下:
- Volume(大量化):数据海量
- Velocity(快速化):数据增长速度快
- Variety(多样化):数据种类多样化
- Value(价值密度低):有价值数据的占比小
理解大数据:让大数据更有意义,挖掘潜在的“大价值”这才是对大数据的正确理解。为此有许多问题需要研究与解决
- 高并发数据存取的性能要求及数据存储的横向扩展问题。
- 实现大量数据资源化、知识化、普适化的问题,解决这些问题的关键是对非结构化数据的内容理解。
- 非结构化海量信息的智能化处理问题,主要解决自然语言理解、多媒体内容理解、机器学习等问题。
大数据主要面临的三大挑战:
- 软件和数据处理能力。
- 资源和共享管理
- 数据处理的可信力。
大数据产生的安全风险:
- 大数据称为网络攻击的显著目标。
- 大数据加大了隐私泄露风险。
- 大数据威胁现有的存储和安防措施。
- 大数据技术称为黑客的攻击手段。
- 大数据成为高级可持续攻击的载体。
- 大数据技术为信息安全提供新支撑。
9.1.6 数据库的设计过程
需求分析:分析用户的需求,包括数据、功能和性能需求;得到数据流图、数据字典和需求说明书。
概念设计:用数据模型明确地表示用户的数据需求。其反映了用户的现实工作环境,与数据库的具体实现技术无关。
逻辑设计:根据概念设计模型及软件的数据模型特征,按照一定的转换规则和规范化理论,把概念模型转换为逻辑数据模型,如层次模型、网状模型、关系模型等。
物理设计:为一个确定的逻辑数据模型选择一个最适合应用要求的物理结构模型。
9.2 数据模型
9.2.1 基本概念
数据模型就是对现实世界数据特征的抽象。最常用的模型分为概念数据模型和基本数据模型。
-
概念数据模型,也称信息模型,是按用户的观点对数据和信息建模;是现实世界到信息世界的第一层抽象,强调语义表达,易于用户理解;是用户和数据库设计人员交流的语言,主要用于数据库设计。这类模型中最著名的是 实体-联系模型,简称 E-R 模型。
-
基本数据模型,它是按计算机的观点对数据建模,是现实世界数据特征的抽象。基本数据模型有层次模型、网状模型、关系模型和面向对象模型。
-
层次模型: 采用树行结构表示数据与数据间的联系。在层次模型中,每个结点表示一个实体,记录之间用结点之间的连接线表示,并且根结点以外的其他结点有且仅有一个双亲结点。
-
网状模型:也称 DBTG模型,比层次模式更具有普遍性的数据结构,是层次模型的一个特例。网状模型可以直接描述一个显示世界,因为去掉了层次结构的两个限制,允许两个结点之间有多种联系。(称之为复合联系)
-
关系模型:目前最常用的数据模型之一。关系数据库系统采用关系模型作为数据的组织方式,在关系模型中用表格结构表达实体集以及实体集之间的联系。其最大特色是描述的一致性。
-
面向对象模型:存储单位为对象,每个对象包含属性和方法,具有类和继承等特点。Computer Associates 的 Jasmine 就是面向对象模型的数据库系统。
面向对象数据模型比网络、层次、关系数据库模型具有更丰富的表达能力。但正因为面向对象模型的丰富表达能力,模型相对复杂,实现起来比较困难。
-
9.2.2 数据模型的3要素
数据库结构的基础是数据模型,是用来描述数据的一组概念和额定义。数据模型的3要素如下:
- 数据结构:是所研究的对象类型的集合,是对系统静态特征的描述。
- 数据操作:对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作即操作规则,是对系统动态特征的描述。
- 数据的约束条件:是一组完整性规则的集合。对于具体的应用数据必须遵循特定的语义约束条件,以保证数据的正确、有效和相容。
- 实体完整性约束:规定基本关系 R的主属性 A 不能取空值。
- 参照完整性约束(引用完整性):关系模型中实体与实体间的联系。
- 用户自定义完整性约束:针对某一具体的关系数据库的约束条件,所涉及的数据必须满足的语义要求,由环境决定。
9.2.3 E-R模型
概念模型是对信息世界建模,所以概念模型可以准确地表示信息世界中的常用概念。概念模型有许多表示方法,其中最为常用的是实体-联系方法。该方法用E-R图来描述世界的概念模型,称为实体-联系模型(E-R模型)。
E-R模型只能说明实体间的语义联系,还不能进一步地详细说明数据结构。在解决实际问题时,通常先设计一个E-R模型,然后再把其转换成计算机能接受的数据模型。
1.实体
实体集是相同属性的实体集合,每个实体有一组特性(属性)表示。在E-R模型中,实体用矩形表示。
2.属性
属性是实体某方面的特征,例如,职工实体具有工号、姓名、年龄等属性。在同一实体中,每个实体的属性及其域是相同的,但取值不同。E-R模型中的属性有以下分类
- 简单属性符合属性:
- 简单属性是原子的、不可再分的
- 复合属性可以细分为更小的部分(例如地址可以分为省、市、区)。
- 单值属性和多值属性:
- 单值属性:一个特定实体的属性只能对应一个值。例如,对于一个特定的员工,只有一个工号、姓名。
- 多值属性:一个特定实体的属性可能对应多个值。例如,对于一个特定的员工,有多个亲属。
- Null属性:无意义或不知道
- 派生属性:可以通过其他属性得来。例如,职工实体中有“参加工作时间”和“工作年限”属性,工作年限可以由当前时间和参加工作时间得到。这里,“工作年限”就是一个派生属性。
3.联系
在E-R模型中,联系用菱形表示,在菱形框内写明联系名,并用无向边分别与有关实体链接,同时在无向边上标注联系的类型(1:1、1:n或m:n)。实体的联系分为实体内部的联系和实体与实体之间的联系。实体内部的联系反映数据在同一记录内各个字段间的联系。
-
两个不同实体之间的联系
- 一对一(
1:1
) - 一对多(
1:n
) - 多对多(
m:n
)
- 一对一(
-
两个以上不同实体集之间的联系
两个以上不同实体集之间存在
1:1:1
、1:1:n
、1:m:n
、r:m:n
的联系,例如下图表示了3个不同实体集之间的联系,其中:- 图a表示供应商Supp、项目Proj和另加Part之间多对多对多(
r:m:n
)的联系,联系名为 SP_P。表示供应商为多个项目供应多个零件,每个项目可用多个供应商的零件,每种零件可有不同的公因数供应的语义 - 图b表示病房、病人和医生之间一对多对多(
1:m:n
)的联系,联系名为P_D。表示一个特护并发有多个病人和多个医生,一个医生只负责一个并发,一个病人只属于一个病房的语义。
注意3个实体集之间的多对多联系和3个实体集两两之间的多对多联系的语义是不同的。例如,供应商和项目实体集之间的“合同”联系,表示供应商为那几个工程签了合同;供应商与零件之间的“库存”联系,表示供应商库存零件的数量;项目与零件两个实体集之间的“组成”联系,表示一个项目由哪几种零件组成。
- 图a表示供应商Supp、项目Proj和另加Part之间多对多对多(
-
同一实体集内的二元联系
同一实体集内的二元联系页存在
1:1
、1:n
、m:n
联系。
4.实体-联系方法
E-R 图来表示数据模型,在E-R图中有下标所示的几个主要构件
- 说明1:在E-R图中,实体集中作为主码的一部分属性以下划线标明。另外,在实体集与联系的线段上标上联系的类型。
- 在本书中,若不引起误解,实体集有时简称实体,联系集有时简称联系。
例子:学校有若干个系,每个系有若干教师和学生;每个教师可以担任若干门课程,并参加多个项目;每个学生可以同时选修多门课程。请设计该学校教学管理系统E-R模型,要求给出每个实体、联系的熟悉。
-
解:该学校教学管理系统有5个实体,即系、教师、学生、项目和课程。
-
各实体属性如下:
- 系(系号、系名、主任名)
- 教师(教师号、教师名、职称)
- 学生(学号、姓名、年龄、性别)
- 项目(项目号、名称、负责人)
- 课程(课程号、课程名、学分)
-
各实体之间的联系如下:
- 教师担任课程
1:n
"任课"联系 - 教师参加项目
n:m
“参加”联系 - 学生选修课程
n:m
"选修"联系 - 教师、学生、系之间所属关系的
1:n:m
"领导"联系
其中,“参加”联系有一个排名属性,“选修”联系有一个成绩属性。
- 教师担任课程
-
5.扩充的E-R模型
某些特殊语义仅用基本E-R模型无法表达清楚。在本节讨论扩展的E-R模型,包括弱实体、特殊化、普遍化等概念。
-
弱实体
在现实世界中有一种特殊的联系,这种联系代表实体间的所有关系,例如职工与家属的联系,家属总是属于某职工的。这种实体对于另一些实具有很强的依赖关系,即一个实体的存在必须以另一个实体为前提,将这类实体称为弱实体。
在扩展的E-R图中,弱实体用双线矩形框表示。
-
普遍化、特殊化
前面已经介绍,实体集是具有相同属性的实体集合。但现实中,一方面具有一些共性,另一方面还有各自的特殊性。这样,一个实体可以安装某些特征区分为几个子实体。例如,学生实体集可以分为研究生、本科生和大专生等子集。将这种从普遍到特殊的过程称为“特殊化”。
将几个具有共同特性的实体集概括成一个更普遍的实体集的过程称为“普遍化”。例如,可以将研究生、本科生和大专生概括为学生,还可以将学生、教师、职工概括为人。这就是从特殊到一般的过程。
教职工实体集中的某个职工既是在职生又是教师或工人,那么在职生、教师和工人应该就是重叠特殊化;而在职生、教师和工人的集合等于教职工,所以是全部特殊化。
在扩充E-R模型中,子类继承超类所有属性和联系,但是子类还有自己特殊的属性和联系。
在扩充的E-R图中,超类-子类关系模式使用特殊化圆圈和连线的一般方式表示。超类到圆圈有一条连线,连线为双线表示全特殊化,连线为单线,表示部分特殊化;双竖边框表示子类。有符号“∪”的线表示特殊化;圆圈中的d表示不相交特殊化;圆圈中的o表示重叠特殊化;超类与圆圈用单线相联,表示部分特殊化。下图给出了一个特殊化的应用实例。
9.2.4 关系模型
关系模型是由若干个关系模式组成的集合。一个关系模式相当于一个记录型,对应于程序设计语言中类型定义的概念。关系是一个实例,也是一张表,对应于应用程序设计语言中遍历的概念。给定遍历的值随时间可能发生变化,类似地,当关系被更新时,关系实例的内容也随时间变化。
教学数据库有4个关系模型如下:
- S(
Sno
,Sname
,SD
,Sage
,Sex
):学生S关系模式,属性为 学号、姓名、系、年龄、性别 - T(
Tno
,Tname
,Age
,Sex
):教师T关系模式,属性为 教师号、姓名、年龄、性别 - C(
Cno
,Cname
,Pcno
):课程C关系模式,属性为课程号、课程名和先休课程号 - SC(
Sno
,Cno
,Grade
):学生选课SC关系模式,属性为学号、课程号、成绩。
关系模式中,有下划线的属性是主码属性。下图是教学模型的一个具体实例。
由于关系模型比网状、层次模型更加简单、灵活,因此关系数据库的使用已相当普遍。但是现实世界中存在许多更复杂数据结构的实际应用领域,需要使用面向对象的数据模型。
9.3 代数关系
9.3.1 关系数据的基本概念
1.属性和域
要描述一个事物,需要若干特征来表示,这些特征称为属性。例如 学号、姓名、性别等。
每个属性的取值范围对应一个值的集合,称为该属性的域。例如,学号的域是6位整数;姓名的域是10位字符;性别的域为{男,女}。
在关系数据模型中,通常对域加了限制,所有的域都应是原子数据,如整数、字符串,而集合、数组非原子数据。关系数据模型的这种限制称为第一范式(1NF)条件。但也有些关系数据模型突破了1NF的限制,称为非1NF的关系数据模型。
2.笛卡尔积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。A表示所有声母的集合,B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。
笛卡尔积中,每个集合称为一个元组,元组的每一个值称为元组的一个分量,元组的个数称为基数。
另外,关系中属性的个数称为“元数”。
案例
给出三个域:
D1=SUPERVISOR = { 张清玫,刘逸 }
D2=SPECIALITY= {计算机专业,信息专业}
D3=POSTGRADUATE = {李勇,刘晨,王敏}
则D1,D2,D3的笛卡尔积为D:
D=D1×D2×D3 ={(张清玫, 计算机专业, 李勇), (张清玫, 计算机专业, 刘晨),
(张清玫, 计算机专业, 王敏), (张清玫, 信息专业, 李勇),
(张清玫, 信息专业, 刘晨), (张清玫, 信息专业, 王敏),
(刘逸, 计算机专业, 李勇), (刘逸, 计算机专业, 刘晨),
(刘逸, 计算机专业, 王敏), (刘逸, 信息专业, 李勇),
(刘逸, 信息专业, 刘晨), (刘逸, 信息专业, 王敏)}
这样就把D1,D2,D3这三个集合中的每个元素加以对应组合,形成庞大的集合群。
3.关系的相关名称
关系表示为R(D1, D2, …, Dn)
- 目或度: R是关系的名字,n是关系的目或度。
- 候选码:若关系中的某一属性组的值能唯一地标识一个元组,则称该属性或属性组为候选码。
- 主码:若一个关系有多个候选码,则选定其中一个为主码。
- 主属性:包含在任何候选码中的属性,称为主属性。不包含在任何候选码中的属性称为非码属性。
- 外码:如果关系模式 R 中的属性非该关系的码,但它是其他关系的码,那么该属性对关系模式 R 而言是外码。
- 券码:关系模型的所有属性是这个关系的候选码,称为全码。
4. 关系的3种类型
- 基本关系:通常又称为基本表或基表,它是实际存在的表,是实际存储数据的逻辑表示。
- 查询表:查询奥是查询结果对应的表。
- 视图表:视图表是由基本表户或其他视图表导出的表。由于它本身不独立存储在数据库中,数据库中只存放它的定义,所以常称为虚表。
5. 关系数据库模式
关系的概念对应于程序设计语言中变量的概念,而关系模式对应于程序设计语言中类型定义的概念。关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常称之为关系数据库。
关系的描述称为关系模式,可以表示为 $$ R(U,D,dom,F) $$
- R表示关系名
- U是组成该关系的属性名集合
- D是属性的域
- dom是属性向域的映像集合
- F为属性间数据的依赖关系集合
通常将关系模式间记为: $$ R(U)或(A1,A2,A3,...,An) $$
- R表示关系名
- A1,A2,A3,...,An 为属性名和域名。
属性向域的映像常常直接说明属性的类型、长度。通常在关系模式主属性上加下划线表示该属性为主码属性。
6.完整性约束
完整性约束提供了一种手段来保证用户对数据库的修改不会破坏数据的一致性。因此完整性规则防止的是对数据的意外破坏。关系模型的完整性规则是对关系的某种约束条件。关系模型的完整性分为三类:实体完整性、参照完整性(也称引用完整性)、用户定义完整性。
-
实体完整性:规定基本关系 R 的主属性 A 不能取空值。
-
参照完整性:实体间的联系是用关系来描述,这样就存在着关系与关系间的引用。
例如,员工和部门关系如下
- 员工(员工号,姓名,性别,参加工作时间,部门号)
- 部门(部门号,姓名,电话,负责人)
这两个关系存在着属性的引用,即员工关系中的“部门号”,必须是确实存在的部门的部门号。也就数说,员工关系中的“部门号”属性取值要参照部门关系的“部门号”属性取值。
-
用户定义完整性:用户定义完整性就是针对某一具体的关系数据库的约束条件,由应用的环境决定。例如,银行的用户账户规定必须大于等于 100000、小于999999。
7.关系运算
9.3.2 5种基本的关系代数运算
现有两个集合
1.并
关系R与S具有相同的关系模式,即R与S的元数相同(结构相同)。关系R与S的并是由属于R或属于S的元组构成的集合,记作 R ∪ S ,其定义如下: R ∪ S={t∈R ∨ t∈S }
2.差
关系R与S具有相同的关系模式,关系R与S的差是由属于R但不属于S的元组构成的集合,记作 R - S ,其定义如下: R - S={t∈R ∧ t∉S }
3.广义迪卡尔积
两个元数分为 n目 和 m目的关系 R和S的广义迪卡尔积是一个(n+m)列的元组的集合。元组前 n 列是关系 R 的一个元组,后m列是关系s的一个元组,记作 R×S
如果 R 和 S 中有相同的属性名,可在属性名前加关系名作为限定,以示区别。若R有 k1个元组,S有k2个元组,则 R 和 S 的广义迪卡尔积有 K1×k2个元组。
4.投影
从关系的垂直方向进行运算,在关系R中选出若干个属性列A组成新的关系。例如我们从S1中取出Sno和Sname的列,其中重复的行需要删除。
5.选择
从关系的水平方向进行运算,在关系R中选择满足条件的元组。例如从S1中选择 Sno 为 No0003的行
9.3.3 扩展的代数运算
1.交
关系R与S具有相同的关系模式,关系R与S的交是由属于R,且属于S的元组构成的集合,记作 R ∩ S ,其定义如下: R - S={t∈R ∧ t∈S }
2.连接
连接运算是从两个关系R和S的笛卡尔积中选取满足条件的元组。因此,迪卡尔积是无条件连接,其他的联机操作认为是有条件连接。
-
0连接。从R和S的笛卡尔积中选取属性间满足一定条件的元组。
例如关系R、S如下,求(R.A < S.B)
满足R.A < S.B 的结果为
-
等值连接
从R和S的笛卡尔积中选取属性间满足相等的元组。
-
自然连接
自然连接是一种特殊的等值连接,它要求两个属性必须相同,并在结果集中去掉重复的列。
例子:设有关系 R、S 如图所示,求 他们的等值连接。
自然要求两个属性必须相同,所以只能选择 R.A = S.A的结果
3.除(Division)
除运算是同时从关系的水平方向和垂直方向进行运算。给定关系 R(X,Y) 和 S(Y,Z) ,X、Y、Z 为属性组。 R ÷ S 应当满足元组在 X 上的分量值 x 的象集 Yᵪ 包含关系 S 在属性组 Y 上投影的集合。
设有关系 R、S 如下所示,求 R ÷ S
解:根据除法定义,此题的 X 为属性 AB,Y为属性 CD。 R ÷ S 应当满足元组在属性 AB 上的分类 x 的象集 Yᵪ 包含关系 S 在属性组 CD 上投影的集合。
关系 S 在 Y 上的投影为 πCD (S) = { (cd),(ef) } 。对于关系 R ,属性组 X(即 AB)可以取 3 个值,即 { (a,b),(b,d),(c,k) },它们的象集分别为:
- CDab : { (c,d),(e,f),(h,k) }
- CDbd : { ((e,f),(d,l) }
- CDck : { (c,d),(e,f) }
由上述象集包含 πCD (S) 的有 (a,b) 和 (c,k),因此 R ÷ S = { (a,b),(c,k) }
9.4 关系数据库 SQL 语言简介
SQL 是关系数据库中最普遍使用的语言,包括数据查询、数据操纵、数据定义和数据控制功能,是一种通用的、功能强大的关系数据库的标准语言。
9.4.1 SQL 数据库体系结构
SQL 的特点:
- 综合统一:SQL 集数据定义、数据操纵和数据控制功能与一体,语言风格统一,可独立完成数据生命周期的所有活动。
- 高度非过程化:SQL 语言是高度非过程化的,,当进行数据操作时,只要指出“做什么”,无须指出“怎么做”,存储路径对用户来说是透明的,提高了数据的独立性。
- 面向集合的操作方式:SQL 语言采用面向集合的操作方式,其操作对象、查找结果可以是元组的集合。
- 两种使用方式:第一种方式,用户可以在终端键盘上输入 SQL 命令,对数据库进行操作,称之为自含式语言;第二种方式,将SQL嵌入到高级语言程序中,所以又称为嵌入式语言。
- 语言简洁、易学易用:SQL语言功能极强,完成核心功能只用了9个动词,包括
- 数据查询:SELECT
- 数据定义:CREATE、DROP、DELETE
- 数据操纵:INSERT、UPDATE、DELETE
- 数据控制:GRANT、REVORK
SQL语言支持三级模式结构,其中视图对应外模式、基本表对应模式、存储文件对应内模式,具体结构如下图所示
9.4.2 SQL的基本组成
SQL 由以下几个部分组成:
- 数据定义语言。 SQL DDL 提供定义关系模式和视图、删除关系和视图、修改关系模式的明亮、
- 交互式数据操纵语言。SQL DML 提供查询、插入、删除和修改的明亮。
- 事务控制。SQL提供定义事务开始和结束的命令。
- 嵌入式SQL 和动态 SQL。SQL用于嵌入到某种通用的高级语言中混合编程。其中 SQL 复杂操纵数据库,高级语言负责控制程序流程。
- 完整性。SQL DDL 包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止。
- 权限管理。SQL DDL 中包含说明对关系和视图的访问权限。
9.4.3 SQL 数据定义
基本表和视图都是表,所不同的是基本表是实际存储在数据库中的表,视图是虚表,是从基本表或其他视图中导出的表。数据库中只存放视图的定义,不存放视图的数据。用户可以用SQL对基本表和视图进行查询等操作,在用户看来基本表和视图是一样的,都是关系(即表)。
一个表可以带若干索引,索引也存储在存储文件中。每个存储文件就是外部存储器上的一个物理文件,存储文件的逻辑结构组成了关系数据库的内模式。
1. 创建表
CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]...
[,<表级约束条件>]);
数据类型:
- 字符型:char(N)
- 整型:int
- 浮点型:float
- 日期型: date YYYY-MM-DD
列级完整性约束条件:
- NULL:可以取空值
- UNIQUE:不能取空值
- PRIMARY KEY(列名) :主键
- FOREIGN KEY(列名) :外键
- REFERENCES 表名2 (列名2) :与外键配合使用,指定外键的表和列
建立一个供应商、零件数据库。其中供应商标 S(Sno, Sname, Status, City),分别表示供应商代码、供应商名、供应商状态、供应商所在城市。零件表 P (Pno, Pname, Color, Weight, City) 表示零件号、零件名、颜色、重量及产地。数据库要满足以下要求:
- 供应商代码不能为空,且值唯一,供应商名也是唯一
- 零件号不能为空,且值唯一;零件名不能为空
- 一个供应商可以有多个零件,而一个零件也可以由多个供应商供应
分析:根据题义,供应商和零件分别要建立一个关系模式。供应商和零件之间是一个多对多的联系,在关系数据库中,多对多联系必须生成一个关系模式,而该模式的码是该联系两端实体的码加上联系的属性构成的,若该联系名为SP,那么关系模式为 SP(Sno, Pno, Qty),其中 Qty 表示零件的数量。
CREATE TABLE S(Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(30) UNIQUE, Status CHAR(8), City CHAR(20), PRIMARY KEY(Sno)); CREATE TABLE P(Pno CHAR(5) NOT NULL UNIQUE, Pname CHAR(30), Color CHAR(8), Weigth NUMBERIC(6,2), City CHAR(20), PRIMARY KEY(Pno)); CREATE TABLE SP(Sno CHAR(5), Pno CHAR(5), Status CHAR(8), Qty NUMBERIC(9), PRIMARY KEY(Sno, Pno), FOREIGN KEY(Sno) REFERENCES S(Sno), FOREIGN KEY(Pno) REFERENCES P(Pno));
2.修改和删除表
-
修改表
ALTER TABLE <表名>[ADD <新列名><数据类型>[完整性约束条件]] [DROP [列名/完整性约束条件]] [MODIFY <列名><数据类型>]
例如,向“供应商”表S增加 Zap “邮政编码”:
ALTER TABLE S ADD Zap CHAR(6);
注意,不论基本表中原来是否已有数据,新增加的列一律为空。
又如,将 Status 字段改为整型可用如下语句
ALTER TABLE S MODIFY Status INT;
-
删除表
DROP TABLE <表名>
3.索引建立与删除
在数据库中,索引使数据无须对整个表进行扫描,就可以在其中找到所需数据。数据库中的索引是某个表中的一列或若干列的值的集合和相应的指向表中物理标识这些值的数据也的逻辑指针清单。索引作用如下:
- 通过创建唯一索引,可以保证数据记录的唯一性。
- 可以大大加快数据的检索速度。
- 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面特别有意义。
- 在使用 ORDER BY 和 GROUP BY 子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
- 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。
索引分为聚集索引和非聚集索引。聚集索引是指索引表中索引项的顺序与表中记录的物理顺序一致的索引。
-
建立索引
CREATE [UNION][CLUSTER]INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>]]... )
参数说明:
- 次序:可选 ASC(升序) 或 DESC(降序),默认值为 ASC。
- UNIQUE:表名此索引的每一个索引值只对应唯一的数据记录。
- CLUSTER:表名要建立是索引是聚簇索引,意为索引项的顺序与表中记录的物理顺序一致的索引组织。
假设供应销售数据库中有供应商 S、零件 P、工程项目 J、供销情况SPJ 关系,希望建立4个索引。其中,供销情况 SPJ 关系,希望建立4个索引。其中,供应商S中 Sno 圣墟建立索引;零件 P 中 Pno 按升序建立索引;工程项目J中 Jno 按升序建立索引;供销情况SPJ中Sno按升序、Pno按降序、Jno按升序建立索引。
CREATE UNION INDEX S-SNO ON S(Sno); CREATE UNION INDEX P-PNO ON P(Pno); CREATE UNION INDEX J-JNO ON J(Jno); CREATE UNION INDEX SPJ-NO ON P(Pno ASC, Pno DESC, Jno ASC);
-
删除索引
DROP INDEX <索引名>
4.视图创建与删除
视图是从一个或多个基本表或视图中到处的表,其结构和数据是建立在对表的查询基础上的。视图不是真实存在的基本表,而是一个虚拟表,视图所对应的数据并不是实际地以视图结构存储在数据库中,而是存储在视图所引的表中。使用视图优点如下:
- 可以使用视图集中数据、简化和定制不同用户对数据库的不同数据要求
- 使用视图可以屏蔽数据的复杂性
- 视图可以是用户只关心他感兴趣的某些特定数据和它们所负责的特定任务,而不需要的或者无用的数据则不在视图中显示。
- 视图大大地简化了用户对数据的操作。
- 视图可以让不同的用户以不同的方式看到不同或者相同的数据集。
- 在某些情况下,由于表中数据量太大,因此在设计表时常将表进行水平或垂直分割,以避免表结构的变化对应用程序产生不良的影响。
- 视图提供了一个简单而有效的安全机制。
1)视图的创建
CREATE VIEW 视图名(列表明)
AS SELECT 查询子句
[WITH CHECK OPTION];
注意,在创建视图时必须遵循以下的规定:
- 子查询可以任意复杂的 SELECT 语句,但通常不允许含有 ORDER BY 自居和 DISTINCT 短语
- WITH CHECK OPTION 表示对 UPDATE、INSERT、DELETE 操作时保证更新、插入或者删除的行满足视图定义中的谓语条件(即子查询中的条件表达式)。
- 组成视图的属性列名或全部省略或全部指定。如果省略属性列名,则隐含该视图由 SELECT 子查询目标列的主属性组成。
例:若学生关系模式为 Student( Sno, Sname, Sage, Sex, SD, Email, Tel) ,建立”计算机系“学生的视图,并要求进行修改、插入操作时保证该视图中只有计算机系的学生。
CREATE VIEW CS-STUDENT AS SELECT Sno, Sname, Sage, Sex FROM Student WHERE SD='CS' WITH CHECK OPTION;
2)视图的删除
DROP VIEW 视图名
9.4.4 SQL 数据查询
本小结数据查询以下图所示的学生选课数据库为例。
1. SELECT 基本结构
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]...]
SQL 查询中的子句顺序为 SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。其中SELECT、FROM是必须的, HAVING子句只能与GROUP BY搭配使用。
- SELECT 子句对应的是关系代数中的投影运算,用来列出查询结果中的属性。其输出可以是列名、表达式、函数(AVG、COUNT、MAX、MIN、SUM),DISTINCT选项恶意保证查询的结果集中不存在重复元组。
- 在FROM子句中出现多个基本表或视图时,系统首先执行笛卡尔积操作。
- WHERE 子句的条件表达式中可以使用的运算符如表示
- 集合成员运算符
- IN :在集合中
- NOT IN :不在集合中
- 字符串运算符
- LIKE:与 % 进行单个、多个字符匹配
- 空值比较运算符
- IS NULL :为空
- IS NOT NULL:不为空
- 算术运算符
>
:大于>=
:大于等于- < :小于
- <= :小于等于
- = :等于
- != :不等于
- 逻辑运算符
- AND :与
- OR :或
- NOT :非
- 集合成员运算符
2.简单查询
例1:查询学生-课程数据库中计算机系CS学生的学号、姓名及年龄。
SELECT Sno,Sname,Sage
FROM S
WHERE SD='CS'
注意,为了理解查询语句的结构,通常在写 SQL 语句时要将保留字(如 FORM、WHERE)作为每一行的开头。但是,如果查询子或子查询很短,可以直接将它们写在一行,
例2:若当前年份为 2017,查询学生的出生年份
SELECT Sno,2017-Sage FROM S
3.连接查询
例1:检索选修了课程号“C1”的学生的学号和姓名,可用连接查询和嵌套查询实现
SELECT Sno,Sname
FROM S,SC
WHERE S.Sno = SC.Sno AND SC.Cno = 'C1'
例2:检索选修了课程名为“MS”的学生的学号和姓名,可用连接查询和嵌套查询实现
SELECT Sno,Sname
FROM S,SC,C
WHERE S.Sno = SC.Sno AND C.Cno=SC.Cno AND C.Cname='MS'
例3:检索至少选修了课程号‘C1’和'C2'的学生的学号,实现方法如下
SELECT Sno
FROM SC1,SC2
WHERE SC1.Sno = SC2.Sno AND SC1.Cno = 'C1' AND SC2.Cno = 'C2'
4.子查询与聚集函数
1)子查询
SELECT Sno,Sname
FROM S
WHERE Sno IN (SELECT Sno
FROM SC
WHERE Cno IN (SELECT Cno
FROM C
WHERE Cname='MS'))
2)聚集函数
- COUNT([DISTINCT|ALL]*):统计元组个数
- COUNT([DISTINCT|ALL]<列名>):统计一列中指的个数
- AVG([DISTINCT|ALL]<列名>):返回某列的平均值
- MAX([DISTINCT|ALL]<列名>):返回某列的最大值
- MIN([DISTINCT|ALL]<列名>):返回某列的最小值
- SUM([DISTINCT|ALL]<列名>):返回某列值之和
使用 ANY 和 ALL 谓词时,必须同时使用比较运算符,其含义及等价的转换关系如下表所示。用聚集函数实现子查询通常比直接用ALL或ANY查询效率高.
谓词 | 含义 | 等价转换关系 |
---|---|---|
>ANY | 大于子查询结果的某个值 | >MIN |
>ALL | 大于子查询结果中的所有值 | >MAX |
<ANY | 小于子查询结果中的某个值 | <MAX |
<ALL | 小于子查询结果中的所有值 | <MIN |
>=ANY | 大于等于子查询结果中的某个值 | >=MIN |
>=ALL | 大于等于子查询结果中的所有值 | >=MAX |
<=ANY | 小于等于子查询结果中的某个值 | <=MAX |
<=ALL | 小于等于子查询结果中的所有值 | <=MIN |
=ANY | 等于子查询结果中的某个值 | IN |
=ALL | 等于子查询结果中的所有值(通常没有实际意义) | -- |
!=(或<>)ANY | 不等于子查询结果中的某个值 | -- |
!=(或<>)ALL | 不等于子查询结果中的任何一个值 | NOT IN |
例1: 查询课程C1 的最高分和最低分以及高低分之间的差距
SELECT MAX(G),MIN(G),MAX(G)-MIN(G)
FROM SC
WHERE Cno='C1'
例2:查询其他系比计算机系CS所有学生年龄都要小的学生的姓名及年龄
方法1
SELECT Sname,Sage
FROM S
WHERE Sage<ALL(SELECT Sage FROM S
WHERE SD='CS')
AND SD<>'CS'
方法2
SELECT Sname,Sage
FROM S
WHERE Sage<ALL(SELECT MIN(Sage) FROM S
WHERE SD='CS')
AND SD<>'CS'
例3:查询其他系比计算机系CS某一学生年龄小的学生的姓名及年龄
方法1
SELECT Sname,Sage
FROM S
WHERE Sage<ANY(SELECT Sage FROM S
WHERE SD='CS')
AND SD<>'CS'
方法2
SELECT Sname,Sage
FROM S
WHERE Sage<ANY(SELECT MAX(Sage) FROM S
WHERE SD='CS')
AND SD<>'CS'
5.分组查询
GROUP BY 子句
GROUP BY 可以对元组进行分组,保留字 GROUP BY 后面跟着一个分组属性列表。SELECT 子句中使用的聚集操作符仅用在每个分组上。
查询 SC 中每个学生的平均成绩
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING 子句
假如元组在分组前按照某种方式加上限制,使得不需要的分组为空,在 GROUP BY 子句后面跟一个 HAVING 子句即可。
- 空值在聚集操作中被忽视。 COUNT(A) 表示 A 属性非空的元组个数之和。而COUNT(*) 是某个关系中所有元组数目之和。
- NULL 值又可以在分组属性中被看做一个一般的值。 例如, 在 SELECT A,AVG(B) FROM R 中,当 A 的属性值为空时,就会统计 A=NULL 的所有元组中 B 的均值。
供应商数据库中 SPJ 关系,查询某工程至少用了3家供应商供应的零件,并按工程号降序排序
SELECT Jno, AVG(Qty)
FROM SPJ
HAVING COUNT(DISTINCT(Sno)) > 2
ORDER BY Jno DESC
6.更名运算
更名使用 AS 子句来实现
old-name AS new-name
例如:
SELECT Sname AS 名称,Age AS 年龄
FROM S
7.字符串操作
-
%
:匹配任意字符串 -
_
:匹配任意一个字符
-
查询地址包含‘科技路’的学生的姓名
SELECT Sname FROM S WHERE Add LIKE '%科技路%'
-
查询名字为‘晓军'的学生的姓名、年龄和所在系的SQL
SELECT Sname,Age,SD FROM S WHERE Add LIKE '_晓军'
8.视图的查询
建立“计算机系”(CS表示计算机系)学生的视图,并要求修改、插入、删除操作时保证该视图只有计算机系的学生。
CREATE VIEW CS-STUDENT
AS SELECT Sno,Sname,Sage,Sex
FROM Student
WHERE SD = 'CS'
WITH CHECK OPTION;
查询计算机系年龄小于20岁的学生的学号及年龄
SELECT Sno,Sage FROM CS-STUDENT WHERE Sage < 20
相当于
SELECT Sno,Sage FROM Student WHERE SD = 'CS' AND Sage < 20
9.4.5 SQL 数据更新
1.插入
插入语句的基本格式如下:
INSERT INTO 基本表名 (字段名[,字段名]...);
插入查询语句
INSERT INTO 基本表名 (列表名)
SELECT 查询语句
将学号为 3002、课程号为 C4、成绩为 98 的元组插入 SC 关系中
INSERT INTO SC
VALUES('3004','C4',98)
2.删除
DELETE FROM 基本表名
[WHERE 条件表达式]
删除表 employees 中姓名为张然的记录。
DELETE FROM employees
WHERE name = '张然'
3.修改
UPDATE 基本表名
SET 列名=值表达式(,列名=值表达式...)
[WHERE 条件表达式]
将教师工资增加5%
UPDATE teachers
SET Salary = Salary*1.05
9.4.6 SQL 访问控制
数据库控制,控制的是用户对数据的存储权力,是由DBA决定的。但是,某个用户对某类数据具有何种权利,是个政策问题而不是技术问题。DBMS的功能就是保证这些决定的执行。因此,DBMA数据控制应具有以下功能:
- 通过 GRANT 和 REVOKE 将授权通知系统,并存入数据字典。
- 当用户提出请求时,根据授权情况检查是否执行操作请求,
SQL标准包括 DELETE、INSERT、SELECT 和 UPDATE 授权。SELECT 权限对应于 READ权限,SQL 还包括 REFERENCES 权限,用来限制用户在创建关系时定义外码的能力。
1.授权的语句格式
GRANT <权限>[,<权限>]...[ON<对象类型><对象名>] TO <用户>[,<用户>]...
[WITH CHECK OPTION];
注意,不同诶新的操作对象有不同的操作权限
对象 | 类型 | 操作权限 |
---|---|---|
属性列 | TABLE | SELECT、INSERT、UPDATE、DELETE、ALL PRIVILEGES(4种权限的总和) |
视图 | TABLE | SELECT、INSERT、UPDATE、DELETE、ALL PRIVILEGES(4种权限的总和) |
基本表 | TABLE | SELECT、INSERT、UPDATE、DELETE、ALTER、INDEX、ALL PRIVILEGES(6种权限的总和) |
数据库 | DATABASE | CREATETABLE 建立表的权限,可由DBA授予普通用户 |
说明如下:
- PUBLIC:接收权限的用户可以单个或多个用户,PUBLIC 参数可将权限赋给全体用户。
- WITH CHECK OPTION:若指定了此子句,那么获得了权限的用户还可以将权限赋给其他用户。
如果用户要求给数据库SPJ中的供应商S、零件P、项目J 表赋予各种权限。
将对 供应商S、零件P、项目J 的所有权限赋值给 User1及User2,其授权语句
GRANT ALL PRIVILEGES ON TABLE S,P,J TO User1,User2;
将对公因数 S 的插入权限赋给 User1,并允许将此权限赋给其他用户,其授权语句如下:
GRANT INSERT ON TABLE S TO User1 WITH CHECK OPTION;
DBA 把数据库SPJ建立表的权限赋给用户 User1,其授权语句如下:
GRANT CREATETABLE ON DATABASE TO User1;
2.收回授权语句格式
GRANT <权限>[,<权限>]...[ON<对象类型><对象名>] FROM <用户>[,<用户>]...
如果收回用户要求 给数据库SPJ中的供应商S、零件P、项目J 表的各种权限
将用户User1及User2 对 供应商S、零件P、项目J 的所有权限
REVOKE ALL PRIVILEGES ON TABLE S,P,J FROM User1,User2;
将所有用户对供应商S的所有查询权限收回。
REVOKE SELECT ON TABLE S FROM PUBLIC;
将User1对供应商S的供应商编号的修改权限收回。
REVOKE UPDATE(Sno) ON TABLE S FROM User1;
9.4.7 嵌入式SQL
SQL 提供了将 SQL 语句嵌入到某种高级语言中的使用方式,通常采用预编译的方法识别嵌入到高级语言中的 SQL 语句。
嵌入式 SQL 与主语言之间的通信方式有以下3中:
- SQL 通信区向主语言传递 SQL 语句执行的状态信息,使主语言能够根据此信息控制程序流程。
- 主变量也称共享变量。主语言向 SQL 提供参数主要通过主变量,主变量由主语言的程序定义,并用 SQL 的 DECLARE 语句说明。在引用时,为了与 SQL 属性名区别,需要在主变量前面加“:”。
- 游标 SQL 语言是面向集合的,一条 SQL 语句可以产生或处理多条记录,而主语言是面向记录的,一组变量一次只能放一条记录。所以,引入游标,通过移动游标指针来决定获取哪一条记录。
9.5 关系数据库的规范化
在关系模型数据库中,一个数据库模式是关系模式的集合。关系数据理论是指导数据库设计的基础,关系数据库设计是数据库语义学的问题。通常,要保证构造的关系既能准确反映现实世界,又有利于应用和具体的操作。关系数据库设计理论的核心是数据间的函数依赖,衡量的标准是关系泛化的程度及分解的无损连接和保持函数依赖性。关系数据库设计的目标是生产一组合适的、性能良好的关系模式,以减少系统中信息存储的冗余度,并可方便地获取信息。
9.5.1 函数依赖
关系模式中的各属性之间的相互依赖、相互制约的联系称为数据依赖。函数依赖是一种最重要、最基本的数据依赖。
学生关系:S(SNO,SN,AGE,DEPT)
选课关系:SC(SNO,CNO,SCORE)
系关系:D(DEPT,MN)
-
函数依赖。关系模式中属性之间的一种逻辑依赖关系。
假设,学生关系:S(SNO,SN,AGE,DEPT)。由于一个SNO对应一个学生,而一个学生只属于一个系,所以当SNO确定之后,SN,AGE,DEPT的值也唯一确定了,可以说SNO决定函数(SN,AGE,DEPT),或者是(SN,AGE,DEPT)函数依赖于SNO。或者表示为:SN0->(SN,AGE,DEPT);
可以抽象成:X->Y(Y依赖于X,X决定Y)。
-
平凡的函数依赖和非平凡的函数依赖
平凡依赖要求 Y 是 X 的子集,就是子集决定自己或者自己的一部分。 (SNO,CNO) -> CNO
如果 Y 不属于 X ,那么称为非平凡的函数依赖。 SNO ->(SN,AGE,DEPT)
-
完全函数依赖 和部分函数依赖
完全依赖是指 X 决定 Y,但是 X 的任意子集都不能决定 Y,这就是完全函数依赖。
反之,X 的一部分就能决定 Y,对于 X->Y 这个关系来说,就是部分依赖了。
注意:只有当决定因素是组合属性的时候,讨论部分依赖才有意义,当决定因素是单属性的时候,只能是完全函数依赖。
-
传递依赖
A->B,B->C,那么有A->C,这就是传递依赖.
比如,学号->班级,班级->讲师,但是讲师不能决定班级,所以讲师对学号是传递函数依赖。
-
码
K为U的属性或属性集合,若K->U,则 K 为候选码。
若有多个候选码,则选一个作为主码。候选码通常也称为候选关键字。
-
主属性和非主属性
包含任何一个候选码的属性称为主属性,否则为非主属性。
-
外码
若组合U中的熟悉或属性组 X 非它自己的码,但是是另一个关系的码,则成 X 是外码。
-
函数依赖的公理系统
设关系模式 R(U,F),其中U为属性集,F是U上的一组函数依赖,那么有以下推理规则
- A1 自反律:若 Y ⊆ X ⊆ U,则 X -> Y 为 F 所蕴涵。
- A2 增反律:若X→Y 为 F 所蕴涵,且Z(包含于)U,则 XZ→YZ 为 F 所蕴涵
- A3 传递律: 若X→Y, Y→Z 为 F 所蕴涵,则 X→Z 为 F 所蕴涵
根据上述三条推理,又可以退出下列3条推理:
- 合并规则: 若 X→Y ,X→Z ,则 X→YZ 为 F 所蕴涵。
- 伪传递率: 若 X→Y ,WY→Z ,则 XW→Z 为 F 所蕴涵。
- 分解规则: 若 X→Y ,Z ⊆ Y,则 X→Z 为 F 所蕴涵。
在A->B这一函数依赖中,左边的属性可以随意增加,右边的属性可以随意减少. 因为A决定B,那么增加任意属性依然可以决定B。
9.5.2 规范化
关系数据库设计的方法之一就是满足适当的范式的模式,通常可以通过判断分解后的模式达到几范式来评价模式规划化的程度。范式有1NF、2NF、3NF、4NF、5NF,其中1NF级别最低。这几种范式之间,5NF ⊂ 4NF ⊂ 3NF ⊂ 2NF ⊂ 1NF 成立。通过分解,可以将一个低一级范式的关系模式转换成若干个高一级范式的关系模式,这个过程称为规范化。下面给出 1NF、2NF、3NF 的定义。
现在数据库设计最多满足3NF,普遍认为范式过高,虽然具有对数据关系更好的约束性,但也导致数据关系表增加而令数据库IO更易繁忙,原来交由数据库处理的关系约束现更多在数据库使用程序中完成。
1. 1NF(第一范式)
定义:若安息模式 R 的每一个分类是不可再分的数据项,则关系模式 R 属于第一范式。
同一列不能有多个值。
正例: 表4.3——学生和课程的关系
Name | Course |
---|---|
Jim | History |
Jim | Math |
Jim | Chinese |
Alice | English |
Tom | History |
Tom | Math |
反例1: 单一字段存放了多个值,违反了1NF,Jim现在到底上的哪门课呢?
Name | Course |
---|---|
Jim | History,Math,Chinese |
Alice | English |
Tom | History,Math |
反例2: 多个字段表达同一个意思,这也是不符合1NF的。( Course1、 Course2、 Course3 都是表示课程)
Name | Course1 | Course2 | Course3 |
---|---|---|---|
Jim | History | Math | Chinese |
Alice | English | ||
Tom | History | Math |
但是 1NF 存在以下4个问题:
- 冗余度大。
- 引起修改操作的不一致性。(一些数据被修改,而另一些数据确没有修改,导致数据修改的不一致性)
- 插入异常
- 删除异常
正是因为上述4个原因,所以要对模式进行分解,并引入了2NF。
2. 2NF(第二范式)
定义:若关系模式 R ∈ 1NF,且每一个非主属性完全依赖于码,则关系模式 R ∈ 2NF。
通俗点讲,①必须满足1NF②必须有一个主键,且没有包含在主键中的列必须完全依赖于主键,而不能只依赖主键的一部分
举个例子
Name | Course | Score |
---|---|---|
Tim | Chinese | 70 |
Tim | Math | 90 |
Alice | Chinese | 80 |
Juliea | Math | 80 |
在这张成绩表中,首先满足了1NF,列的原子性。其次,必须有主键,显而易见,(Name+Course)才能唯一确定一个元组,因此,Name+Course为联合主键。Score只有通过Name+Course才能共同确定,仅仅通过Name或Course是不行的。以y=f(x)为例,即,Score=f(Name+Course),Score不能只依赖Name或Course。
3. 3NF(第三范式)
定义:消除了非主属性对于码的传递函数依赖(满足2NF且非主属性列都不传递依赖于主键)。
通俗点讲,3NF必须满足,①满足2NF②不能有传递的依赖关系。换句话说,表中的每一列和主键直接相关,不能是间接相关的。再换句话说,通过主键就能直接定位到每一列,而不能是间接才能定位到
举个例子
订单编号 | 订单项目 | 客户ID | 客户名称 |
---|---|---|---|
001 | 水果 | 101 | 张三 |
002 | 饮料 | 101 | 张三 |
在这个表中,通过订单编号能确定订单项目名称,如001能确定是水果;通过订单编号,能确定客户ID,通过客户ID能确定客户名称,当存在这种情况即存在传递依赖时,这个表就不满足3NF了,需要拆分。
可以拆分为:
-
订单编号 订单项目 客户ID 001 水果 101 002 饮料 101 -
客户ID 客户名称 101 张三
9.5.3 模式分解及分解应具有的特性
-
分解
对一个给定的模式进行分解,是的分解后的模式是否有原来的模式等价有3中情况:
- 分解具有无损连接性。无损连接表示原关系下的合法关系实例在分解之后,应能通过自然连接运算恢复。
- 分解要保持函数依赖。关系是的函数依赖集在分解后仍在数据库模式中保持不变。
- 分解纪要无损连接性,又要保持函数依赖。
-
无损连接
-
保持函数依赖
9.6 数据库的控制功能
9.6.1 事务管理
事务是一个操作序列,这些操作“要么都做,要么都不做”,是数据库环境中不可分割的逻辑工作单位。事务和程序是两个不同的概念:一般一个程序可包含多个事务。在SQL语言中,事务定义的语句有以下三条:
- BEGIN TRANSACTION:事务开始。
- COMMIT:事务提交。该操作表示事务成功的结束。
- ROLLBACK:事务回滚。该操作表示事务非成功的结束。
事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这4个特性也称事务的ACID性质。
- 原子性:事务是原子的,要么都做,要么都不做。
- 一致性:事务执行的结果必须保持数据库从一个一致性状态变到另一个一致性状态。因此,当数据库只包含成功事务提交的结果时,成数据库处于一致性状态。
- 隔离性:事务互相隔离。当多个事务并发执行时,任一事务的更新操作直到其成功提交的整个过程,对其他事务是不可见的。
- 持久性:一旦事务提交成功,即使数据库崩溃,其对数据库的更新操作也将永久有效。
9.6.2 数据库的备份与恢复
在数据库运行过程中,难免会出现故障。因此,数据库的关键技术在于建立数据冗余,即备份数据。如何在数据库出现故障后能够及时地使数据恢复到故障前的正确状态,就是数据库恢复技术。
1.故障类型
- 事务内部故障。 事务内部故障有的可以通过事务程序本身发现。
- 系统故障。如 CPU 故障、操作系统故障、突然停电等。
- 介质故障。如磁盘损坏、磁头碰撞和瞬时强磁干扰。
- 计算机病毒。
2.备份方法
恢复的基本原理是“建立数据冗余”(重复存储)。建立冗余数据的方法是进行数据转储和登记日志文件。数据的转储分为静态转储和动态转储、海量存储和增量存储、日志文件。
-
静态转储和动态转储
静态转储是指在转储期间不允许对数据库进行任何存取、修改操作;动态转储是指在转储期间允许对数据库进行任何存取、修改操作。因此,转储和用户事务可并发执行。
-
海量存储和增量存储
海量存储是指每次转储全部数据。增量存储是指每次只转储上次转储后更新过的数据
-
日志文件
在事务处理的过程中,DMBS把事务开始、事务结束以及对数据的插入、删除、修改 的每一次操作都写入日志文件。一旦发生故障,DMBS 的恢复子系统利用日志文件撤销事务对数据库的改变,回退到事务的初始状态。因此 DBMS 利用日志文件来进行事务故障恢复和系统故障恢复,并可协助后被副本进行介质故障恢复。
3.恢复
事务恢复有以下3个步骤:
- 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。
- 对事务的更新操作执行逆操作
- 继续反向扫码日志文件,查找该事务其他更新操作,并做同样的处理,直到事务的开始标志
4.数据库镜像
为了避免磁盘介质出现故障影响数据库的可用性,许多 DBMS 提供数据库镜像功能用于数据恢复。需要说明的是,数据库镜像是通过复制数据实现的,但频繁的复制数据会降低系统的运行效率。因此,在实际应用中往往对关键的数据和日志文件镜像。
9.6.3 并发控制
所谓并发控制,是指在多用户共享的系统中有许多用户可能同时对同一数据进行操作。并发操操作带来的问题是数据的不一致性,主要有三类:丢失更新、不可重复读和读脏数据。其主要原因是事务的并发操作破坏了数据的隔离性。 DBMS 的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,避免用户得到不正确的数据。
1.并发操作带来的问题
并发操作带来的数据部不一致性有三类:
-
丢失修改
如下图(a)所示,事务 T1、T2 都是对数据 A 做减 1 操作。 事务 T1 在时刻 t6 把 A 修改后的值 16 写入数据库,但事务 T2 在时刻 t7 再把他对 A 减 1 后的值 15 写入。两个事务都是对 A 的值进行减 1 操作并且都执行成功,但 A 中的值却只减了 1.例如火车售票系统, T1 与 T2 各售出一张票,但数据库例的存储却只减少了一张,造成数据的不一致。原因在与 T1 事务对数据的修改被 T2 事务广覆盖而丢失了,破坏了事务的隔离性。
-
不可重复读
如图(b)所示,事务 T1 读取 A、B 的值后进行运算,事务 T2 在 t6 时刻对 B 做了修改以后,事务 T1 又重新读取了 A、B 的值再运算,同一事务内对同一组数据的相同运算结果不同,显然与事实不相符。同样是事务 T2 干扰了事务 T1 的独立性。
-
读脏数据
如图(c)所说义,事务 T1 对数据 C 修改之后,在 t4 时刻事务 T2 读取修改后的的 C 值做处理,之后事务 T1 回滚,数据 C 恢复了原来的值,事务 T2 对 C 所做的处理是无效的,它读的是被丢掉的垃圾值。
通过以上3个例子,在事务并行处理的过程中对相同数据访问导致了数据的不一致性,解决该问题可以从保证事务的隔离性入手。
2.并发控制技术
并发控制技术的主要技术是封锁。基本封锁的类型由排它锁(简称 X 锁或写锁)和共享锁(简称 S 锁或读锁)。
- 封锁
- 排他锁。若事务 T 对数据对象 A 上加上 X 锁,则只允许 T 读取和修改 A,其他事务不能再对 A 加 任何类型的锁,直到 T 释放 A 上的加锁。
- 共享锁。若事务 T 对数据对象 A 上加上 S 锁,则只允许 T 读取 A,但不能修改 A,其他事务只能再对 A 加 S 锁,直到 T 释放 A 上的 S 锁。这就保证了其他事务可以读 A ,但在 T 释放 A 上的 S 锁之前不能对 A 进行任何修改。
- 三级封锁协议
- 一级封锁协议。事务在修改数据 R 之前必须先对其加 X 锁,直到事务结束才能释放。事务结束包括 COMMIT 和 ROLLBACK。一级封锁协议可以解决丢失更新问题。
- 二级封锁协议。在一级封锁协议的基础上,加上事务 T 在读数据 R 之前必须先对其加 S 锁,读完后可释放 S 锁。二级封
- 锁协议可以解决读脏数据的问题。但是,由于 二级封锁协议读完了数据后即可释放 S 锁,所以不能保证可重复读。
- 三级封锁协议。在一级封锁协议的基础上,加上事务 T 在读数据 R 之前必须先对其加 S 锁,直到事务结束时释放 S 锁。三级封锁协议除了防止丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
3.活锁与死锁
所谓活锁,是指当事务 T1 封锁了数据 R 时,事务 T2 请求封锁数据 R,于是 T2 等待,当 T1 释放了 R 上的封锁后,系统首先批准 T3 请求, 于是 T2 仍等待,当 T3 释放了 R 上的封锁后,又批准了 T4 请求,依次类推,使得 T2 可能永远等待的现象。
所谓死锁,是指两个以上的事务分别请求封锁对方已经封锁的数据,导致了长期等待而无法继续运行下去的现象。
4.并发调度的可串行性
多个事务的并发执行是正确的,当且晋档其结果与某一次序串地执行它们时的结果相同,称这种调度策略是可串行化的调度。
可串行性是并发事务正确性的准则,按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度。
5.两端封锁协议
所谓两端封锁协议,是指所有事务必须分两个阶段对数据项枷锁和解锁。即事务分两个阶段,第一个阶段是获得封锁,事务可以获得任何数据项上的任何类型的锁,但不能释放;第二阶段是释放锁,事务可以释放任何数据项上的任何类型的锁,但不能申请。
6.封锁的粒度
封锁对象的大小称为封锁的粒度。封锁对象可以是逻辑单元(如属性、元组、关系、索引项、整个索引甚至整个数据库),也可以是物理单元(如数据页或索引页)。
9.7 习题
题2
以下关于数据库系统的描述中,正确的是()。
A.数据库能减少数据冗余,避免一切数据的重复存储
B.各类用户程序均可随意地使用数据库中的各种数据
C.数据库中的概念模式如有改变,子模式不必变,因而用户程序不必改写
D.数据库系统的存储模式如有改变,则概念模式应予以调整,否则用户程序会在执行中出错
答案 C
D.不用调整概念模式,只要调整概念模式-内模式映射即可。
题3
在关系数据库设计中,设计关系模式是数据库中哪个阶段的任务()。
A.逻辑设计阶段
B.概念设计阶段
C.物理设计阶段
D.需求分析阶段
答案 A
数据库逻辑设计的主要目的是产生一个 DBMS 可处理的逻辑数据模型和数据库模式,该模式必须满足数据库的存取、一致性及运行等方面的用户需求。关系数据模型是目前最常用的逻辑数据模型,因此设计关系模式是数据库逻辑设计阶段的主要任务之一。
题7
关系 R1 和 R2 如下所示:
R1
A | B | C | D |
---|---|---|---|
a | d | c | e |
c | b | a | e |
d | e | c | e |
e | f | d | a |
R2
C | D | E | F |
---|---|---|---|
a | e | c | a |
a | e | a | b |
c | e | b | c |
若进行 R1 ⋈ R2,则运算结果共有()个元组
A. 4
B. 5
C. 6
D. 7
答案 A
本体主要考察关系运算中的自然连接运算。自然连接,是通过两个关系中相同属性的相同值来进行连接的一种关系运算。本题中, R1 和 R2 中相同的属性分别是 C 和 D,而取值也相等的是 R1 中的第一行、第三行与 R2 中的第三行,另外还有 R1 中的第二行与 R2 中的第一行和第二行,因此自然连接后的运算结果为
A B C D E F a d c e b c d e c e b c c b a e c a c b a e a b 因此,运算结果共有4分元组(记录)。
题8
下列关于分布式数据库特点的描述错误的是()。
A. 分布式数据库系统的数据是分布的,难以集中控制
B. 分布式数据库系统的数据的组成对应用程序来说是透明的,即具有独立性
C.分布式数据库系统的数据存在冗余且可控
D.分布式数据库系统的数据具有场地自治性
答案 A
分布式数据库系统是传统集中式数据库系统的发展,因此它具有集中式数据库系统的特点。同时,由于它的分布式性而有使这些特点具有新的意义。传统的数据库系统针对文件系统的弱点,采用了集中控制以实现数据共享。对于分布式数据库系统来说,由于数据的分散性,分布式数据库系统具有分散与集中同一的特性。分布式主要有以下几个特点:
- 数据的集中控制性,分布式数据库是由传统的数据库发展而来的,因此也具有集中控制的特性
- 数据的独立性,独立性是指数组的组成对应于程序来说是透明的。应于程序只需要考虑数据的逻辑结构,而不用考虑数据的物理存放,因而数据在物理组织上的改变不会影响应用程序。
- 数据冗余可控性,分布式数据库中的数据一般存储在经常使用的场地上,但应用对两个或两个以上场地的同一数据有存取要求也是时常发生的,而且当传输代价高于存储代价时,可以将同一数据存在两个(甚至更多)的场地上,以节省传输的开销。由于这种冗余是在系统控制下的,所以给系统造成的不利影响是可控的。
- 场地自治性,局部用户所使用的数据库可以不参与到全局数据库中去,这种局部应用独立于全局应用的特性就是局部数据库的自治性。存取的有效分布式数据库系统的全局查询可以分解成等效的子查询,即全局查询的执行计划可以分解成多个子查询执行计划,而子查询计划有时在各场地上分布执行的。
题9
关于数据仓库的特性,下列说法正确的是()。
A. 面向主题的特征是指在组织数据仓库数据时,需要将各种分析需求归类并抽象,形成相应的分析应用主题,并根据分析应用主题的数据需求设计和组织数据
B. 集成特征是指需要将业务系统中所有的数据抽取出来,载入到数据仓库中
C. 集成特性是指需要将企业整个架构中的各个数据和应用集中到数据仓库中
D. 随时间变化性是指数据仓库中的每个数据单元一般都有时间标志,且其中各种数据(包括原始数据)会随时间变化被经常修改
答案 A
面向主题的特性是指将关于主题的数据组织起来分析数据及数据之间的关系。
集成是将业务系统中关于主题的数据集中起来,对数据进行一系列预处理。
随时间变化的特征是不进行分析数据更新操作,但数据仓库随时间变化不断增加、删除、修改数据。
题10
关系 R (A, B, C) 满足下列函数依赖 F { A->B, A->C, B->AC},关系 R 的候选关键字为()。
A. AC
B. A 和 B
C. A 和 BC
D. AC 和 AB
答案 B
本题主要考察候选键。求候选键是求范式或后续规范化处理的基础。求候选键最稳妥的办法是图示法。图示法求候选键的过程如下:
- 将关系的函数依赖关系,用“有向图”的方式表示。
- 找出入度为0的属性,并以该属性集合为起点,尝试遍历有向图,若能正确遍历图中所有结点,则该属性集即为关系模式的候选键。
- 若入度为0的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的节点)并入度为0的属性集中,直至该集合能遍历所有结点,集合为候选键。
在本题中,我们也可以通过图示法来求候选键。如果一个属性集能唯一标识原则,且又不含有多余属性,那么这个属性集就是候选键。根据图示法,可以得到下图
然后从 A 属性出发,可以遍历到 B、C,因此 A 是一个候选键,但这时,我们注意到,从 B 出发,也可以遍历图中剩余的顶点,因此 B 也是一个候选键。所以本体的候选键是 A 和 B。
题11
设有图书管理数据库,其关系模式 R0 (L#, B#, BNAME, BPRICE, BPUB) , 其属性分别表示个人借书证号、书号、书名、书价、图书出版社。该关系模式属于()。
A. 第一范式但不属于第二范式
B. 属于第二范式但不属于第三范式
C. 属于第三范式
D. 不是范式
答案 A
第一范式要求每个属性都是不可分解的,题中关系模式 R0 的所有属性不可在分解,因而属于第一范式,但它不是第二范式,因为第二范式要求每个分组属性完全依赖于主码,而 R0 中如果将 (L#, B#) 作为主码的话,则属性 BNAME 只是部分依赖于主码(因为它的完全函数依赖于 B#),所以它不是第二范式,如果不满足第二范式也就不可能满足第三范式或更高级别的范式。
如果有多人借同一本书,则 BNAME 等信息要重复出现多次。如果将 R0 分解成 R1 (L#, B#) 和 R2 (B#, BNAME, BPRICE, BPUB) 两个关系模式,则 R1 和 R2 都成为第二范式,在一定程度上降低了数据冗余。
题14
设有如下关系:
关系 R
A | B | C | D |
---|---|---|---|
2 | 1 | a | c |
2 | 2 | a | d |
3 | 2 | b | d |
3 | 2 | b | c |
2 | 1 | b | d |
关系 S
C | D | E |
---|---|---|
a | c | 5 |
a | c | 2 |
b | d | 6 |
与元组演算表达式等价的关系代数表达式是( )。
A. πA,B(σA>E (R ⋈ S))
B. πB(σA>E (R x S))
C. πB(σA>E (R ⋈ S))
D. πB(σR.C=S.C ^ A>E (R x S))
答案 C
在元组演算表达式中, u 代表关系 R 的元组,v 代表关系 S 的元组。
- u[3] = v[1] 表示 R 的第 3 个属性 (C)值等于 S 的第一个属性 (C) 值,相当于关系运算中的 R.C = S.C
- u[4] = v[2] 表示 R 的第 4 个属性(D)值等于 S 的第二个属性 (D) 值,相当于关系运算中的 R.D = S.D
- 从这2个等式可以排除选项 B 个 D
- u[1] > v[3] 表示 R 元组的第一个属性 (A) 值大于 S 元组的第 3 个属性(E)值。相当于关系运算符中的 R.A > S.E 。
- t[1] = u[2] 表示最后结果只取关系 R 的第2个属性(B)。该等式排除了选项 A。
- 根据上面的分析,可以得出,本题的正确答案案为 C。
题15
若关系 R、S 如下图所示, R ÷ S = ( )。
关系 R
A | B | C | D |
---|---|---|---|
a | b | c | d |
a | b | e | f |
c | a | c | d |
关系 S
C | D |
---|---|
c | d |
e | f |
A.
A | B |
---|---|
a | b |
c | a |
B.
C | D |
---|---|
c | d |
C.
A | B |
---|---|
c | d |
D.
A | B |
---|---|
a | b |
答案 D
本题主要考察除法运算。其求解过程为:
首先按除运算定义要求,确定 X,Y,Z 属性集合。Y 是关系 R 中的属性集合,Z 是 S 中全部属性的集合,所以很容易得出 Z = { C, D },同时由于 Y = Z , 所以 Y = { C, D } , X = { A, B }。因此 R ÷ S 结果集包含属性 A 和 B。
然后将关系 R 的 A、B 元组(共有 <a, b> 与 <c, a> 两个元组)与关系 S 做笛卡尔积操作,结果如下
A B C D a b c d a b e f c a c d c a e f 通过检查该表,发现元组<a, b> 与 S(Z)的笛卡尔积被包含在 R(X, Y) 中,而元组<c, a> 与 S(Z) 的迪卡尔即有一条记录未被包含在 R(X, Y) 中,所以结果只有原则<a, b>。
题16
若关系模式 R < {A, B, C}, {A->B, B->C},则将 R 分解为 R1(A, B) 和 R2(B, C),则该分解( )。
A. 满足无损连接,但不保持函数依赖
B. 不满足无损连接,但保持函数依赖
C. 既不满足无损连接,又不保持函数依赖
D. 既满足无损连接,又保持函数依赖
答案 D
本题考查对模式分解的掌握。根据无损连接分解判定定理,有 R1 ∩ R2 -> R2 - R1,即 B -> C 成立,故分解具有无损连接性;又 R 的函数依赖集 F = { A->B, B->C },在 R1、R2 上的投影分别为 F1 = {A->B}、F2 = {B->C},即 F1 ∪ F2 = F,从而 (F1 ∪ F2)+ = F+,根据定义,分解保持了函数依赖。
题17
给定厝模式 R (U, F),U={A, B, C}, F = { AB->C, C->B }。关系 R 有()。
A. 1个非主属性和2个主属性
B. 2个非主属性和1个主属性
C. 0个非主属性和3个主属性
D. 3个非主属性和0个主属性
答案 C
本题主要考察函数依赖的基础知识。
关系中的某一属性或属性组的值的唯一的标识一个元组,而其任何真子集都不能再标识,则成该属性组为候选码。
这里要注意,如果一个关系有多个不同的主码时,那么这些主码组合在一起就是候选码,也就是说一个关系的主码只能选一个,而候选码可以有多个,这就好比选班长一样,候选人可以多个,但是最终的班长只能有一个。当候选码只有一个时,候选码就是主码。
主属性和非主属性是互补的,一个关系模式中的属性不是主属性就是非主属性。组成候选码的属性就是主属性,其他的就是非主属性,所以要判断关系模式中的属性是主属性还是非主属性,首先要求解出候选码。
在本题中,从题目给出的函数依赖关系可以看出,AB 能推导出 C,即能推导出所有的属性;而 C 能推导出 B,同样 AC 也能推导出所有的属性,因此 AB 与 AC 都是该关系的候选码。所以该关系模式都是主属性,没有非主属性。
题18
给定关系模式 R (U,F), U={A, B, C, D}, F = { A->C, A->D, C->B, B->D }, F 中的冗余函数依赖为 ()。
A. A->C
B. A->D
C. C->B
D. B->D
答案 B
冗余函数依赖是指函数依赖集 F 中多余的函数依赖关系。这样多余的含义是驱动该函数依赖后,仍然不改变其性质。比如,去掉 X->Y,然后再 F 中求 X⁺,如果 仍然存在 X⁺ 中,则表名 X->Y 是多余,需要去掉。
本题中,如果 A-> C,那么 F = { A->D, C->B, B->D },这时从 A 出发,就只能推导出 A 和 D,因此 A⁺ = {A,D} ,不包含 C,因此该函数依赖不是多余的。
如果去掉 A->D,那么 F = { A->C, C->B, B->D },这时从 A 出发,能推导出 A 、B、C、 D ,因此 A⁺ = {A, B, C, D},包含了 D,因此该函数依赖是多余的,应该去掉。
同理,如果去掉 C->B, 那么 C⁺={C},不包含 B,而如果去掉 B->D ,那么 B⁺ = {B},因此这两个函数依赖都不是多余的函数依赖。
题29
关系模型允许定义三类数据约束,下列不属于数据约束的是()。
A. 实体完整性约束
B. 参照完整性约束
C. 域完整性约束
D. 用户自定义的完整性约束
答案 C
数据约束是用来确保数据的准确性和一致性的。常见的4中数据约束如下:
- 实体完整性约束:规定表的每一行在表中是唯一的实体。
- 域完整性约束:是指标中的列必须满足特定的数据类型约束,其中约束有包括取值范围、精度等规定。
- 参照完整性约束:是指两个表的主键字和外关键字的数据应一致,包装了表之间数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
- 用户自定义的完整性约束:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户自定义的完整性即是针对某个特定系数据库的约束条件,反映某一具体应用必须满足的语义要求。
在上述四种数据约束中,不属于关系模型定义的三种数据约束是域完整性约束。