1. 关系模型的基本概念
1.1 关系模型简述
- 最早由E.F.Codd在1970年提出
- 从表(Table)及表的处理方式中抽象出来的,实在对传统表及其操作进行数学化严格定义的基础上引入【集合理论】和【逻辑学理论】提出的
- 是数据库的三大经典数据模型之一(关系模型,层次模型,网状模型),也是现在大多数商品化数据库系统所仍然使用的数据模型
- 标准的数据库语言(SQL语言)是建立在关系模型的基础之上的,数据库领域的众多理论也都是建立在关系模型基础之上的
1.2 关系模型研究什么
- 一个关系(relation)就是一个Table
- 关系模型就是来处理Table的,他有三个部分组成:
① 描述DB各种数据的基本结构形式(Table/Relation)
② 描述Table与Table之间所可能发生的各种操作(关系运算)
③ 描述这些操作所应遵循的约束条件(完整性约束)
总结起来就是:Table如何描述,有哪些操作,结果是什么,有哪些约束等等
图 1
1.3 关系模型的三个要素
□ 基本结构: Relation / Table
□ 基本操作: Relation Operator
图 2 基本操作的种类示意图,其中前五个:并、差、积、选择、投影是基本操作
□ 完整性约束: 实体完整性,参照完整性和用户自定义的完整性
1.4 关系运算
- 基于 【关系代数】 的运算
- 基于 【关系演算】 的运算:又包括 元组演算 和 域演算
1.4.1 基于 【关系代数】的运算实例:
π 课 程 名 ( σ 课 程 号 = c 2 ( R ⋈ S ) ) \pi_{课程名}(σ_{课程号=c_2}(R⋈S)) π课程名(σ课程号=c2(R⋈S)) (公式1)
可以看出,操作的对象都是集合,是一次一集合(Set-at-a-time)的操作。而非关系型的数据操作通常是一次一记录(Record-at-a-time)的操作(例如层次模型和网状模型使用指针就是一次一记录的操作)
基于关系代数设计的数据库语言(ISBL) 用计算机可识别的符号来表征关系,所以公式1转化为计算机语言为:
( ( R ∗ S ) : 课 程 号 = c 2 ) % 姓 名 , 课 程 名 ((R*S):课程号=c_2)\%姓名,课程名 ((R∗S):课程号=c2)%姓名,课程名
○ R:F表示选择运算
○ R%表示投影运算
1.4.2 元组演算实例:基于逻辑的运算
{ t ∣ ( ∃ u ) ( R ( t ) ∧ W ( u ) ∧ t [ 3 ] < u [ 1 ] ) } \{t|(∃u)(R(t)∧W(u)∧t[3]<u[1])\} {t∣(∃u)(R(t)∧W(u)∧t[3]<u[1])} (公式2)
○ 这是一个t 的集合
基于元组演算设计的数据库语言(Ingres系统的QUEL): 用于计算机可以 识别的符号表征元组演算的运算符号,所以公式2转化为计算机语言为:
range of t is R → 表示 t 是 R 的一个元组
range of u is W → 表示 u 是 W 的一个元组
retrieve t → 检索 t
where t.sage < u.sage → 检索满足这个条件的
1.4.3 域演算实例:基于示例的运算
{ t 1 , t 2 , t 3 ∣ S ( t 1 , t 2 , t 3 ) ∧ R ( t 1 , t 2 , t 3 ) ∧ t 1 < 20 ∧ t 2 > 30 } \{t_1,t_2,t_3|S(t_1,t_2,t_3)∧R(t_1,t_2,t_3)∧t_1<20∧t_2>30\} {t1,t2,t3∣S(t1,t2,t3)∧R(t1,t2,t3)∧t1<20∧t2>30} (公式3)
基于域演算设计的数据库语言(QBE:Query By Example):
图 3 基于域演算设计的能让计算机理解的数据库语言QBE原理示意图
1.5 开发软件的思维过程
图 4 根据关系运算转变成数学方式的过程来建立开发软件系统的思维图
2. 什么是关系
2.1 为什么把“表”称为关系
图 5 表的结构
【对“表”进行严格定义 — 关系】
① 首先定义“列”的取值范围:“域(Domain)”
- 域是一组值的集合,这组值具有相同的数据类型
- 如整数的集合,字符串的集合,全体学生的集合
- 集合当中元素的个数,称为域的 基数
图 6 “域”的概念
② 再定义 “元组”及所有可能组成的元组:笛卡尔积(Cartesian Product)
- 一组域
D
1
,
D
2
,
.
.
.
D
n
D_1,D_2,...D_n
D1,D2,...Dn 的笛卡尔积为:
D 1 × D 2 × . . . × D n = { ( d 1 , d 2 , . . . , d n ) ∣ d i ∈ D i , i = 1 , . . . , n } D_1×D_2×...×D_n=\{(d_1,d_2,...,d_n)|d_i∈D_i,i=1,...,n\} D1×D2×...×Dn={(d1,d2,...,dn)∣di∈Di,i=1,...,n} - 笛卡尔积的每个元素 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n d1,d2,...,dn 称作一个 n − 元 组 ( n − t u p l e ) n-元组(n-tuple) n−元组(n−tuple)
图 7 “笛卡儿积 ”的概念
【注意】
□ 元组(
d
1
,
d
2
,
.
.
.
,
d
n
d_1,d_2,...,d_n
d1,d2,...,dn )的每一个值
d
i
d_i
di 叫做一个分量(component)
□ 元组(
d
1
,
d
2
,
.
.
.
,
d
n
d_1,d_2,...,d_n
d1,d2,...,dn )是从每一个域任取一个值所形成的一种组合,笛卡儿积是所有这种可能组合的集合,即:笛卡儿积是由
n
n
n 个域形成的所有可能的
n
−
元
组
n-元组
n−元组 的集合
□ 若
D
i
D_i
Di 的基数为
m
i
m_i
mi,则 笛卡尔积的基数,即元组 的个数为:
m
1
×
m
2
.
.
.
×
m
n
m_1×m_2...×m_n
m1×m2...×mn
笛卡尔积可以表示出来所有的元组中基数随机组合的所有情况,但笛卡儿积中的元组并不是都有意义的 因此需要引入 “关系” 的概念
2.2 关系(Relation)
【关系的定义】
- 是一组域 D 1 , D 2 , . . . D n D_1,D_2,...D_n D1,D2,...Dn 的笛卡儿积的 子集
- 笛卡儿积中有某种意义的组合称为“关系”。
- 由于“关系”的不同列可能来自于同一个域,为了区分,需要为每一列起一个名字,改名字即为 “属性名”
- 也就是说,不同的 “域” 构成了 “笛卡儿积” ,而从笛卡儿积中筛选出有某些意义的部分称为 “关系” ,关系表中的每一列都要有一个名字,叫做 “列名” 或者 “属性名”
图 8 “关系”,“属性名” 的概念
【关系的表示】
“关系” 可以用 R ( A 1 : D 1 , A 2 : D 2 , . . . A n , D n ) R(A_1:D_1,A_2:D_2,...A_n,D_n) R(A1:D1,A2:D2,...An,Dn)表示,可以简记为: R ( A 1 , A 2 , . . . A n ) R(A_1,A_2,...A_n) R(A1,A2,...An)这种描述又被称为是 关系模式(Schema) 或 标题(head)
- R R R是关系的名字, A i A_i Ai是 属性 , D i D_i Di 是 属性所对应的域 n n n是关系的 “度” 或 “目(degree)”,关系中元组的数目称为关系的 “基数(cardinality)”
- R ( A 1 : D 1 , A 2 : D 2 , . . . A n , D n ) R(A_1:D_1,A_2:D_2,...A_n,D_n) R(A1:D1,A2:D2,...An,Dn) 表示这个属性名字是 A 1 A_1 A1他的值来自于 D 1 D_1 D1
举例:
图 9 三目关系的图实例
- 图中所示为 3 目关系,因为有三个属性(丈夫,妻子,子女)
- 丈夫来自于“男人”这个域,妻子来自于“女人”这个域,子女来自于“儿童”这个域,当然,域的部分可以省略,所以图示为: 家庭(丈夫,妻子,子女)省略了冒号后面的部分
【域可以省略为一个表属性的类型、长度】
- 关系模式 R ( A 1 : D 1 , A 2 : D 2 , . . . A n , D n ) R(A_1:D_1,A_2:D_2,...A_n,D_n) R(A1:D1,A2:D2,...An,Dn) 中属性向域的映像在很多DBMS系统中一般直接说明为属性的类型、长度等。
- 例如:
图 10 实例
- 其中 S#, Sname, Ssex, Sage, D#, Sclass是属性的名程
- 相应的:char(8), char(10), char(2)等就是属性的类型,也就是上面的 D i D_i Di 域
2.3 关系模式与关系
① 同一关系模式下面,可以有很多关系
② 关系模式是关系的结构,关系是关系模式在某一时刻的数据
③ 关系模式是稳定的;而关系是某一个时刻的值,是随时间可能变化的
图 11 关系与关系模式的关系实例
2.4 思维回顾
图 12 什么是关系的思维回顾实例