3 形式化关系查询语言
3.2 关系演算和E-R数据模型
3.2.1 概述
除了用关系代数表示关系操作外,还可以用谓词演算来表达关系的操作,这称为关系演算
。
关系代数表示关系的操作,须标明关系操作的次序,哪个操作先哪个后你要说清楚,所以以关系代数为基础的数据库语言是过程化查询语言
。用关系演算表示关系的操作,只要说明所要得到关系的结果,而不必标明操作的过程,因而他是非过程
的。关系演算分为元组关系演算
和域关系演算
。
3.2.2 元组关系演算
3.2.2.1 概述
元组关系演算就是以元组为变量,一般形式是 t [ < 属 性 表 > ] ∣ P ( t ) {t[<属性表>]|P(t)} t[<属性表>]∣P(t)。
一般形式描述了其为使谓词P为真的元组t的集合。当我们选的不是元组,而是元组的部分属性的时候,就可以采用属性表。
利用关系演算是可以做关系代数的所有操作的。举一个例子,如果我们要查询江苏籍贯的女大学生姓名,那么我们会这么写:
t
[
姓
名
]
∣
t
∈
S
T
U
D
E
N
T
A
N
D
t
.
性
别
=
′
女
′
a
n
d
t
.
籍
贯
=
′
江
苏
′
{t[姓名]|t∈STUDENT AND t.性别 = '女' and t.籍贯 = '江苏'}
t[姓名]∣t∈STUDENTANDt.性别=′女′andt.籍贯=′江苏′
但是对于上面的查询,我们只是表达了要查找的元组是在所表达的条件之中。为了表达要查询的请求,我们需要引入数理逻辑的“存在”这一结构。记法为:
∃
t
∈
r
(
Q
(
t
)
)
\exist t∈r(Q(t))
∃t∈r(Q(t))。这样的意思是表示关系r中存在元组t使谓词Q(t)为真
。并且,我们在考试中很少写and和or,而是改用
⋀
和
⋁
\bigwedge和\bigvee
⋀和⋁来代替。
用上面的表达来表示上面的例子,即为: t [ 姓 名 ] ∣ ∃ t ∈ S T U D E N T ⋀ t . 性 别 = ′ 女 ′ ⋀ t . 籍 贯 = ′ 江 苏 ′ {t[姓名]|\exist t∈STUDENT \bigwedge t.性别 = '女' \bigwedge t.籍贯 = '江苏'} t[姓名]∣∃t∈STUDENT⋀t.性别=′女′⋀t.籍贯=′江苏′。
那如果我们想表示学生表里不是江苏籍贯的女大学生的姓名呢?这只需要用 ┐ \urcorner ┐,即否定符号,如下: t [ 姓 名 ] ∣ ¬ ∃ t ∈ S T U D E N T ⋀ t . 性 别 = ′ 女 ′ ⋀ t . 籍 贯 = ′ 江 苏 ′ {t[姓名]|¬ \exist t∈STUDENT \bigwedge t.性别 = '女' \bigwedge t.籍贯 = '江苏'} t[姓名]∣¬∃t∈STUDENT⋀t.性别=′女′⋀t.籍贯=′江苏′
如果我们要表达那些是江苏所有的大学生呢?我们会发现,这里面含有一个所有的概念,为了用元组关系演算书写此查询,我们引入了 ∀ \forall ∀。
在上面的叙述中我们发现,我们基本都是把高中课本上面的谓词全部搬上来关系演算使用。
3.2.2.2 形式化定义
结果上一小节的叙述,我们知道元组关系演算表达式具有如下形式:
t
∣
P
(
t
)
{t | P(t)}
t∣P(t)。其中P是一个公式,公式中可以出现多个元组变量。对于没有被量词绑定的变量,我们称为自由变量
。如果被量词绑定了,我们称为受限变量
。
对于元组关系演算的公式,其由原子
组成,原子可以是如下的形式之一:
- 如果是s∈r,那么代表s是元组变量r是关系。这是需要注意的是我们
不允许
使用 ∉ ∉ ∈/。 - 对于s[x]op[y],那么其中op为
<,>,=,<=,>=,!=
当中任意一个。
3.2.2.3 表达式的安全性
元组关系演算与关系代数具有同等表达能力,也是关系完备
的。用谓词演算表示关系操作时,只有结果是有限集才有意义。也就是说,一个表达式的结果如果是有限的,我们叫做表达式是安全的。反之,我们说他是不安全的。例如
{
t
∣
t
¬
∈
S
T
U
D
E
N
T
}
\{t| t ¬ ∈STUDENT\}
{t∣t¬∈STUDENT},宇宙中不属于学生的东西是无限的,这个表达式是不安全的
。
3.2.3 域关系演算
关系演算的另一种形式为域关系演算
,使用从属性域中取值的域变量,而不使用一整个元组的值。
域关系演算一般以域为变量,其一般形式为: < x 1 , x 2 , … , x n > ∣ P ( x 1 , x 2 , … x ( n + m ) ) {<x1,x2,…,xn>|P(x1,x2,…x(n+m))} <x1,x2,…,xn>∣P(x1,x2,…x(n+m))。
这样说我们可能有点费解。在下面,我们有完整的习题可供练习。
域关系演算也是完备的,实际上这个案例和选择操作很像。
3.2.4 关于关系演算的习题
对于1、3、5写出元组关系演算,对于2、4、6写出域关系演算。


3.2.5 对传统数据模型的评价
一般来说,我们把层次,网状和关系数据模型称为传统数据模型
。对于传统数据模型来说有四个弱点:
-
以记录为基础,不能很好地面向用户和应用
-
不能以自然的方式表示实体之间的联系。
-
语义贫乏。
-
数据类型太少,难以满足应用需要。
3.2.6 E-R数据模型
3.2.6.1 基本概念
E-R数据模型,也叫实体联系数据模型
。其提出的目的如下:
- 企图建立一个统一的数据模型,以概括三种传统的数据模型;
- 作为三种传统数据模型互相转换的中间概念
- 作为超脱DBMS的一种概念数据模型,以比较自然的方式模拟现实世界。
在E-R数据模型中有三个概念我们需要先知道,分别是实体
,属性
,联系
。
3.2.6.2 E-R图
用E-R数据模型对一个单位的模拟,称为一个单位的E-R数据模式
。E-R数据模式可以用非常直观地E-R图
来表示。

其中矩形框代表实体,菱形代表联系,椭圆代表属性。
对于E-R图来说有两个约束:基数比约束
和参与度约束
。它们两个合称联系约束
。
3.2.7 题型总结
3.2.7.1 如何画E-R图
步骤总结:
- 找出实体并用矩形表示
- 找出实体的属性用椭圆表示
- 找出实体间的关系,用菱形表示
3.2.7.2 E-R图转关系模式
步骤总结:
-
实体转换为一个关系模式
-
实体的属性就是关系的属性,实体的码就是关系的码
-
实体间联系的转换
-
1:1联系:在任意一方加入对方的主码变为外码,并加入联系本身的属性。
-
1:n联系:将1方的主键加入n方作为其外键,并同时将联系的属性也加入n方。
-
m:n联系:将联系本身本身转化为一个关系模式,联系双方的主码加入其中,并将联系的属性加入其中。
-
3.2.8 扩充E-R数据模型
扩充E-R数据模型我们通常称为EER,在EER引入以下的几个概念:弱实体、特殊化和普遍化、聚集、范畴。