You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

803 lines
26 KiB
Markdown

# 第一章 数据库概论
### 1.2 数据库的由来和发展
#### 1.2.2 文件系统阶段
文件系统的三个缺陷:
+ 数据冗余
+ 数据不一致
+ 数据联系弱
#### 1.2.3数据库阶段
数据库阶段的五个特点:
+ 采用数据模型表示复杂的数据结构
+ 有较高的数据独立性
+ 数据库系统为用户提供了方便的接口
+ 提供如下4个方面的数据控制功能
+ 数据库的恢复
+ 数据库的并发控制
+ 数据的完整性
+ 数据安全性
+ 增加了系统的灵活性
![数据库系统的结构](http://47.117.160.245:8080/pictrue/private/db_01.png)
> 数据库(Database, DB)。DB是长期储存在计算机内有组织的统一管理的**相关数据的集合**。DB能为各种用户共享具有较小冗余度、数据间联系紧密而又有较高的数据独立性等特点。
> 数据库管理系统(Database Management System, DBMS)。DBMS是位于用户与操作系统(OS)之间的一层**数据管理软件**。它为用户或应用程序提供访问DB的方法包括DB的建立查询更新以及各种数据控制。
DBMS可分为
+ 层次型
+ 网状型
+ 关系型
+ 面向对象型
+ etc.
> 数据库系统(Database System, DBS)。DBS是实现有组织地动态地存储大量关联数据方便多用户访问的计算机硬件、软件和数据资源组成的系统即它是**采用数据库技术的计算机系统**。
### 1.3 数据描述
概念设计->逻辑设计->物理设计
#### 1.3.4 数据联系的描述
> 联系(Relationship)是实体间的相互关系,与一个联系有关的实体集个数,称为联系的元数。
+ 一元联系
+ 二元联系
+ 一对一联系 1:1
+ 一对多联系 1:N
+ 多对多联系 M:N
+ 三元联系等
**例1.2** 给定一定的联系及其类型(一对一/一对多/多对多),用单箭头指向“一端”的实体集,用双箭头指向"多端"的实体集。
**例1.3** 三元联系和一元联系类型举例:
如零件可以由若干个子零件组成也可是其他零件的子零件因此自身对自身是M:N
![一元联系、三元联系举例](http://47.117.160.245:8080/pictrue/private/db_02.png)
### 1.4 数据抽象的级别
#### 1.4.1 数据抽象的过程
现实世界的信息->数据库存储:逐步抽象的过程
> 表达用户需求观点的数据全局逻辑的模型称为“概念模型”表达计算机实现观点的DB全局逻辑结构的模型称为“逻辑模型”表达用户使用观点的DB局部逻辑模型称为“外部模型”表达DB物理结构的模型称为"内部模型"。
![4种模型之间的相互关系](http://47.117.160.245:8080/pictrue/private/db_03.png)
#### 1.4.2 概念模型
概念模型的抽象级别最高,特点如下所述:
+ 概念模型表达了数据的整体逻辑结构,是系统用户对整个应用项目涉及的数据的全面描述。
+ 概念模型是从用户需求的观点出发,对数据建模。
+ 概念模型独立于硬件(硬件设备)和软件(实现时的DBMS软件)。硬件/软件的变化不会影响DB的概念模型设计。
+ 概念模型是数据库设计人员与用户之间进行交流的工具。
现在采用的概念模型主要是实体联系(ER, Entity Relationship)模型ER模型主要由ER图来表示。
> ER图有3个基本成分
>
> + 矩形框:用于表示实体类型(考虑问题的对象,如学生,课程)。
> + 菱形框:用于表示联系类型(实体间联系,如选课)。
> + 椭圆形框:用于表示实体类型和联系类型的属性。
>
> 相应的命名均记入各种框中,实体与属性,联系与属性之间用直线相连,联系类型两端用直线连接涉及的实体类型,并在直线段标注联系的类型。
#### 1.4.3 逻辑模型
逻辑模型具有以下特点
+ 逻辑模型表达了DB的整体逻辑结构。
+ 是从数据库实现的观点出发对数据建模
+ 独立于硬件,但依赖于软件(DBMS)
+ 逻辑模型是数据库设计人员与应用程序员之间进行交互的工具。
主要有层次、网状、关系和对象模型共四种。
##### 1.层次模型
##### 2.网状模型
##### 3.关系模型
关系模型的特征主要是用二位表格表达实体集。关系模型是由若干个关系模式Relational Schema组成的集合。关系模式的实例称为关系。每个关系实际上是一张二维表格(Table)。
> TEACHER模式 `(T#,TNAME,TITLE) `
>
> COURSE模式 `(C#,CNAME,T#)`
>
> STUDENT模式 `(S#,SNAME,AGE,SEX)`
>
> SC模式`(S#,C#,SCORE)`
如上为关系模式的例子关系模式的实例关系将会是一张表格如下所示是TEACHER模式的实例
| T# | TNAME | TITLE |
| ---- | ----- | ------ |
| T2 | SHI | 教授 |
| T3 | LI | 副教授 |
| T1 | DAI | 讲师 |
| T4 | GU | 讲师 |
##### 4.对象模型
#### 1.4.4 外部模型
实际使用时,可以为不同的业务单位设计不同的外部模型。
**例** 存在关系模型,由如下四个关系模式组成
> TEACHER模式 `(T#,TNAME,TITLE) `
>
> COURSE模式 `(C#,CNAME,T#)`
>
> STUDENT模式 `(S#,SNAME,AGE,SEX)`
>
> SC模式`(S#,C#,SCORE)`
在这个基础上,可以为学生应用子系统设计一个外部模型外部模型中的模式称为“视图”,这个视图如下:
> 学生视图 `STUDENT_VIEW(S#,SNAME,C#,CNAME,SCORE,T#,TNAME)`
视图只是一个定义,视图中的数据可以从逻辑模型的数据库中得到。
外部模型具有如下特点
+ 外部模型是逻辑模型的一个逻辑子集
+ 外部模型独立于硬件,依赖于软件
+ 外部模型反映了用户使用数据库的观点
#### 1.4.5 内部模型
内部模型又称为物理模型,是数据库最低层的抽象,它描述数据在硬盘或磁带上的存储方式,存取设备和存取方法。内部模型与硬件和软件紧密相连。
#### 1.4.6 三层模式与两级映像
##### 1.三层模式体系结构
在用户(或应用程序)到数据库之间DB的数据结构有3个层次外部模型逻辑模型和内部模型。这3个层次要用DB的数据定义语言(Data Definition Language,DDL)定义,定义后的内容,称为模式(Schema)。
> 从用户(或应用程序)到数据库之间DB的数据结构描述有3个层次
>
> + 外模式 用户与数据库系统的结构,是用户用到的那部分数据的描述。
> + 逻辑模式 是数据库中全部数据的整体逻辑结构的描述。
> + 内模式 数据库在物理存储方面的描述
##### 2.两级映像
> 三层模式之间存在着两级映像:
>
> + 外模式/逻辑模式映像存在于外模式和逻辑模式之间,用于定义外模式和逻辑模式间的对应性,这个映像一般是放在外模式中描述的
> + 逻辑模式/内模式映像存在于逻辑模式和内模式之间,这个映像一般是放在内模式中描述的
#### 1.4.7 高度的数据独立性
> 数据独立性(Data Independence)是指应用程序和数据库的数据结构之间相互独立,不受影响,在修改数据结构时,尽可能不修改应用程序,则称系统达到了数据独立性目标。
+ 物理数据独立性
如果数据库的内模式要修改,只要对逻辑模型/内模式映像作相应的修改,可以使逻辑模式经可能保持不变,这时,称数据库达到了物理数据独立性。
+ 逻辑数据独立性
如果数据库的逻辑模式要修改,只要对外模式/逻辑模式映像做相应的修改,可以使外模式和应用程序京可能保持不变,这时,称数据库达到了逻辑数据独立性。
### 1.5 数据库管理系统
#### 1.5.1 DBMS的工作模式
数据库管理系统(DBMS)是指数据库系统中对数据进行管理的软件系统。
![用户访问数据库的过程](http://47.117.160.245:8080/pictrue/private/db_04.png)
#### 1.5.2 DBMS的主要功能
1. 数据库的定义功能
2. 数据库的操纵功能
3. 数据库的保护功能
4. 数据库的维护功能
5. 数据字典
--------------------------
# 第二章 关系模型和关系运算理论
### 2.1 关系模型的基本概念
#### 2.1.1 基本术语
> 用二维表格表示实体集,用关键码表示实体之间联系的数据模型称为关系模型(Relation Model)
在关系模型中:
字段称为**属性**,字段的值称为**属性值**,为列(Column)
记录类型称为**关系模式**
记录称为**元组**(Tuple), 为行(Row)
元组的集合称为**关系**(Relation)或实例(Instance)
属性的个数称为**元数**,元组个数称为**基数**
关键码(Key,键)由一个或多个属性组成,在实际使用中,有以下几种键:
+ 超键(Super Key),在关系中能唯一标识元组的属性或属性集称为关系模式的超键。
+ 候选键(Candidate Key),不含有多余属性的超键称为候选键,候选键中再删除属性便不是键。
+ 主键(Primary Key),用户选作元组表示的候选键称为主键。
+ 外键(Foreign Key)如果模式R中属性K是其他模式的主键那么K在模式R中称为外键。
#### 2.1.2 关系的定义和性质
> 关系是一个属性数目相同的元组的集合
严格地讲,关系是一种规范化了的二维表格,在关系模型中,对关系作了下列规范性限制:
+ 关系中每个属性都是不可分解的
+ 关系中不允许出现重复元组
+ 由于关系是一个集合,因此不考虑元组间的顺序,即没有行序
+ 元组中的属性在理论上也是无序的,但使用时按习惯考虑列的顺序
#### 2.1.3 关系的3类完整性规则
##### 1. 实体完整性规则
在组成主键的属性上不能有空值
##### 2.参照完整性规则
> 如果属性集K是关系模式R1的主键K也是关系模式R2的外键那么在R2的关系中K的取值只有两种可能或者为空值或者等于R1关系中的某个主键值。
实质:不允许引用不存在的实体
##### 3.用户定义的完整性规则
在建立关系模式时,数据可以针对具体的数据约束,设置完整性规则,由系统来检验实施。
### 2.2 关系代数
#### 2.2.1 关系代数的5个基本操作
关系定义为属性个数相同的元组的集合,因此集合代数中的操作可以引入到关系代数中。
##### 1.并(Union)
R和S具有相同的关系模式R和S的并是属于R或属于S的元组构成的集合。记为
$$
R \cup S\equiv\lbrace t \mid t \in R \wedge t\in S \rbrace
$$
##### 2.差(Difference)
R和S具有相同的关系模式R和S的差是属于R但不属于S的元组构成的集合。记为
$$
R \cap S\equiv\lbrace t \mid t \in R \wedge t \notin S \rbrace
$$
##### 3.笛卡儿积(Cartesian Product)
设关系R和关系S的元数分别为r和s定义R和S的笛卡尔积是一个(r+s)元的元组集合每个元组的前r个分量来自R的一个元组后s个分量来自S的一个元组记为
$$
R \times S\equiv\lbrace t \mid t= \langle t^r,t^s \rangle \wedge t^r \in R \wedge t^s \in S\rbrace
$$
##### 4.投影(Projection)
对一个关系进行垂直分割,按顺序选出某些列。
$$
\pi_{i_1,\ldots,i_m}(R)\equiv\lbrace t \mid t = \langle t_{i_1},\ldots,t_{i_m} \rangle \wedge \langle t_1,\ldots,t_k \rangle \in R \rbrace
$$
操作符$\pi$的下标处也可以用属性名表示。
##### 5.选择(Selection)
选择操作时根据某些条件对关系做水平分割,即选取符合条件的元组。
选取的条件F有两种成分
+ 运算对象:常数,元组分量(属性名/列的序号)
+ 运算符:算术比较运算符、逻辑运算符
形式定义如下:
$$
\sigma_F(R) \equiv \lbrace t \mid t \in R \wedge F(t)=true \rbrace
$$
$\sigma_F(R)$表示从R中挑选满足公式F为真的元组所构成的关系。
#### 2.2.2 关系代数的4个组合操作
组合操作可由前面5个基本操作推出。
##### 1.交(Intersection)
关系R和关系S的交是属于R又属于S的元组构成的集合形式定义如下(R和S的元数相同)
$$
R \cap S \equiv \lbrace t \mid t \in S \wedge t \in S \rbrace
$$
##### 2.连接(Join)
连接是从关系R和S的笛卡尔积中选取属性值满足某一$\Theta$操作的元组,形式定义如下:
$$
R\Join_{i \theta j} S \equiv \lbrace t \mid t = \langle t^t,t^s \rangle \wedge t^s \in S \wedge t^r_i \theta t^s_j \rbrace
$$
显然,连接操作由笛卡尔积和选择操作组合而成。
如果$\theta$是等号,该连接操作被称为等值连接。
##### 3.自然连接(Natural Join)
两个连接关系R和S的自然连接操作用$R\Join S$表示,计算过程如下:
1. 计算$R \times S$
2. 设R和S的公共属性是$A_1, \ldots ,A_K$,挑选$R \times S$中满足$R.A_1=S.A_1, \ldots ,R.A_K=S.A_K$的元组。
3. 去掉$S.A_1, \ldots ,S.A_K$这些列
##### 4.除法(Division)
概念定义较为抽象,难以理解,用自然语言简要说明:
R/S的流程
+ 从S中选择出R和S的重复属性Y从R中去除R和S的重复属性去除后的关系称为X即X为不重复属性
+ 对X中的每个元组在R中找出对应的Y的象集即找出所有X的元组在R中对应的属性和Y一样的Y元组。
+ 若X中的每个元组在R中对应的Y的元组包含了所有Y则X在R/S的最终结果中。
### 2.4 关系代数表达式的优化
#### 2.4.3 启发式优化算法
启发式规则:
+ 尽可能早地执行选择操作
+ 尽可能早的执行投影操作
+ 避免直接做笛卡儿积,把笛卡儿积之前和之后地一连串选择和投影操作合并起来一起做
----------------------------------------------
# 第三章 关系数据库语言SQL
### 3.2 SQL的数据定义
#### 3.2.1 SQL的模式的创建和撤销
创建模式`CREATE`和撤销模式`DROP`
```sql
CREATE SCHEMA <模式名>
DROP SCHEMA <模式名> [CASCADE|RESTRICT]
```
`CASCADE`:级联式执行DROP语句时把SQL模式及其下属的基本表、视图、索引等元素全部撤销。
`RESTRICT`:约束式,没有任何下属元素才能执行,否则拒绝执行
SQL模式一词较为偏向学术许多DBMS中会将模式称为数据库采用`CREATE DATABASE`语句。
#### 3.2.2 基本数据类型
+ 数值型
+ INTEGER/INT 整数长度4B
+ SMALLINT 短整数长度2B
+ REAL 浮点数
+ DOUBLE PRECISION 双精度浮点数
+ FLOAT(n) 精度至少为n个数字的浮点数
+ NUMERIC(p,d)/DECIMAL(p,d)/DEC(p,d) 定点数p位整数d位小数
+ 字符串型
+ CHAR(n) 长度为n的定长字符串不足长度补空格
+ VARCHAR(n) 最大长度为n的变长字符串
+ 位串型
+ BIT(n) 长度为n 的二进制位串
+ BIT VARYING(n) 最大长度为n的变长二进制位串
+ 时间型
+ DATE 日期YYYY-MM-DD
+ TIME 时间HH:MM:SS
#### 3.2.3 基本表的创建、修改和撤销
##### 1.基本表的创建
```sql
CREATE TABLE <基本表名>
(
<列名类型>,
...
<完整性约束>,
...
)
```
每个列的类型可以是基本数据类型,也可以是用户事先定义的域名。
完整性约束包含主键子句(`PRIMARY KEY`)、外键子句(`FOREIGN KEY`)和检查子句(`CHECK`)
例:
```sql
CREATE TABLE T
(
T# CHAR(4) NOT NULL,
TNAME CHAR(8) NOT NULL,
TITLE CHAR(10),
PRIMARY KEY(T#);
);
```
##### 2.基本表的结构的修改
+ 增加新的列用"`ALTER ... ADD ...`"语句
+ 删除原有的列用"`ALTER ... DROP ...`"语句
+ 修改原有列的类型、宽度用“`ALTER ... MODIFY ...`”语句
```sql
ALTER TABLE <基本表名> ADD <列名> <类型>
ALTER TABLE S ADD ADDRESS VARCHAR(30);
ALTER TABLE <基本表名> DROP <列名> [CASCADE|RESTRICT]
ALTER TABLE S DROP AGE CASCADE;
ALTER TABLE <基本表名> MODIFY <列名><类型>
ALTER TABLE S MODIFY S# CHAR(6);
```
##### 3.基本表的撤销
```sql
DROP TABLE <基本表名> [CASCADE|RESTRICT]
DROP TABLE S RESTRICT;
```
### 3.3 SQL的数据查询
#### 3.3.1 SELECT查询语句的基本结构
##### 1.SELECT 句型
关系代数中最常用的式子为下列表达式:
$$
\pi_{A_1, \ldots ,A_n} (\sigma_F(R_1 \times \ldots \times R_m))
$$
根据该表达式SQL设计了SELECT-FROM-WHERE 句型
```sql
SELECT A,B,...
FROM R,S,...
WHERE F
```
该句型由关系代数表达式演变而来。WHERE子句中的条件表达式更加灵活可使用下列运算符
+ 算数比较运算符
+ 逻辑运算符:AND,OR,NOT
+ 集合成员资格运算符:IN,NOT IN
+ 谓词:EXISTS,ALL,SOME,UNIQUE
+ 聚合函数:AVG,MIN,MAX,SUM
+ 运算对象可以是另一个SELECT语句
SELECT语句能表达所有的关系代数表达式
##### 2.SELECT语句的使用技术
SELECT语句使用时的三种写法连接查询、嵌套查询、带存在量词的嵌套查询。
**例**:对于数据库以下四个关系
> T `(T#,TNAME,TITLE) `
>
> C `(C#,CNAME,T#)`
>
> S `(S#,SNAME,AGE,SEX)`
>
> SC`(S#,C#,SCORE)`
查询语句检索学习课程号为C2课程的学生学号与姓名
```sql
#连接查询
SELECT S,`S#`,SNAME
FROM S,SC
WHERE S.S#=SC.S# AND `C#`='C2';
#嵌套查询
SELECT `S#`,SNAME
FROM S
WHERE `S#` IN(SELECT `S#`
FROM SC
WHERE `C#`='C2');
#使用存在量词的嵌套查询
SELECT `S#`,SNAME
FROM S
WHERE EXISTS(SELECT C#
FROM SC
WHERE `S#`=SC.S#);
```
#### 3.3.2 SELECT语句的完整结构
```sql
SELECT <目标表的列名或列表达式序列> #列表达式序列指对于一个单列求聚合值的表达式,也允许常用算数表达式
FROM <基本表名和(或)视图序列>
[WHERE <行条件表达式>]
[GROUP BY <列名序列>
[HAVING <组条件表达式>]]
[ORDER BY <列名[ASC|DESC]>,...]
```
执行过程:
1. 读取FROM子句中基本表和视图的数据执行笛卡尔积操作
2. 选取满足WHERE子句中给出的条件表达式的元组
3. 按GROUP子句中指定的列的值分组同时提取满足HAVING子句中条件表达式的那些组
4. 按SELECT子句中给出的列名或列表达式求职输出
5. ORDER子句对输出目标表进行排序附加说明按ASC升序排列或按DESC降序排列
#### 3.3.3 数据查询中的限制与规定
##### 1.SELECT子句规定
`SELECT [ALL|DISTINCT] ....`
DISTINCT用于将重复的行从结果中去除。
默认为ALL保留重复行。
##### 2.列和基本表的改名操作
可在SELECT子句中用`<旧名> AS <新名>`改名
##### 3.集合的交、并、差操作
当两个子查询的结果结构完全一致时,可让两个子查询执行交、并、差操作。
运算符为`UNION`,`INTERSECT`,`EXCEPT`
#### 3.3.4 条件表达式中的比较操作
##### 1.算术比较操作
条件表达式中可用算术比较运算符:>、<、>=、<=、=、!=,也可用`BETWEEN ... AND ...`
##### 2.字符串匹配操作
字符串匹配操作符是`LIKE`,表达式中可使用两个通配符:
+ 百分号(%):与0个或多个任意字符匹配
+ 下划线(_):与单个字符匹配
需要时也可使用`NOT LIKE`
##### 3.空值比较操作
`IS NULL`
##### 4.集合成员资格的比较
```sql
<元组> [not] in (<集合>)
SELECT SNo
FROM S
WHERE SNo NOT in (SELECT SNo
FROM SC
WHERE CNo IN ('C2','C4'));
```
##### 5.集合成员的算数比较
```
<元组> <运算符> ALL|SOME|ANY (<集合>)
```
`in` 可用`=SOME`代替
##### 6.集合空否的测试
```sql
[NOT] EXISTS(<集合>)
```
结果为true/false
##### 7.集合是否存在重复元组的测试
```sql
[NOT] UNIQUE(<集合>)
```
### 3.4 SQL数据更新
### 3.5 视图
#### 3.5.1 视图的创建和撤销
```sql
CREATE VIEW <视图名>(<列名序列>)
AS <SELECT >
CREATE VIEW STUDENT_SCORE(SNO,SNAME,CNAME,SCORE)
AS SELECT S.SNO,SNAME,CNAME,SCORE
FROM S,SC,C
WHERE S.SNO=C.SNO AND C.CNO=SC.CNO;
DROP VIEW <视图名>
DROP VIEW STUDENT_SCORE;
```
--------
# 第四章 关系数据库的规范化设计
### 4.1 关系模式的设计问题
#### 4.1.2 关系模式的冗余和异常问题
为什么要做模式分解?
未分解的数据库使用中可能遇到如下问题:
+ 数据冗余
+ 操作异常
+ 修改异常
+ 插入异常
+ 删除异常
“分解”是解决冗余的主要方法,也是规范化的一条原则:“关系模式有冗余问题,就分解它”。
### 4.2 函数依赖
#### 4.2.1 函数依赖的定义
在数据库中,属性值之间会发生联系,例如每门课程只能由一个任课老师等等,这类联系称为函数依赖。
> 设有关系模式R(U)X,Y是属性集U的子集函数依赖(Functional Dependency,FD)是形为X→Y的一个命题只要r是R的当前关系(实例)对r中任意两个元组t和s都有t[X]=s[X]蕴含t[Y]=s[Y]那么称FD X→Y在关系模式R(U)中成立。
X→Y读作X决定Y或Y函数依赖于X。
**例** 有一个包括学生选课、教师任课数据的关系模式:
`R(S#,SNAME,AGE,SEX,C#,CNAME,SCORE,T#,TNAME,TITLE)`
如果规定每个学号只能有一个学生姓名每个课程号只能决定一门课程那么可写成下列FD形式
`S#→SNAME`
`c#→CNAME`
每个学生每学一门课程有一个成绩可写出下列FD
`(S#,C#)→SCORE`
还可写出:
`S#→(AGE,SEX)`
`C#->T#`
`T#->(TNAME,TITLE)`
#### 4.2.3 FD的推理规则
+ A1(自反性,Reflexivity) 若$Y\subseteq X \subseteq\ U$ 则$X\rightarrow Y$在R上成立
+ A2(增广性,Augmentation) 若$X\rightarrow Y$在R上成立且$Z \subseteq U$,则$XZ \rightarrow YZ$在R上成立
+ A3(传递性,Transitivity) 若$X\rightarrow Y$和$Y\rightarrow Z$在R上成立则$X\rightarrow Z$在R上成立
#### 4.2.5 属性集的闭包
> 设F是属性集U上的FD集X是U的子集那么相对于F属性集X的闭包用$X^+$表示它是一个从F集使用FD推理规则推出的所有满足$X \rightarrow A$的属性A的集合
求属性集X的闭包的算法自然语言描述
$X^+=X$
遍历F中的每个FD$Y \rightarrow Z$,若$Y \subseteq X^+$,把Z加入到$X^+$中
若$X^+$有变化,重新遍历,直到$X^+$不变为止
#### 4.2.7 FD的最小依赖集
> 如果函数依赖集G满足下列三个条件则称G是最小依赖集:
>
> + G中的每个FD的右边都是单属性
> + G中没有冗余的FD即G中不存在函数依赖A使得G-A与G等价
> + G中每个FD的左边没有冗余的属性
每个函数依赖集至少存在一个等价的最小依赖集,但并不一定唯一。
**例** 设F是关系模式R(ABC)的最小依赖集,$F=\{A\rightarrow BC,B \rightarrow C,A \rightarrow B, AB \rightarrow C\}$,试求最小依赖集。
1. 先把F中的FD写成右边是单属性形式
$$
F= \lbrace A\rightarrow B,A\rightarrow C,B \rightarrow C,A \rightarrow B, AB \rightarrow C \rbrace
$$
显然有重复,删去:$F= \lbrace A\rightarrow B,A\rightarrow C,B \rightarrow C, AB \rightarrow C \rbrace$
2. 在F中$A \rightarrow C$可由$A \rightarrow B$和$B \rightarrow C$推出,冗余,删去。
3. 在F中$AB \rightarrow C$中A多余可通过$B \rightarrow C$直接退出,冗余,删去
结果:$F= \lbrace A\rightarrow B,B \rightarrow C \rbrace$为最小依赖集
### 4.3 关系模式的分解特性
#### 4.3.1 模式分解问题
将一个关系模式R用多个其属性集子集的关系模式(ρ)替代的过程称为模式分解。
R称为**泛关系模式**R对应的当前值称为**泛关系**,ρ称为**数据库模式**,ρ对应的当前值称为**数据库实例**
分解后的两个问题:
+ 数据库实例和泛关系是否等价,即是否表示同样的数据,用”无损分解“特性表示。
+ FD是否等价用“保持依赖“表示。
#### 4.3.2 无损分解
关系模式分解后,通过投影,连接仍能恢复,即未丢失信息,这种分解称为"无损分解",反之,称为”损失分解“
直接定义一个数据库实例,其中存在多余数据,在原有的泛关系中不可能存在,这种情况称为**无泛关系假设**,多余数据称为**悬挂元组**。<!--非严谨定义,自然语言快速解释-->
#### 4.3.3 模式分解的优缺点
##### 1.优点
+ 能消除数据冗余和操作异常现象
+ 在分解了的数据库中可以储存悬挂元组,储存泛关系中无法储存的信息
##### 2.缺点
+ 分解以后,检索操作需要做笛卡儿积或连接操作,这将付出时间代价
+ 在有泛关系假设时,对数据库的关系进行自然连接时,可能存在寄生元组,无泛关系假设时,可能存在悬挂元组,就有可能不存在泛关系。
#### 4.3.4 无损分解的测试方法
>chase算法
>输入关系模式R=A1…AnF是R上成立的函数依赖集ρ={R1,…,Rk}是R的一个分解。
>输出判断ρ相对于F是否具有无损分解特性。
>方法“chase”过程
>1.构造k行n列的表格每列对应一个属性Aj(1≤j≤n),每行对应一个模式Ri (1≤i≤k)。若Aj在Ri中则在i行j列处填上符号aj否则填上bij。
>2.把表格看成R的一个关系反复检查F中每个FD在表格中是否成立若不成立则修改表格中的值。方法
>对于F中一个FD X→Y如果表格中有两行在X值上相等在Y值上不相等那么把这两行在Y之上的改成相等的值。直到表格不能修改为止。尽可能修改为a若没有a修改为下标较小的值
>3.最后一张表格有一行是全aρ相对于F是无损分解。
概念较为模糊,用实例解释:
> 设关系模式R(ABCD)F是R上成立的FD集F={B->A,C->D}ρ={AB,AC,BD}是R的一个分解。相对于Fρ是否无损分解
>
> 1. 根据步骤一,得出下表:
>
> | | A | B | C | D |
> | ---- | ---- | ---- | ---- | ---- |
> | AB | a1 | a2 | b13 | b14 |
> | BC | b21 | a2 | a3 | b24 |
> | CD | b31 | b32 | a3 | a4 |
>
> 2. 根据步骤二,通过修改即可知道这个关系模式的分解是否是无损分解:
>
> 根据B→A第一第二个元组(行),因为在B值上相等在A值上不相等所以把A上的b32改成a1
>
> | | A | B | C | D |
> | ---- | ------ | ---- | ---- | ---- |
> | AB | a1 | a2 | b13 | b14 |
> | BC | **a1** | a2 | a3 | b24 |
> | CD | b31 | b32 | a3 | a4 |
>
> 同理根据C→D第二第三个元组(行)在C值上相等D上不相等,则修改为:
>
> | | A | B | C | D |
> | ---- | ---- | ---- | ---- | ------ |
> | AB | a1 | a2 | b13 | b14 |
> | BC | a1 | a2 | a3 | **a4** |
> | CD | b31 | b32 | a3 | a4 |
>
> 3. 上表中第二行全是a,因此是无损分解
>
> 原文链接https://blog.csdn.net/u010927640/article/details/40737021