> For the complete documentation index, see [llms.txt](https://lewiszlw.gitbook.io/notebooks/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lewiszlw.gitbook.io/notebooks/blogs/history/guan-xi-shu-ju-ku.md).

# 关系数据库

## 关系数据结构及形式化定义

### 关系

关系模型的数据结构非常简单，只包含单一的数据结构——关系。在用户看来，关系模型中数据的逻辑结构是一张扁平的二维表。

#### 域

\*\*域（domain）\*\*是一组具有相同数据类型的值的集合。例如，自然数、长度小于25字节的字符串集合、{男，女}等都可以是域。

#### 笛卡尔积

给定一组域D1，D2，...，Dn，允许其中某些域是相同的，D1，D2，...，Dn的笛卡尔积为D1×D2×...×Dn={(d1,d2,...,dn)|di∈Di,i=1,2,...,n}。其中，每一个元素(d1,d2,...,dn)叫作一个n元组，或简称元组。元组中的每一个值di叫作一个**分量**。 一个域允许的不同取值个数称为这个域的**基数**。

#### 关系

D1×D2×...×Dn的子集叫做在域D1，D2，...，Dn上的**关系**，表示为R(D1，D2，...，Dn)。这里R表示关系的名字，n是关系的**目**或**度**。 若关系中的某一属性组的值能唯一地标识一个元组，而其子集不能，则称该属性组为**候选码**。若一个关系有多个候选码，则选定其中一个为主码。候选码的诸属性称为主属性。不包含在任何候选码中的属性称为非主属性或非码属性。 关系可以有三种类型：基本关系（又称基本表或基表）、查询表和视图表。其中，基本表是实际存在的表，它是实际存储数据的逻辑表示；查询表是查询结果对应的表；视图表是由基本表或其他视图表导出的表，是虚表，不对应实际存储的数据。 基本关系具有以下6条性质： 1.列是同质的，即每一列中的分量是同一类型的数据，来自同一个域。 2.不同的列可出自同一个域，称其中的每一列为一个属性，不同的属性要给予不同的属性名。 3.列的顺序无所谓，即列的次序可以任意交换。 4.任意两个元组的候选码不能取相同的值。 5.行的顺序无所谓，即行的次序可以任意交换。 6.分量必须取原子值，即每一个分量都必须是不可分的数据项。

### 关系模式

关系的描述称为**关系模式**。它可以形式化地表示为R(U,D,DOM,F)。其中R为关系名，U为组成该关系的属性名集合，D为U中属性所来自的域，DOM为属性向域的映像集合，F为属性间数据的依赖关系集合。域名及属性向域的映像常常直接说明为属性的类型、长度。

### 关系数据库

关系数据库的型也称为关系数据库模式，是对关系数据库的描述。 关系数据库的值是这些关系模式在某一时刻对应的关系的集合，通常就成为关系数据库。

### 关系模型的存储结构

在关系数据库的物理组织中，有的关系数据库管理系统中一个表对应一个操作系统文件，将物理数据组织交给操作系统完成；有的关系数据库管理系统从操作系统那里申请若干个大的文件，自己划分文件空间，组织表、索引等存储结构，并进行存储管理。

## 关系操作

### 基本的关系操作

关系模型中常用的关系操作包括查询操作和插入、删除、修改操作两大部分。查询操作又可以分为选择、投影、连接、除、并、差、交、笛卡尔积等。其中选择、投影、并、差、笛卡尔积是5中基本操作。 关系操作的特点是集合操作方式，即操作的对象和结果都是集合。

### 关系数据语言的分类

早期的关系操作能力通常用代数方式或逻辑方式来表示，分别称为**关系代数**和**关系演算**。关系代数用关系的运算来表达查询要求，关系演算则用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为**元组关系演算**和**域关系演算**。 另外，还有一种介于关系代数和关系演算之间的**结构化查询语言（Structured Query Language,SQL）**，是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言。 因此关系数据语言可以分为三类：关系代数语言、关系演算语言（元组关系演算语言、域关系演算语言）、具有关系代数和关系演算双重特定的语言（例如SQL）。

## 关系的完整性

关系模型中有三类完整性约束：**实体完整性**、**参照完整性**和**用户定义的完整性**。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件，被称作是**关系的两个不变性**，应该由关系系统自动支持。

### 实体完整性

实体完整性规则：若属性（指一个或一组属性）A是基本关系R的主属性，则A不能取空值。所谓空值就是“不知道”或“不存在”或“无意义”的值。 对于实体完整性规则说明如下：

* 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。
* 现实世界中的实体是可区分，即它们具有某种唯一性标识。
* 相应地，关系模型中以主码作为唯一性标识。
* 主码中的属性即主属性不能取空值。

### 参照完整性

设F是基本关系R的一个或一组属性，但不是关系R的码，Ks是基本关系S的主码。如果F和Ks相对应，则称F是R的外码，并称基本关系R为参照关系，基本关系S为被参照关系或目标关系。 参照完整性规则：若属性（或属性组）F是基本关系R的外码，它与基本关系S的主码Ks相对应（基本关系R和S不一定是不同的关系），则对于R中每个元组在F上的值必须：

* 或者取空值（F的每个属性值均为空值）；
* 或者等于S中某个元组的主码值。

### 用户定义的完整性

不同的关系数据库系统根据其应用环境的不同，往往还需要一些特殊的约束条件。

## 关系代数

关系代数是一种抽象的查询语言，它用对关系的运算来表达查询。关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。

### 传统的集合运算

传统的集合运算是二目运算，包括并、差、交、笛卡尔积4种运算。

### 专门的关系运算

专门的关系运算包括选择、投影、连接、除运算等。

#### 选择

选择又称为限制。它是在关系R中选择满足给定条件的诸元组，记作σF(R)={t|t∈R∧F(t)='真'}。其中F表示选择条件，它是一个逻辑表达式，取逻辑值“真”或“假”。

#### 投影

关系R上的投影是从R中选择出若干属性列组成新的关系。记作∏A(R)={t\[A]|t∈R}。其中A为R中的属性列。

#### 连接

连接也称为θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。连接运算中有两种最为重要也最为常用的连接，一种是**等值连接**，另一种是**自然连接**。θ为“=”的连接运算称为等值连接，它是从关系R和S的笛卡尔积中选取A、B属性值相等的那些元组。自然连接是一种特殊的等值连接，它要求两个关系中进行比较的分量必须是同名的属性组，并且在结果中把重复的属性列去掉。 两个关系R和S在做自然连接时，选择两个关系在公共属性上值相等的元组构成新的关系。此时，关系R中某些元组有可能在S中不存在公共属性上值相等的元组，从而造成R中这些元组在操作时被舍弃了，同样，S中某些元组也可能被舍弃。这些被舍弃的元组称为**悬浮元组**。 如果把悬浮元组也保存在结果关系中，而在其他属性上填空值NULL，那么这种连接就叫做**外连接**；如果只保留左边关系R中的悬浮元组就叫做**左外连接**；如果只保留右边关系S中的悬浮元组就叫做**右外连接**。

#### 除运算

设关系R除以关系S的结果为关系T，则T包含所有在R但不在S中的属性及其值，且T的元组与S的元组的所有组合都在R中。

在8种关系代数运算，其中并、差、笛卡尔积、选择、投影这5种运算为基本的运算。其他3种运算均可以用这5中基本运算来表达。

> 《数据库系统概论（第5版）》王珊 萨师煊 著
