前言
关系数据模型是以集合论中的关系概念为基础发展起来的数据模型。通常说起关系数据模型,新手总会觉得很深奥(我就是。。。),看了王能斌老师在《数据库系统教程》中的描述我有醍醐灌顶之感(原书P23部分内容):

从形式上看,关系相当于一个表。

关系所对应的表是一种简单的二维表,不允许表中出现组合数据,更不允许表中再嵌入表。

总之,关系是个表,不过是加以适当限制的表。因此,在关系数据库中,关系与表这两个术语可以互相通用。与此相适应,属性又称为列(column),元组又称为行(row)。

如此说来,关系数据库也可称为表数据库,库里面就是一张张的表。

1. 基本概念和定义
1)属性和域

属性:通常,在描述一个事物的时候都用其特征来描述,这些特征称为属性。

:不同的属性有其取值范围,这个取值范围就是域。

NULL:在数据库中,某些属性值可能是未知的或在某些场合下不适用的。在此情况下,使用空缺符NULL,它不是一个值,而是一个标记,说明该属性是空缺的。

2)关系和元组

关系就是定义在它的所有属性域上的多元关系。一个关系R,它有n个属性A,以及每个属性一一对应的n个属性域D。关系R可以表示为
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的模式。

R的值用 r r r r ( R ) r(R) r(R)表示,它是n目元组的集合,即:
r = { t 1 , t 2 , . . . , t m } r = \{t_1, t_2, ... , t_m\} r={t1,t2,...,tm}
每个元组t可以表示为:
t = ⟨ v 1 , v 2 , . . . , v n ⟩ , v i ∈ D i , 1 ≤ i ≤ n t=\langle v_1, v_2, ..., v_n \rangle, v_i\in D_i, 1\leq i \leq n t=v1,v2,...,vn,viDi,1in

t i ∈ D 1 × D 2 × … × D n , 1 ≤ i ≤ m t_i \in D_1\times D_2\times \ldots \times D_n, 1 \leq i \leq m tiD1×D2××Dn,1im
也就是 R R R的值 r r r是属性域的笛卡尔乘积的子集,即
r ⊆ D 1 × D 2 × … × D n r \subseteq D_1 \times D_2 \times \ldots \times D_n rD1×D2××Dn

3)键

:如果关系的某一属性或属性组的值唯一地决定其他所有属性的值,也就是唯一地决定一个元组,而其任何真子集无此性质,则这个属性或属性组称为该关系的候选键或者简称为键。

主键:一个关系至少有一个候选键,也可能有多个候选键,一般从候选键中选择一个作为主键。主键的值可以用来识别和区分元组,它应该是唯一的,即每个元组的主键的值是不能相同的。

候补键:在一个关系中,除主键之外的候选键称为候补键。

全键:在有些关系中,主键由所有属性组成,这称为全键。

主属性:包含在任何一个候选键中的属性称为主属性,不包含在任何候选键中的属性称为非主属性。

外键:如果关系中的属性或属性组不是本关系的键,而是引用其他关系或本关系的键,则称为此关系的外键。

外键表示了两个关系之间的相关联系。 以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。

2. 约束

在我们上面所谈的关系模式R,只是说明了关系的语法,但并不是所有满足语法的元组都能够成为R的元组,他们还要受到语义限制,即一些约束。例如主键的值不能为NULL。而一个属性或一组属性能够称为一个关系的主键,完全取决于数据的语义,而不是语法。

语义完整性约束可以有用户来检查,也可以由系统来检查。完整性约束只有在做数据库更新操作时才需进行。由于它的开销很大,它对数据库更新操作的性能影响颇大。以下将关系数据模型完整性约束分四类论述:

域完整性约束:属性值应该是域中的值,一个属性是否可以为NULL。

实体完整性约束:每个关系应该有一个主键,且每个元组的主键值唯一。主键值不可为NULL。

引用完整性约束:此约束是不同关系之间或者同一关系的不同元组间的约束。其内容为:外键要么是空缺的,要么是引用实际存在的主键值。

一般完整性约束:这里是指除以上三种约束外的语义约束,他们与数据的具体内容有关,数量很大,要说明、管理和检查这些约束,开销太大。

3. 操作

这里介绍关系模型中的几个基本操作,还有其他更复杂的操作,一方面用的少,另一方面均可由基本操作实现,所以不做介绍。

1)选择操作

一元关系操作,作用在一个关系上,按照给定的选择条件,给出符合条件的元组。可表示为(勿忘关系等于表):
σ ( ⟨ 选 择 条 件 ⟩ ) ( ⟨ 关 系 名 ⟩ ) \sigma_{(\langle选择条件\rangle)}(\langle 关系名 \rangle) σ()()
如:从STUDENT表中选出名为‘张三’的人
σ ( ⟨ 姓 名 = ‘ 张 三 ’ ⟩ ) ( ⟨ S T U D E N T ⟩ ) \sigma_{(\langle姓名=‘张三’\rangle)}(\langle STUDENT \rangle) σ(=)(STUDENT)

2)投影操作

一元操作,作用在一个关系上,选择操作选取关系的某些行,而投影操作选取关系的某些列。可表示为:
Π ( ⟨ 属 性 表 ⟩ ) ( ⟨ 关 系 名 ⟩ ) \Pi_{(\langle属性表\rangle)}(\langle 关系名 \rangle) Π()()
如:选出STUDENT表中的性别、籍贯、出生年份列:
Π ( ⟨ 性 别 , 籍 贯 , 出 生 年 份 ⟩ ) ( ⟨ S T U D E N T ⟩ ) \Pi_{(\langle性别,籍贯,出生年份\rangle)}(\langle STUDENT \rangle) Π(,,)(STUDENT)

3)集合操作

关系是元组的集合,集合运算在原则上可适用于关系。在关系数据模型中,用得最多的集合操作是并和差,而交可以用差表示:
A ∩ B = A − ( A − B ) A\cap B = A-(A-B) AB=A(AB)
笛卡尔积:
R × S = { ⟨ t , g ⟩ ∣ t ∈ R & g ∈ S } R \times S = \{ \langle t, g \rangle | t \in R \And g \in S\} R×S={t,gtR&gS}
拼接:
在关系数据模型中,序偶 ⟨ t , g ⟩ \langle t,g \rangle t,g解释为 t t t g g g的拼接,即将元组 t t t g g g拼接成一个元组。

4)连接操作

二元关系操作,以符号 ⋈ \bowtie 表示。定义为:
R ⋈ ( 连 接 条 件 ) S = σ ( 连 接 条 件 ) ( R × S ) R\bowtie_{(连接条件)}S = \sigma_{(连接条件)}(R \times S) R()S=σ()(R×S)
连接条件为两关系中对应属性的比较,所谓对应属性不一定同名,但要有相同的域。

连接与笛卡尔乘积的区别在于笛卡尔乘积包含量关系的所有元组各种可能的组合,而连接只包含那些满足连接条件的元组组合。如果没有连接条件,则连接变成笛卡尔乘积。因此,在关系数据模型中,连接可以使用笛卡尔乘积表示。笛卡尔乘积可以看成连接的特例,两者不是互相独立的操作。

关于自然连接、外连接、内连接的区别,看这篇文章

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐