type
status
date
slug
summary
tags
category
icon
password
2.1 关系及其相关概念
2.1.1 关系模型提出
历史,了解即可
关系模型以关系代数理论为数学基础,将数据操作抽象为关系处理,其关系表结构简单,便于理解和访问。关系模型在当今几乎所有商业数据库中得到广泛应用
2.1.2 实体、关系的概念
- 实体:实体(entity)是指包含有数据特征的事物对象在概念模型世界中的抽象名称。(有点像java中的对象)
- 关系:关系(relation)是指具有关系特征、用于存放实体数据的二维表。关系也常被称为关系表(所以一个关系就是一张表格)
- 实体与关系之间的关系:在关系模型中,使用“关系”来存储“实体”中的数据(说人话版本:使用表格来存储现实世界中的事物对象的数据)
- 关系的特征(首先需要知道在一个关系表中,一个列被称作一个属性,一个行被称为一个元组)
- 表中每行存储实体的一个实例数据(也就是一个数据元组)
- 表中每列包含实体的一项属性数据
- 表中单元格只能存储单个值
- 不允许有重复的行
- 不允许有重复的列
- 列顺序可任意
- 行顺序可任意
- 条目类型需要一致(也就是每一个元组都是一个属性域上的一个取值)
2.1.3 关系的数学定义
- 关系的数学定义:关系是指在集合域 D1、…、Dn 上(这个应该就是所有的属性域)运算笛卡儿积的有意义子集,其数学描述为 R ⊆ D1 × … × Dn。(实际上也就是关系就是一张属性域上的表格)
而元组就是D1 × … × Dn上的一个特定元素(d1,d2,...,dn)。
说明:关系R只是该笛卡儿积的有意义子集,即关系R的元组数<=笛卡儿积的元组数。针对有意义子集,下面有一个例子:
2.1.4 关系的键定义
疑问,什么键是要求要是最小属性集合来着?
- 关系中键的定义:在关系中,可以用来唯一标识元组的属性列(并不一定是只有一列),称为键(Key),其它属性列都为非键列。(所以键是一个属性列)
- 复合键:复合键(Compound Key)是指关系中用来唯一标识元组的多列作为键
- 候选键:候选键(Candidate Key)关系中可能有多个列均适合作为键,将其中每个都称为候选键。(就是所有的键都是候选键。另外,候选键没有多余属性)
- 主键:主键(Primary key)是关系表中最有代表性的一个候选键(所以主键也是候选键),每个关系表中只能定义一个主键。(主键一定非空)
- 唯一标识关系表的每行(元组)
- 与关联表的外键建立联系,实现关系表之间连接(某张表的外键一定是另一张表的主键)
- 数据库文件使用主键值来组织关系表的数据存储
- 数据库使用主键索引快速检索数据
- 代理键:代理键是采用DBMS自动生成的数字序列作为关系表的主键
- 外键:外键是一个或多个字段(也就是属性),其值必须匹配另一个表的主键。外键用于建立表之间的关系,实现数据的引用完整性
主键的作用如下:
代理键的用途:由DBMS自动生成的数字序列作为主键,可替代复合主键(也就是说主键是复合键的时候可以尝试使用代理键),以便获得更高性能的数据访问操作处理。
2.1.5 关系模式语句表示
- 关系模式语句表示如下:
- 关系模式语句中主键表示方法:关系名(主键属性,属性2,…,属性x)(实际上就是把主键放在属性序列中的第一个)。下面有一个示例:
其实创建一张关系表的时候也是使用了关系模式的语句表示,只不过加上了一些约束
2.2 关系模型原理
2.2.1 关系模型及其组成
- 关系模型概念:关系模型(Relation Model)是一种基于二维表结构存储数据实体及实体间联系的数据模型(与第一章中的概念是相同的)
下面开始讨论数据模型的三个要素——数据结构、数据操作、数据约束
- 关系模型的数据结构:二维表以及表之间的联系。如下图:
- 关系模型的数据操作
- 集合运算操作:交(intersection)、并(union)、差(difference)等(这里将集合相关的操作放在这里是因为关系数据模型支持集合的操作)
- 关系运算操作:包括选择(select)、投影(project)、连接(join)等(这里将集合相关的操作放在这里是因为关系数据模型支持关系的操作)
- 针对元组的关系操作:包括数据行插入(Insert)、 修改(Update)、删除(Delete)操作(增删改。这些针对元组的关系操作都是由关系运算操作导出的)
- 关系模型的数据约束:在关系模型中,数据关系约束是指关系表中实体数据完整性(一张表中)、关联表之间数据一致性(关联表中)等要求,一般由业务需求来确定。
- 属性列取值类型
- 属性列取值范围
- 属性列取值是否唯一(是否是主键)
- 属性列是否允许空值
- 关联表的参照完整性约束(如果存在外键,那么在另一张表中一定有以这一项为主键的元组)
常见的关系表数据约束如下(只要想想创建一张关系表的时候需要填什么就好了):
下面将对关系数据模型的三个组成部分进行进一步的说明
2.2.2 关系模型数据操作
- 关系模型的数据操作:关系模型数据操作采用基于关系代数的数据操作,包括传统的集合运算操作和专门的关系运算操作(跟上面简要介绍的关系模型中的数据操作是一样的。这里的集合运算操作跟集合论中学的是一样的,就简单过了)
- 集合运算数据操作
- 关系“并运算∪”操作:关系并运算∪的结果集是由属于R或属于S的所有元组组成。
- 关系并运算∪的前提:关系R与关系S需有相同属性组成(也就是列要相同)
- 关系“差运算-”操作:关系差运算的结果集是由属于R,而不属于S的所有元组组成
- 关系差运算-的前提:关系R与关系S需有相同属性组成。
- 关系“交运算∩”操作:关系交运算∩的结果集是由既属于R又属于S的所有元组组成
- 关系差运算∩的前提:关系R与关系S需有相同属性组成。
- 关系“笛卡尔积x”操作:笛卡儿积运算的结果集是由所有属于R的元组与所有属于S的元组进行组合而成(这个就不要求属性组成相同了)
- 关系运算数据操作
这里有一些表示方法,实际上就是一些集合的符号,看看就好了,没什么难度:
这里说的属性列(这里也被称为属性组)还有点难理解,实际上就是一个属性的集合
需要注意的是这里出现了一个新的名词——目,目实际上就是一个关系中的属性的数量。
连接实际上就是将两张表并排放置了(在没有给出连接条件的情况下,但是一般会指定连接的条件,也会去指定是不是外连接等)。
这里其实给的解释挺好的,它表示R中属性组X上值为x的诸元组在Z上分量的集合(可能有多个元组在X属性组上的值为x,但是他们在Z属性组上分量的值不同,这些在Z属性组上不同的值就构成了x的象集)。
- 选择:选择又称为限制(Restriction)(也就是根据某个条件从关系表中选取若干元组),是从行的角度进行的运算(因为是选出若干条元组)
- 选择运算符的含义:在关系 R 中选择满足给定条件的诸元组,数学表达式为:σF(R) = {t|t∈R∧ F(t)= '真'}。其中F:选择条件,是一个逻辑表达式
下面是一个选择的示例:
这里也可以用列序号代替属性名称
- 投影:投影操作主要是从列的角度进行运算(因为是选择出若干属性列)。投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行,也就是说投影操作会删除重复行)
- 投影运算符的含义:从关系R中选择出若干属性列(所以是针对列进行的运算)组成新的关系。数学表达式为:πA(R) = { t[A] | t∈R }。其中A是R中的某个属性列(还记得不,属性列是一个关系表中属性的集合)
下面是一个投影的示例:
image-20240515213028131
image-20240515213036195
同样能发现,在投影中也可以直接使用列序号来代替属性名(投影操作会去重)
- 连接:连接也称为θ连接。连接运算从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系的元组。(所以进行连接的时候会进行一次笛卡尔积运算和一次选择运算。在做题的时候就可以先构建出笛卡尔乘积然后再进行选取。这个在写SQL语句的时候也挺有用的,比如用JOIN ON语句的时候)。一般的连接操作是从行的角度进行运算(也就是对元组进行拼接)
- 连接运算的含义:从两个关系的笛卡尔积中选取属性间满足一定条件的元组。数学表达式如下:
- 两类常用连接运算
- 等值连接(equijoin):θ为“=”的连接运算称为等值连接(就是要求属性列要的取值要相等)
- 等值连接的含义:从关系R与S的广义笛卡尔积中选取A、B属性值相等(AB在定义中说明了一定是可比的属性列)的那些元组。数学表达式为:
- 自然连接:自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是相同的属性组(所以自然连接应该是要求AB两个属性组相同的等值连接),并在结果中把重复的属性列去掉(需要去除重复的列)。因为自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
- 自然连接的含义:R和S具有相同的属性组B,则自然连接的数学表达式为:
image-20240515213341541
其中:
A和B:分别为R和S上度数相等(度数也就是目数,就是属性的数量)且可比的属性组
θ:比较运算符
image-20240515213838227
实际上就是把连接中的θ换成了=
image-20240515214400763
也就是在两个关系中,取出在某个相同属性组上值相等的元组。但是上面好像有点问题,就是他没有去除重复的列(但是去除重复的列的数学表达好像有点难。。。)
疑问,在自然连接中是没有给出连接条件的,这个时候如何确定两个关系需要进行比较的相同属性组?是取最大的相同属性组吗?——从后面的例题来看应该就是取最大的相同属性组
- 除:除操作是同时从行和列角度进行运算(从行角度是因为对元组有要求,也就是在对行进行运算,而最后需要对挑选出来的元组进行投影,就是列角度的运算了)
- 除运算的含义:给定关系R (X,Y) 和S (Y,Z),其中X,Y,Z为属性组(再复习一下,属性组是属性的集合)。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集(就是可以是不同的属性组,但是值域需要相同)。R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合。数学表达为:R÷S = {tr [X] | tr ∈ R∧πY (S) ∈ Yx }。其中Yx表示x在R中的象集,x = tr[X]。(也就是跟Z属性组无关)
除运算比较复杂,这里摆一个例题:
image-20240515221941049
image-20240515221953035
2.2.3 关系模型完整性
这里直接开始讨论数据模型的三个组成中的数据约束。数据操作在上一节中讨论了。至于数据结构,对关系数据模型而言就是二维表以及表关联,也没什么好说的。
- 关系模型完整性:关系模型完整性是指在关系数据模型中对关系实施的完整性约束(这段话我只能说,如讲)
- 完整性约束作用
- 消除关系表的元组重复存储(实体完整性约束)
- 保持关联表的数据一致性(参照完整性约束)
- 实现业务数据规则(用户自定义完整性约束)
- 关系模型完整性约束组成
- 实体完整性约束(就是针对实体本身而言的)
- 参照完整性约束(针对表关系的)
- 用户自定义完整性约束
这里是一个总论,下面开始介绍各个完整性约束、
完整性约束实际上只要想想在数据库中创建表时需要提供的信息即可,比如是否是主键(对应实体完整性约束),是否是外键(对应参照完整性约束),是否为空,数据类型及长度(用户自定义完整性约束)等
2.2.4 实体完整性
- 实体完整性概念:实体完整性是指在关系表中实施的主键取值约束,以保证关系表中的每个元组可以被唯一标识
- 实体完整性约束规则(也就是主键非空且唯一)
- 每个关系表中的主键属性列都不允许为空值(NULL),否则就不可能标识实体
- 现实世界中的实体是靠主键来标识,主键取值应该唯一,并区分关系表中的每个元组
下面有一个关于实体完整性约束的例题:
image-20240515224727930
需要注意的是这里是一个复合主键,将StudentID和CourseID作为复合主键,所以这里要满足实体完整性就是要求这两个属性非空并且组合唯一,所以第一张表不满足实体完整性约束,因为主键为空;第二张表不满足实体完整性约束,因为主键不唯一;第三张表是满足实体完整性约束的。
2.2.5 参照完整性
参照完整性就像之前说的那样,是关于表之间关系的完整性的
- 参照完整性概念:参照完整性是指关系表之间需要遵守的数据约束,以保证关系之间关联列的数据一致性(即参照完整性是约束表之间的数据一致性的)
- 参照完整性约束规则:若关系R中的外键F与关系S中的主键K相关联,则R中外键F值必须与S中主键K值一致。换句话说就是,参照完整性是指外键取值必须与现有主键值对应(也就是一个外键值一定有对应的主键值,或者说外键的值域是小于主键的已有的取值域的)
- 外键:在关联的两个关系中,它们具有一个或多个相同属性。若关联列在第一个关系中作为主键,则在第二个关系中作为外键(所以只有当一个属性组是主键了他才有可能在其他表中是外键)
2.2.6 用户自定义完整性
- 用户自定义完整性概念:用户自定义完整性是指用户根据具体业务对数据处理规则要求所定义的数据约束
- 用户自定义完整性约束的类型(这个只要想想创建表格时的用户自定义完整性约束就好了)
- 定义列的数据类型与取值范围
- 定义列的缺省值
- 定义列是否允许取空值
- 定义列取值唯一性(这个感觉和实体完整性约束有相同点)
- 定义列之间的数据依赖性(这个感觉和参照完整性约束有相同点)
2.3中讲的是如何在PostgreSQL中创建关系以及相关的完整性约束,好像都是可视化操作,就没必要看了(感觉是在教我做作业。但是wyd的ppt上怎么图文无关…),只需要知道上一节中介绍的三种完整性约束即可,然后在创建一个关系的时候注意一下这三种完整性约束并且明确每一种数据约束是哪一种完整性约束就好了。
- 作者:Noah
- 链接:https://imnoah.top/article/DatabaseReview/ChapterTwo
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。