第0章 脚手架
0.1 写在前面
本学习笔记的主要用途,是来回顾数据库的一些基本理论知识和SQL语句。
学习笔记的主要参考文献,为王珊著的《数据库系统概论》(第5版,2014)和教育部考试中心出版的《全国计算机等级考试三级教程——数据库技术》(2022年版),其中以王珊著的《数据库系统概论》为主要架构。其他具体内容可能会涉及到的其他资料和文章,我会附在相应小节的最后。
相对应地,我也会选择并写出一些自己实践过程中遇到的bug和问题,并附带相应的解决方法。
首次撰写博客,如有不足之处还望批评指正。
0.2 《数据库系统概论》的大致架构介绍
在《数据库系统概论》一书中,作者将全书分为了四个大的篇章,分别是:
第一篇 基础篇
第二篇 设计与应用开发篇
第三篇 系统篇
第四篇 新技术篇
其中,第一篇在介绍类型各异的数据库的基础上,详细介绍了关系型数据库的基础内容,及其标准语言SQL(Structured Query Language,结构化查询语言)的许多操作实例,并在之后讲述了数据库的安全性和完整性。
第二篇是数据库设计开发的关键内容,包括了关系数据理论、数据库设计和数据库编程部分。关系数据理论是数据库设计开发的基础。数据库设计是一个全流程的设计过程,从需求分析开始,到数据库的实施和维护的循环。数据库编程(SQL编程技术)则可以有效克服SQL语言实现复杂应用方面的不足,提高应用系统和数据库管理系统间的互操作性。
第三篇主要是前两篇内容基础上的一个提高。关系查询处理和查询优化、数据库恢复技术与并发控制,都是在实际使用数据库的过程中需要不断改进的。数据库管理系统则将上述功能综合起来,形成了一个更加严谨的系统。
第四篇则在讲述数据库的发展历史的基础上,针对NoSQL、内存数据库、数据仓库与联机分析处理技术等方面进行了介绍,并联系了目前的大数据时代的新格局。
0.3 《全国计算机等级考试三级教程——数据库技术》的大致架构介绍
与0.2节中参考书的体例不同,该教程的体例更多从数据库的全流程设计过程入手,按不同阶段安排了不同的内容,也介绍了0.2节内容之外的其他部分知识。但内容在大体上是类似的。
该书的目录如下所示:
第1章 数据库应用系统开发方法
第2章 需求分析
第3章 数据库结构设计
第4章 数据库应用系统功能设计与实施
第5章 UML与数据库应用系统
第6章 高级数据查询
第7章 数据库及数据库对象
第8章 数据库后台编程技术
第9章 安全管理
第10章 数据库运行维护与优化
第11章 故障管理
第12章 备份与恢复数据库
第13章 大规模数据库架构
第14章 数据仓库与数据挖掘
附录4 系统提供的常用函数
第1章 绪论
1.0 本章内容
本章初步讲解数据库的基本概念,介绍数据类型的组成要素和常用的数据模型、数据库系统的三级模式结构和数据库系统的主要组成部分。
1.1 数据库的4个基本概念
数据、数据库、数据库管理系统和数据库系统是与数据库技术密切相关的4个基本概念。
1.数据
描述事物的符号记录称为数据。数据有多种表现形式,它们都可以经过数字化后存入计算机。
数据的表现形式还不能完全表达其内容,需要经过解释。数据和关于数据的解释是不可分的。数据的含义称为数据的语义,数据与其语义是不可分的。
记录是计算机中表示和存储数据的一种格式或一种方法。
2.数据库(Database,DB)
严格地讲,数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
概括地讲,数据库存储具有永久存储、有组织和可共享三个基本特点。
3.数据库管理系统(Database Management System,DBMS)
数据库管理系统是位于用户与操作系统之间的一层数据管理软件。数据库管理系统和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统。
DBMS的主要功能包括:
(1)数据定义功能:DBMS提供数据定义语言(Data Definition Language,DDL),用户通过它可以方便地对数据库中的数据对象的组成与结构进行定义。
(2)数据组织、存储和管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存储路径等。要确定以何种文件结构和存取方式在存储级上组织这些数据,如何实现数据之间的联系。
数据组织和存储的基本目标是提高存储空间利用率和方便存取,提供多种存取方法(如索引查找、hash查找、顺序查找等)来提高存取效率。
(3)数据操纵功能:DBMS还提供数据操纵语言(Data Manipulation Language,DML),用户可以使用它操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等。
(4)数据库的事务管理和运行管理:保证事务的正确运行,保证数据的安全性、完整性、多用户对数据的并发使用及发生故障的系统恢复。
(5)数据库的建立和维护功能:包括数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。
(6)其他功能:包括DBMS与网络中其他软件系统的通信功能,一个DBMS与另一个DBMS或文件系统的数据转换功能,异构数据库之间的互访和互操作功能等。
4.数据库系统(Database System,DBS)
数据库系统是由数据库、DBMS(及其应用开发工具)、应用程序和数据库管理员(Database Administrator,DBA)组成的存储、管理、处理和维护数据的系统。
数据库的建立、使用和维护等工作只靠一个DBMS远远不够,还要有专门的人员来完成,这些人被称为数据库管理员。
数据库系统可以用图1.1表示。其中,DB提供数据的存储功能,DBMS提供数据的组织、存取、管理和维护等基础功能,数据库应用系统根据应用需求使用数据库,DBA负责全面管理DBS。图1.2是引入数据库后计算机系统的层次结构。
在一般不引起混淆的情况下,人们常把数据库系统简称为数据库。
![](https://i-blog.csdnimg.cn/blog_migrate/176b10d78669fe6b341296fca8082426.png)
1.2 数据管理三个阶段的比较
人工管理阶段 |
文件系统阶段 |
数据库系统阶段 |
||
背景 |
应用背景 |
科学计算 |
科学计算、数据管理 |
大规模数据管理 |
硬件背景 |
无直接存取存储设备 |
磁盘、磁鼓 |
大容量磁盘、磁盘阵列 |
|
软件背景 |
没有操作系统 |
有文件系统 |
有数据库管理系统 |
|
处理方式 |
批处理 |
联机实时处理、批处理 |
联机实时处理、分布处理、批处理 |
|
特点 |
数据的管理者 |
用户(程序员) |
文件系统 |
数据库管理系统 |
数据面向的对象 |
某一应用程序(应用程序与数据之间一一对应) |
某一应用 |
现实世界(一个部门、企业、跨国组织等) |
|
数据的共享程度 |
无共享,冗余度极大 |
共享性差,冗余度大 |
共享性高,冗余度小 |
|
数据的独立性 |
不独立,完全依赖于程序 |
独立性差 |
具有高度的物理独立性和一定的逻辑独立性 |
|
数据的结构化 |
无结构 |
记录内有结构、整体无结构 |
整体结构化,用数据模型描述 |
|
数据控制能力 |
应用程序自己控制 |
应用程序自己控制 |
由DBMS提供数据安全性、完整性、并发控制和恢复能力 |
从文件系统到数据库系统标志着数据管理技术的飞跃。
1.3 数据库系统的特点
1.数据结构化
数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别。
所谓“整体”结构化是指数据库中的数据不再仅仅针对某一个应用,而是面向整个组织或企业;不仅数据内部是结构化的,而且整体是结构化的,数据之间是具有联系的。
数据库系统中,不仅数据是整体结构化的,而且存取数据的方式也很灵活,可以存取数据库中的某一个或一组数据项、一个记录或一组记录;而在文件系统中,数据的存取单位是记录,粒度不能细到数据项。
2.数据库的共享性高、冗余度低且易扩充
数据库系统从整体角度看待和描述数据,数据不再面向某个应用而是面向整个系统,因此数据可以被多个用户、多个应用共享使用。数据共享可以大大减少数据冗余,节约存储空间。数据共享还能避免数据之间的不相容性与不一致性。
所谓数据的不一致性是指同一数据不同副本的值不一样。在数据库中,数据共享减少了由于数据冗余造成的不一致现象。
由于数据面向整个系统,是有结构的数据,不仅可以被多个应用共享使用,而且容易增加新的应用,这就使得数据库系统弹性大,易于扩充,可以适应各种用户的要求。可以选取整体数据的各子集用于不同的应用系统,当应用需求改变或增加时,只要重新选取不同的自己或加上一部分数据便可以满足新的需求。
3.数据独立性高
数据独立性是借助数据库管理数据的一个显著优点,它已成为数据库领域中一个常用术语和重要概念,包括数据的物理独立性和逻辑独立性。数据独立性是由DBMS提供的二级映像功能来保证的。
物理独立性是指用户的应用程序与数据库中数据的物理存储是相互独立的。用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变时应用程序不用改变。
逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。也就是说,数据的逻辑结构改变时,用户程序也可以不变。
4.数据由数据库管理系统统一管理和控制
数据库的共享会带来数据库的安全隐患,而数据库的共享是并发的共享,这又会带来不同用户间相互干扰的隐患。另外,数据库中数据的正确与一致也必须得到保障。
(1)数据的安全性保护:数据的安全性是指保护数据以防不合法使用造成的数据泄密和破坏。每个用户只能按规定对某些数据以某些方式进行使用和处理。
(2)数据的完整性检查:数据的完整性指数据的正确性、有效性和相容性。完整性检查将数据控制在有效的范围内,并保证数据之间满足一定的关系。
(3)并发控制:当多个用户的并发进程同时存取、修改数据库时,可能会发生互相干扰而得到错误的结果或使得数据库的完整性遭到破坏,因此必须对多用户的并发操作加以控制和协调。
(4)数据库恢复:计算机系统的硬件故障、软件故障、操作员的失误以及故意破坏也会影响数据库中数据的正确性,甚至造成数据库部分或全部数据的丢失。数据库管理系统必须具有将数据库从错误状态恢复到某一已知的正确状态(亦称为完整状态或致状态)的功能,这就是数据库的恢复功能。
5.总结
综上所述,数据库是长期存储在计算机内有组织、大量、共享的数据集合。它可以供各种用户共享,具有最小冗余度和较高的数据独立性。数据库管理系统在数据库建立、运用和维护时对数据库进行统一控制,以保证数据的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复。
数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心的新阶段。这样既便于数据的集中管理,又能简化应用程序的研制和维护,提高了数据的利用率和相容性,提高了决策的可靠性。
1.4 数据模型
数据模型也是一种模型,它是对现实世界数据特征的抽象。数据模型是数据库系统的核心和基础。
1.两类数据模型
开发实施数据库应用系统中也需要使用不同的数据类型:概念模型、逻辑模型和物理模型。
根据模型应用的不同目的,可以将这些模型划分为两大类,它们分别属于两个不同的层次。第一类是概念模型,第二类是逻辑模型和物理模型。
第一类概念模型,也称为信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。
第二类中,逻辑模型主要包括层次模型、网状模型、关系模型、面向对象数据类型和对象关系数据模型、半结构化数据模型等。它按照计算机系统的观点对数据建模,主要用于数据库管理系统的实现;物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法,是面向计算机系统的。数据库设计人员要了解和选择物理模型,最终用户则不必考虑物理级的细节。
2.概念模型
概念模型用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言,因此概念模型一方面应该具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识,另一方面它还应该简单、清晰、易于用户理解。
· 信息世界中的基本概念
(1)实体:客观存在并可以相互区别的事物称为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联系。
(2)属性:实体所具有的某一特性成为属性。一个实体可以由若干个属性来刻画。
(3)码:唯一标识实体的属性集称为码。
(4)实体型:具有相同属性的实体必然具有共同的特征和性质。用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。例如,学生(学号,姓名)就是一个实体型。
(5)实体集:同一类型实体的集合称为实体集。例如,全体学生就是一个实体集。
(6)联系:实体内部的联系通常是指组成实体的各属性之间的联系,实体之间的联系通常是指不同实体集之间的联系。
实体之间的联系有一对一、一对多和多对多等多种类型。
如果对于实体集 A中的每一个实体, 实体集B中至多有一个 (也可以没有) 实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系。
如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系。
如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中也有m个实体(m≥0)与之联系,则称实体集A与实体集B具有多对多联系。例如一门课程可以同时有若干名学生选修,而一个学生可以同时选修多门课程,则课程实体与学生实体具有多对多联系。
· 概念模型的一种表示方法:实体-联系方法
概念模型是对信息世界建模,所以概念模型应该能够方便、准确地表示出上述信息世界中的常用概念。概念模型的表示方法很多,其中最为常用的是P.P.S.Chen于1976年提出的实体联系方法(Entity-Relationship approach)。该方法用E-R图(E-R diagram)来描述现实世界的概念模型,E-R方法也称为E-R模型。
3.数据模型的组成要素
数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。
· 数据结构
数据结构描述数据库的组成对象以及对象之间的关系。
数据结构描述的内容有两类:一类是与对象的类型、内容、性质有关的,如网状模型中的数据项、记录,关系模型中的域、属性、关系等;一类是与数据之间联系有关的对象,如网状模型中的系型(set type)。
数据结构是刻画一个数据模型性质最重要的方面。因此在数据库系统中,人们通常按照其数据结构的类型来命名数据模型。例如层次结构、网状结构和关系结构的数据模型分别命名为层次模型、网状模型和关系模型。
总之,数据结构是所描述的对象类型的集合,是对系统静态特性的描述。
· 数据操作
数据操作是指对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则。
数据库主要有查询和更新(包括插入、删除、修改)两大类操作。数据模型必须定义这些操作的确切含义、操作符号、操作规则(如优先级)以及实现操作的语言。
数据操作是对系统动态特性的描述。
· 数据的完整性约束条件
数据的完整性约束条件是一组完整性规则。完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态及其状态的变化,以保证数据的正确、有效和相容。
数据模型应该反映和规定其必须遵守的基本的和通用的完整性约束条件。例如,在关系模型中,任何关系必须满足实体完整性和参照完整性两个条件。
此外,数据模型还应该提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件。
4.常用的数据模型
数据库领域中主要的逻辑数据模型有:
层次模型
网状模型
关系模型
面向对象数据模型
对象关系数据模型
半结构化数据模型
其中,层次模型和网状模型统称为格式化模型。格式化模型的数据库系统在20世纪70年代至80年代初非常流行,在数据库系统产品中占据了主导地位,但现在已经逐渐被关系模型的数据库系统取代。
20世纪80年代以来,面向对象的方法和技术在计算机各个领域,包括程序设计语言、软件工程、信息系统设计、计算机硬件设计等方面都产生了深远的影响,也促进数据库中面向对象数据模型的研究和发展。许多关系数据库厂商为了支持面向对象模型,对关系模型做了扩展,从而产生了对象关系数据模型。
随着Internet的迅速发展,Web上各种半结构化、非结构化数据源已经成为重要的信息来源,产生了以XML为代表的半结构化数据模型和非结构化数据模型。
在格式化模型中,实体用记录表示,实体的属性对应记录的数据项(或字段)。实体之间的联系在格式化模型中转换成记录之间的两两联系。
在格式化模型中,数据结构的单位是基本层次联系,即两个记录及其它们之间的一对多(包括一对一)的联系。联系的始点称为双亲结点,联系的重点称为子女结点。
5.层次模型
层次模型是数据库系统中最早出现的数据模型,层次数据库系统采用层次模型作为数据的组织方式。层次数据库系统的典型代表是IBM公司的IMS (Information ManagementSystem),这是1968年IBM公司推出的第一个大型商用数据库管理系统,曾经得到广泛的使用。
层次模型用树形结构来表示各类实体以及实体间的联系。现实世界中许多实体之间的联系本来就呈现出一种很自然的层次关系,如行政机构、家族关系等。
(1)层次模型的数据结构
在数据库中,定义满足下面两个条件的基本层次联系的集合为层次模型:
(1)有且只有一个结点没有双亲结点,这个结点称为根结点;
(2)根以外的其他结点有且只有一个双亲结点。
在层次模型中,每个结点表示一个记录类型,记录类型之间的联系用结点之间的连线(有向边)表示,这种联系是父子之间的一对多的联系。这就使得层次数据库系统只能处理一对多的实体联系。
每个记录类型可包含若干个字段,这里记录类型描述的是实体,字段描述实体的属性。各个记录类型及其字段都必须命名。各个记录类型、同记录类型中各个字段不能同名。每个记录类型可以定义一个排序字段,也称为码字段,如果定义该排序字段的值是唯一的,则它能唯一地标识 一个记录值。
一个层次模型在理论上可以包含任意有限个记录类型和字段,但任何实际的系统都会因为存储容量或实现复杂度而限制层次模型中包含的记录类型个数和字段的个数。
层次模型像一棵倒立的树,结点的双亲是唯一的。
层次模型的一个基本的特点是,任何一个给定的记录值只能按其层次路径查看,没有一个子女记录值能够脱离双亲记录值而独立存在。
(2)层次模型的数据操纵与完整性约束
层次模型的数据操纵主要有查询、插入、删除和更新。 进行插入、删除、更新操作时要满足层次模型的完整性约束条件。
进行插入操作时,如果没有相应的双亲结点值就不能插入它的子女结点值;进行删除操作时,如果删除双亲结点值,则相应的子女结点值也将被同时删除。
(3)层次模型的优缺点
层次模型的优点主要有:
(1)层次模型的数据结构比较简单清晰。
(2)层次数据库的查询效率高。因为层次模型中记录之间的联系用有向边表示,这种联系在DBMS中常常用指针来实现。因此这种联系也就是记录之间的存取路径。当要存取某个结点的记录值,DBMS就沿着这一.条路径很快找到该记录值,所以层次数据库的性能优于关系数据库,不低于网状数据库。
(3)层次数据模型提供了良好的完整性支持。
可见,用层次模型对具有一对多的层次联系的部门描述非常自然、直观,容易理解。这是层次数据库的突出优点。
层次模型的缺点主要有:
(1)现实世界中很多联系是非层次性的,如结点之间具有多对多联系,不适合用层次模型表示。
(2)如果一个结点具有多个双亲结点等,用层次模型表示这类联系就很笨拙,只能通过引入冗余数据(易产生不一致性)或创建非自然的数据结构(引入虚拟结点)来解决。对插入和删除操作的限制比较多,因此应用程序的编写比较复杂。
(3)查询子女结点必须通过双亲结点。
(4)由于结构严密,层次命令趋于程序化。
6.网状模型
在现实世界中事物之间的联系更多的是非层次关系,用层次模型表示非树形结构是很不直接的,网状模型则可以克服这一弊病。
网状数据库系统采用网状模型作为数据的组织方式。网状数据模型的典型代表是DBTG系统,亦称为CODASYL系统。
(1)网状模型的数据结构
在数据库中,把满足以下两个条件的基本层次联系集合称为网状模型:
(1)允许一个以上的结点无双亲;
(2)一个结点可以有多于一个的双亲。
网状模型是一种比层次模型更具普遍性的结构。它去掉了层次模型的两个限制,允许多个结点没有双亲结点,允许结点有多个双亲结点:此外它还允许两个结点之间有多种联系(称之为复合联系)。因此,网状模型可以更直接地去描述现实世界。而层次模型实际上是网状模型的一个特例。
与层次模型一样,网状模型中每个结点表示一个记录类型(实体),每个记录类型可包含若干个字段(实体的属性),结点间的连线表示记录类型(实体)之间一对多的父子联系。
从定义可以看出,层次模型中子女结点与双亲结点的联系是唯一的,而在网状模型中这种联系可以不唯一。因此要为每个联系命名,并指出与该联系有关的双亲记录和子女记录。
(2)网状模型的数据操纵与完整性约束
网状模型一般来说没有层次模型那样严格的完整性约束条件,但具体的网状数据库系统对数据操纵都加了一些限制,提供了一定的完整性约束。
例如,DBTG在模式数据定义语言中提供了定义DBTG数据库完整性的若干概念和语句,主要有:
(1)支持记录码的概念,码即唯一标识记录的数据项的集合。例如,学生记录(如图1.13)中学号是码,因此数据库中不允许学生记录中学号出现重复值。
(2)保证一个联系中双亲记录和子女记录之间是一对多的联系。
(3)可以支持双亲记录和子女记录之间的某些约束条件。例如,有些子女记录要求双亲记录存在才能插入,双亲记录删除时也连同删除。DBTG提供了“属籍类别”的概念来描述这类约束条件。
(3)网状模型的优缺点
网状模型的优点主要有:
(1)能够更为直接地描述现实世界,如一个结点可以有多个双亲,结点之间可以有多种联系。
(2)具有良好的性能,存取效率较高。
网状模型的缺点主要有:
(1)结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握。
(2)网状模型的DDL、DML复杂,并且要嵌入某一种高级语言(如COBOL、C)中。用户不容易掌握,不容易使用。
(3)由于记录之间的联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径,因此用户必须了解系统结构的细节,加重了编写应用程序的负担。
7.关系模型
(1)关系模型的数据结构
关系模型与以往的模型不同,它是建立在严格的数学概念的基础上的。从用户观点看,关系模型由一组关系组成。每个关系的数据结构是一张规范化的二维表。
关系:一个关系对应通常说的一张表。
元组:表中的一行即为一个元组。
属性:表中的一列即为一个属性,给每一个属性起一个名称即属性名。
码:也称为码键。表中的某个属性组,它可以唯一确定一个元组。
域:域是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。例如,性别的域为(男,女)。
分量:元组中的一个属性值。
关系模式:对关系的描述,一般表示为:关系名(属性1,属性2,…,属性n)。
关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件,这些规范条件中最基本的一条就是,关系的每一个分量必须是一个不可分的数据项。也就是说,不允许表中还有表。
关系术语与一般表格中的术语的对应关系如下所示:
关系数据 |
一般标格的术语 |
关系名 |
表名 |
关系模式 |
表头(表格的描述) |
关系 |
(一张)二维表 |
元组 |
记录或行 |
属性 |
列 |
属性名 |
列名 |
属性值 |
列值 |
分量 |
一条记录中的一个列值 |
非规范关系 |
表中有表(大表中嵌有小表) |
(2)关系模型的数据操纵与完整性约束
关系模型的数据操纵主要包括查询、插入、删除和更新数据。这些操作必须满足关系的完整性约束条件。关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性。
关系模型中的数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合,而不像格式化模型中那样是单记录的操作方式。另方面,关系模型把存取路径向用户隐蔽起来,用户只要指出“干什么”或“找什么”,不必详细说明“怎么干”或“怎么找”,从而大大地提高了数据的独立性,提高了用户生产率。
(3)关系模型的优缺点
关系模型具有下列优点:
(1)关系模型与格式化模型不同,它是建立在严格的数学概念的基础上的。
(2)关系模型的概念单一。无论实体还是实体之间的联系都用关系来表示。对数据的检索和更新结果也是关系(即表)。所以其数据结构简单、清晰,用户易懂易用。
(3)关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。
所以关系模型诞生以后发展迅速,深受用户的喜爱。
当然,关系模型也有缺点,例如,由于存取路径对用户是隐蔽的,查询效率往往不如格式化数据模型。为了提高性能,数据库管理系统必须对用户的查询请求进行优化,因此增加了开发数据库管理系统的难度。不过用户不必考虑这些系统内部的优化技术细节。
1.5 数据库系统的结构
考察数据库系统的结构可以有多种不同的层次或不同的角度。从数据库应用开发人员角度看,数据库系统通常采用三级模式结构,这是数据库系统内部的系统结构。从数据库最终用户角度看,数据库系统的结构分为单用户结构、主从式结构、分布式结构、客户-服务器、浏览器应用服务器/数据库服务器多层结构等。这是数据库系统外部的体系结构。
本节介绍数据库系统的模式结构。
1.数据库系统模型的概念
在数据模型中有“型”(type)和“值”(value)的概念。型是指对某一类数据的结构和属性的说明,值,是型的一个具体赋值。
模式(schema)是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不涉及具体的值。模式的一个具体值称为模式的一个实例(instance)。同一个模式可以有很多实例。模式是相对稳定的,而实例是相对变动的,因为数据库中的数据是在不断更新的。模式反映的是数据的结构及其联系,而实例反映的是数据库某一时刻的状态。
虽然实际的数据库管理系统产品种类很多,它们支持不同的数据模型,使用不同的数据库语言,建立在不同的操作系统之上,数据的存储结构也各不相同,但它们在体系结构上通常都具有相同的特征,即采用三级模式结构(早期微机上的小型数据库系统除外)并提供两级映像功能。
2.数据库系统的三级模式结构
数据库系统的三级模式结构是指数据库系统由外模式、模式和内模式三级构成。
(1)模式
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。它是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,又与具体的应用程序、所使用的应用开发工具及高级程序设计语言无关。
模式实际上是数据库数据在逻辑级上的视图。一个数据库只有一个模式。数据库模式以某一种数据模型为基础,统综合地考虑了所有用户的需求,并将这些需求有机地结合成一个逻辑整体。定义模式时不仅要定义数据的逻辑结构,例如数据记录由哪些数据项构成,数据项的名字、类型、取值范围等;而且要定义数据之间的联系,定义与数据有关的安全性、完整性要求。
数据库管理系统提供模式数据定义语言(模式DDL)来严格地定义模式。
(2)外模式
外模式也称子模式(subschema)或用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
外模式通常是模式的子集。一个数据库可以有多个外模式。由于它是各个用户的数据视图,如果不同的用户在应用需求、看待数据的方式、对数据保密的要求等方面存在差异,则其外模式描述就是不同的。即使对模式中同一数据,在外模式中的结构、类型、长度、保密级别等都可以不同。另一方面,同一外模式也可以为某一用户的多个应用系统所使用,但一个应用程序只能使用一个外模式。
外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据是不可见的。
数据库管理系统提供外模式数据定义语言(外模式DDL)来严格地定义外模式。
(3)内模式
内模式也称存储模式(storage schema), 一个 数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。例如,记录的存储方式是堆存储还是按照某个(些)属性值的升(降)序存储,或按照属性值聚簇(cluster) 存储;索引按照什么方式组织,是B+树索引还是hash索引;数据是否压缩存储,是否加密;数据的存储记录结构有何规定,如定长结构或变长结构,一个记录不能跨物理页存储;等等。
3.数据库的二级映像功能与数据独立性
数据库系统的三级模式是数据的三个抽象级别,它把数据的具体组织留给数据库管理系统管理,使用户能逻辑地、抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式。为了能够在系统内部实现这三个抽象层次的联系和转换,数据库管理系统在这三级模式之间提供了两层映像:外模式/模式映像和模式/内模式映像。
正是这两层映像保证了数据库系统中的数据能够具有较高的逻辑独立性和物理独立性。
(1)外模式/模式映像
模式描述的是数据的全局逻辑结构,外模式描述的是数据的局部逻辑结构。对应于同一个模式可以有任意多个外模式。对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了该外模式与模式之间的对应关系。这些映像定义通常包含在各自外模式的描述中。
当模式改变时(例如增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
(2)模式/内模式映像
数据库中只有一个模式,也只有一个内模式,所以模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。例如,说明逻辑记录和字段在内部是如何表示的。该映像定义通常包含在模式描述中。当数据库的存储结构改变时(例如选用了另一种存储结构),由数据库管理员对模式/内模式映像作相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性。
在数据库的三级模式结构中,数据库模式即全局逻辑结构是数据库的中心与关键,它独立于数据库的其他层次。因此设计数据库模式结构时应首先确定数据库的逻辑模式。
数据库的内模式依赖于它的全局逻辑结构,但独立于数据库的用户视图,即外模式,也独立于具体的存储设备。它是将全局逻辑结构中所定义的数据结构及其联系按照一定的物理存储策略进行组织,以达到较好的时间与空间效率。
数据库的外模式面向具体的应用程序,它定义在逻辑模式之上,但独立于存储模式和存储设备。当应用需求发生较大变化,相应的外模式不能满足其视图要求时,该外模式就得做相应改动,所以设计外模式时应充分考虑到应用的扩充性。
特定的应用程序是在外模式描述的数据结构上编制的,它依赖于特定的外模式,与数据库的模式和存储结构独立。不同的应用程序有时可以共用同一个外模式。数据库的二级映像保证了数据库外模式的稳定性,从而从底层保证了应用程序的稳定性,除非应用需求本身发生变化,否则应用程序一般不需要修改。
数据与程序之间的独立性使得数据的定义和描述可以从应用程序中分离出去。另外,由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。
1.6 数据库系统的组成
1.硬件平台及数据库
由于数据库系统的数据量都很大,加之数据库管理系统丰富的功能使得其自身的规模也很大,因此整个数据库系统对硬件资源提出了较高的要求,这些要求是:
(1)要有足够大的内存,存放操作系统、数据库管理系统的核心模块、数据缓冲区和应用程序。
(2)有足够大的磁盘或磁盘阵列等设备存放数据库,有足够大的磁带(或光盘)作数据备份。
(3)要求系统有较高的通道能力,以提高数据传送率。
2.软件
数据库系统的软件主要包括:
(1)数据库管理系统。数据库管理系统是为数据库的建立、使用和维护配置的系统软件。
(2)支持数据库管理系统运行的操作系统。
(3)具有与数据库接口的高级语言及其编译系统,便于开发应用程序。
(4)以数据库管理系统为核心的应用开发工具。应用开发工具是系统为应用开发人员和最终用户提供的高效率、多功能的应用生成器、第四代语言等各种软件工具。它们为数据库系统的开发和应用提供了良好的环境。
(5)为特定应用环境开发的数据库应用系统。
3.人员
开发、管理和使用数据库系统的人员主要包括数据库管理员、系统分析员和数据库设计人员、应用程序员和最终用户。不同的人员涉及不同的数据抽象级别,具有不同的数据视图,如图1.17所示。这些人员分别包括如下职责。
![](https://i-blog.csdnimg.cn/blog_migrate/0bc5a367f9d0dae93dc924c76159a152.png)
(1)数据库管理员
在数据库系统环境下有两类共享资源,一类是数据库,另一类是数据库管理系统软件。因此需要有专门的管理机构来监督和管理数据库系统。数据库管理员则是这个机构的一个(组)人员,负责全面管理和控制数据库系统。具体包括如下职责。
①决定数据库中的信息内容和结构。数据库中要存放哪些信息,数据库管理员要参与决策。因此,数据库管理员必须参加数据库设计的全过程,并与用户、应用程序员、系统分析员密切合作、共同协商,做好数据库设计。
②决定数据库的存储结构和存取策略。数据库管理员要综合各用户的应用要求,和数据库设计人员共同决定数据的存储结构和存取策略,以求获得较高的存取效率和存储空间利用率。
③定义数据的安全性要求和完整性约束条件。数据库管理员的重要职责是保证数据库的安全性和完整性。因此,数据库管理员负责确定各个用户对数据库的存取权限、数据的保密级别和完整性约束条件。
④监控数据库的使用和运行。数据库管理员还有一个重要职责就是监视数据库系统的运行情况,及时处理运行过程中出现的问题。比如系统发生各种故障时,数据库会因此遭到不同程度的破坏,数据库管理员必须在最短时间内将数据库恢复到正确状态,并尽可能不影响或少影响计算机系统其他部分的正常运行。为此,数据库管理员要定义和实施适当的后备和恢复策略,如周期性的转储数据、维护日志文件等。
⑤数据库的改进和重组、重构。数据库管理员还负责在系统运行期间监视系统的空间利用率、处理效率等性能指标,对运行情况进行记录、统计分析,依靠工作实践并根据实际应用环境不断改进数据库设计。不少数据库产品都提供了对数据库运行状况进行监视和分析的工具,数据库管理员可以使用这些软件完成这项工作。
另外,在数据运行过程中,大量数据不断插入、删除、修改,时间一长,数据的组织结构会受到严重影响,从而降低系统性能。因此,数据库管理员要定期对数据库进行重组织,以改善系统性能。当用户的需求增加和改变时,数据库管理员还要对数据库进行较大的改造,包括修改部分设计,即数据库的重构。
(2)系统分析员和数据库设计人员
系统分析员负责应用系统的需求分析和规范说明,要和用户及数据库管理员相结合,确定系统的硬件软件配置,并参与数据库系统的概要设计。
数据库设计人员负责数据库中数据的确定及数据库各级模式的设计。数据库设计人员必须参加用户需求调查和系统分析,然后进行数据库设计。在很多情况下,数据库设计人员就由数据库管理员担任。
(3)应用程序员
应用程序员负责设计和编写应用系统的程序模块,并进行调试和安装。
(4)用户
这里用户是指最终用户(end user)。最终用户通过应用系统的用户接口使用数据库。常用的接口方式有浏览器、菜单驱动、表格操作、图形显示、报表书写等。
最终用户可以分为如下三类。
①偶然用户。这类用户不经常访问数据库,但每次访问数据库时往往需要不同的数据库信息,这类用户一般是企业或组织机构的高中级管理人员。
②简单用户。数据库的多数最终用户都是简单用户,其主要工作是查询和更新数据库,一般都是通过应用程序员精心设计并具有友好界面的应用程序存取数据库。银行的职员、航空公司的机票预订工作人员、宾馆总台服务员等都属于这类用户。
③复杂用户。复杂用户包括工程师、科学家、经济学家、科学技术工作者等具有较高科学技术背景的人员。这类用户一般都比较熟悉数据库管理系统的各种功能,能够直接使用数据库语言访问数据库,甚至能够基于数据库管理系统的应用程序接口编制自己的应用程序。
第2章 关系数据库
本章系统讲解关系数据库的重要概念,包括关系模型和关系代数。
本书第2~6章、第8章和第9章将集中讨论关系数据库的有关问题。其中,第2章讲解关系模型的基本概念,即关系模型的数据结构、关系操作和关系的完整性:第3、4、5章介绍关系数据库标准语言SQL的数据定义、数据查询、数据更新、数据安全性和完整性控制等功能:第6章介绍关系数据理论,这是关系数据库的理论基础,也是关系数据库系统逻辑设计的工具;第8章介绍如何通过编程方法对关系数据库进行操纵;第9章讲解关系数据库查询处理和查询优化。
按照数据模型的三个要素,关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。下面将对这三部分内容进行分别介绍。其中2.1节讲解关系数据结构,包括关系的形式化定义及有关概念; 2.2节讲解关系操作;2.3节讲解关系的三类完整性约束;2.4节讲解关系代数,这是关系数据库系统中实现关系操作的一种语言;最后,在2.5节介绍关系演算。
2.1 关系数据结构及形式化定义
2.1.1 关系
关系模型的数据结构非常简单,只包含单一的数据结构——关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。
关系模型的数据结构描述出了现实世界的实体以及实体间的各种联系。也就是说,在关系模型中,现实世界的实体以及实体间的各种联系均用单一的结构模型,即关系来显示。
1.域(domain)
定义2.1 域是一组具有相同数据类型的值的集合。
2.笛卡尔积
笛卡尔积是域上的一种集合运算。
定义2.2 给定一组域D1, D2, .., Dn,允许其中某些域是相同的,这些域的笛卡尔积为
D1×D2×...×Dn = {(d1, d2, ..., dn)| di ∈ Di,i = 1,2,...,n }
其中,每一个元素(d1, d2, ..., dn)叫做一个n元组,或简称元组。元素中的每一个值di叫做一个分量。
一个域允许的不同取值个数称为这个域的基数。
若Di(i = 1,2,...,n)为有限集,其基数为mi(i = 1,2,...,n),则D1×D2×...×Dn的基数M为
M = ∏(n,i = 1)mi.
笛卡尔积可表示为一张二维表。表中的每行对应一个元组,表中的每一列的值来自一个域。
3.关系
定义2.3 D1×D2×...×Dn的子集叫做在域D1, D2, .., Dn上的关系,表示为R(D1, D2, .., Dn)。
这里R表示关系的名字,n是关系的目或度。
关系中的每个元素是关系中的元组,通常用t表示。
当n=1时,称该关系为单元关系(unary relation),或一元关系。当n=2时,称该关系为二元关系(binary relation)。
关系是笛卡儿积的有限子集,所以关系也是一张二维表,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了加以区分,必须对每列起一个名字,称为属性(attribute)。n目关系必有n个属性。
若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码(candidate key)。
若一个关系有多个候选码,则选定其中一一个 为主码( primary key)。
候选码的诸属性称为主属性(prime attribute)。不包含在任何候选码中的属性称为非主属性(non-prime attribute)或非码属性(non-key attribute)。
在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码,称为全码(all-key)。
一般来说,D1, D2, .. Dn的笛卡儿积是没有实际语义的,只有它的某个真子集才有实际含义。
关系可以有三种类型:基本关系(通常又称为基本表或基表)、查询表和视图表。其中,基本表是实际存在的表,它是实际存储数据的逻辑表示;查询表是查询结果对应的表;视图表是由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
按照定义2.2,关系可以是一个无限集合。由于组成笛卡儿积的域不满足交换律,所以按照数学定义,(d1, d2, .. dn)≠(d2, d1, ...,dn)。当关系作为关系数据模型的数据结构时,需要给予如下的限定和扩充。
(1)无限关系在数据库系统中是无意义的。因此,限定关系数据模型中的关系必须是有限集合。
(2)通过为关系的每个列附加一个属性名的方法取消关系属性的有序性,即(d1, d2,..,di, dj, .. dn)= (d1, d2,..,dj, di, .. dn)(i, j=1, 2, ... n)。
因此,基本关系具有以下6条性质。
(1)列是同质的(homogeneous),即每一列中的分量是同一类型的数据,来自同一个域。
(2)不同的列可出自同一一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名。
(3)列的顺序无所谓,即列的次序可以任意交换。由于列顺序是无关紧要的,因此在许多实际关系数据库产品中增加新属性时,永远是插至最后一列。
(4)任意两个元组的候选码不能取相同的值。
(5)行的顺序无所谓,即行的次序可以任意交换。
(6)分量必须取原子值,即每一个分量都必须是不可分的数据项。
关系模型要求关系必须是规范化(normalization)的,即要求关系必须满足一定的规范条件。这些规范条件中最基本的一条就是,关系的每一个分量必须是一个不可分的数据项。规范化的关系简称为范式(Normal Form, NF)。
注意:在许多实际关系数据库产品中,基本表并不完全具有这6条性质。例如,有的数据库产品仍然区分了属性顺序和元组的顺序。许多时候人们把元组称为记录,元组和记录是同一个概念。
2.1.2 关系模式
定义2.4 关系的描述称为 关系模式(relation schema)。它可以形式化地表示为
R(U, D, DOM, F),
其中R为关系名,U为组成该关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合。
属性间的数据依赖将在第6章讨论,本章中关系模式仅涉及关系名、各属性名、域名、属性向域的映像共4部分,即R(U, D, DOM)。
例如,在上面例子中,由于导师和研究生出自同一个域——人,所以要取不同的属性名,并在模式中定义属性向域的映像,即说明它们分别出自哪个域。
关系模式通常可以简记为R(U)或R(A1, A2,…,An),其中R为关系名,A1, A2,…,An为属性名。而域名及属性向域的映像常常直接说明为属性的类型、长度。
关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。例如,学生关系模式在不同的学年,学生关系是不同的。在实际工作中,人们常常把关系模式和关系都笼统地称为关系,这不难从上下文中加以区别,希望读者注意。
2.1.3 关系数据库
在关系模型中,实体以及实体间的联系都是用关系来表示的。例如导师实体、研究生实体、导师与研究生之间的一对多联系都可以分别用一个关系来表示。在一个给定的应用领域中,所有关系的集合构成一个关系数据库。
关系数据库也有型和值之分。关系数据库的型也称为关系数据库模式,是对关系数据库的描述。关系数据库模式包括若干域的定义,以及在这些域上定义的若干关系模式。
关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库。
2.1.4 关系模型的存储结构
我们已经知道,在关系数据模型中实体及实体间的联系都用表来表示,但表是关系数据的逻辑模型。在关系数据库的物理组织中,有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成;有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。
2.2 关系操作
2.2.1 基本的关系操作
关系模型中常用的关系操作包括查询(query)操作和插入(insert)、删除(delete)、修改操作两大部分。
关系的查询表达能力很强,是关系操作中最主要的部分。查询操作又可以分为选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(except)、交(intersection)、笛卡儿积等。其中选择、投影、并、差、笛卡儿积是5种基本操作,其他操作可以用基本操作来定义和导出,就像乘法可以用加法来定义和导出一样。
关系操作的特点是集合操作方式,即操作的对象和结果都是集合。这种操作方式也称为一次一集合(set-at-a-time) 的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time) 的方式。
2.2.2 关系数据语言的分类
早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数(relationalalgebra)和关系演算(relational calculus)。 关系代数用对关系的运算来表达查询要求,关系演算则用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。一个关系数据语言能够表示关系代数可以表示的查询,称为具有完备的表达能力,简称关系完备性。已经证明关系代数、元组关系演算和域关系演算三种语言在表达能力上是等价的,都具有完备的表达能力。
关系代数、元组关系演算和域关系演算均是抽象的查询语言,这些抽象的语言与具体的关系数据库管理系统中实现的实际语言并不完全样。 但它们能用作评估实际系统中查询语言能力的标准或基础。实际的查询语言除了提供关系代数或关系演算的功能外,还提供了许多附加功能,例如聚集函数(aggregation function)、 关系赋值、算术运算等,使得目前实际查询语言的功能十分强大。
另外,还有一种介于关系代数和关系演算之间的结构化查询语言(Structured QueryLanguage, SQL)。 SQL不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、数据定义语言、数据操纵语言和数据控制语言(Data Control Language, DCL)于一体的关系数据语言。它充分体现了关系数据语言的特点和优点,是关系数据库的标准语言。
因此,关系数据语言可以分为三类:
![](https://i-blog.csdnimg.cn/blog_migrate/72d3585bf51a27ab7702648acb5ad639.png)
特别地,SQL语言是一种高度非过程化的语言,用户不必请求数据库管理员为其建立特殊的存取路径,存取路径的选择由关系数据库管理系统的优化机制来完成。例如,在一个存储有几百万条记录的关系中查找符合条件的某一个或某一些记录,从原理上讲可以有多种查找方法。例如,可以顺序扫描这个关系,也可以通过某一种索引来查找。不同的查找路径(或者称为存取路径)的效率是不同的,有的完成某一个查询可能很快,有的可能极慢。关系数据库管理系统中研究和开发了查询优化方法,系统可以自动选择较优的存取路径,提高查询效率。
2.3 关系的完整性
关系模型的完整性规则是对关系的某种约束条件。也就是说,关系的值随着时间变化应该满足一些约束条件。这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束。
关系模型中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
2.3.1 实体完整性
关系数据库中每个元组应该是可区分的,是唯一的。这样的约束条件用实体完整性来保证。
规则2.1 实体完整性规则 若属性 (指一个或一组属性) A是基本关系R的主属性,则A不能取空值(null value)。所谓空值就是“不知道"或“不存在”或“无意义”的值。
例如,学生(学号,姓名,性别,专业号,年龄)关系中学号为主码,则学号不能取空值。
按照实体完整性规则的规定,如果主码由若干属性组成,则所有这些主属性都不能取空值。例如选修(学号,课程号,成绩)关系中,“学号、课程号”为主码,则“学号”和“课程号”两个属性都不能取空值。
对于实体完整性规则说明如下:
(1)实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。例如学生关系对应于学生的集合。
(2)现实世界中的实体是可区分的,即它们具有某种唯一性标识。例如每个学生都是独立的个体,是不一样的。
(3)相应地,关系模型中以主码作为唯性标识。
(4)主码中的属性即主属性不能取空值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。
2.3.2 参照完整性
现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用。先来看三个例子。
这三个例子说明关系与关系之间存在着相互引用、相互约束的情况。下面先引入外码的概念,然后给出表达关系之间相互引用约束的参照完整性的定义。
定义2.5 设F 是基本关系R的一个或一组属性,但不是关系R的码,Ks是基本关系S的主码。如果F与Ks相对应,则称F是R的外码(foreign key), 并称基本关系R为参照关系(referencing relation),基本关系S为被参照关系(referenced relation)或目标关系(target relation)。关系R和S不一定是不同的关系。
![](https://i-blog.csdnimg.cn/blog_migrate/7a9b70c1f353e87930953d1cdfe59663.png)
显然,目标关系S的主码Ks和参照关系R的外码F必须定义在同一个(或同一组)域上。
在例2.1中,学生关系的“专业号”属性与专业关系的主码“专业号”相对应,因此“专业号”属性是学生关系的外码。这里专业关系是被参照关系,学生关系为参照关系。
在例2.2中,选修关系的“学号”属性与学生关系的主码“学号”相对应:选修关系“课程号”属性与课程关系的主码“课程号”相对应,因此“学号”和“课程号”属性是选修关系的外码。这里学生关系和课程关系均为被参照关系,选修关系为参照关系。
在例2.3中,“班长”属性与本身的主码“学号”属性相对应,因此“班长”是外码。这里,学生关系既是参照关系也是被参照关系。
需要指出的是,外码并不一定要与相应的主码同名,如例2.3中学生关系的主码为学号,外码为班长。不过,在实际应用中为了便于识别,当外码与相应的主码属于不同关系时,往往给它们取相同的名字。
参照完整性规则就是定义外码与主码之间的引用规则。
规则2.2 参照完整性规则 若属性(或属性组) F是基本关系 R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须:
●或者取空值(F 的每个属性值均为空值);
●或者等于S中某个元组的主码值。
例如,对于例2.1,学生关系中每个元组的“专业号”属性只能取下面两类值:
●空值,表示尚未给该学生分配专业;
●非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中。即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”中的外码值。
参照完整性规则中,R与S可以是同一个关系。例如对于例2.3,按照参照完整性规则,“班长”属性值可以取两类值:
●空值,表示该学生所在班级尚未选出班长;
●非空值,这时该值必须是本关系中某个元组的学号值。
2.3.3 用户定义的完整性
任何关系数据库系统都应该支持实体完整性和参照完整性。这是关系模型所要求的。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一值、某个非主属性不能取空值等。例如,在例2.1的学生关系中,若按照应用的要求学生不能没有姓名,则可以定义学生姓名不能取空值;某个属性(如学生的成绩),的取值范围可以定义在0~ 100之间等。
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能。
在早期的关系数据库管理系统中没有提供定义和检验这些完整性的机制,因此需要应用开发人员在应用系统的程序中进行检查。例如在例2.2的选修关系中,每插入一条记录,必须在应用程序中写一段程序来检查其中的学号是否等于学生关系中的某个学号,并检查其中的课程号是否等于课程关系中的某个课程号。如果等于,则插入这一条选修记录,否则就拒绝插入,并给出错误信息。
2.4 关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括两类:集合运算符和专门的关系运算符,如表2.4所示。