关系型数据库理论

数据库设计原理 专栏收录该内容
7 篇文章 0 订阅

目录

关系型数据库

关系型数据库,是指采用了关系模型来组织数据的数据库,借助集合代数等数学概念和方法来处理数据库中的数据。其中,关系模型,即:实体(Entity)之间的关系(Relationship),所以也称为 E-R 模型(Entity-Relationship Model),现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。而集合代数则描述了集合的基本性质和规律,如:并集、交集、补集,以及集合的关系,如:等于、包含、被包含。

  • 关系模型和 “科德十二定律” 由 E.F.Codd 于 1970 年首先提出的,关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成,作为关系型数据库的基石。

  • E-R 模型由陈品山(Peter P.S Chen)博士于 1976 年提出的一套数据库的设计工具,运用了显式世界中的事物与关系的观念,来解释数据库中的抽象的数据架构。E-R 模型利用图形的方式(E-R 图)来表示数据库的概念设计,有助于设计过程中的构思及沟通讨论。

  • SQL(Structured Query Language,结构化查询语言)由 Boyce 和 Chamberlin 于 1974 年提出,作为关系型数据库语言的标准,是一种介于关系代数与关系演算之间的结构化查询语言(具有关系代数和关系演算双重特征),执行对关系型数据库中数据的检索和操作。

关系型数据库以行(Row)和列(Column)的形式存储数据,这一系列的行和列被称为表(Table),包括基础表、派生表(查询结果)和虚拟表(视图),一组表再组成了数据库。从这个角度来看,“实体” 可以理解为二维表格模型,而 “关系” 则是这些二维表及其之间的组织方式。简而言之,关系型数据库是由多张能互相联接的二维行列表格组成的数据库。

关系型数据库的特点:

  1. 基于模型的储存方式,也称为结构化存储,储存结构化数据:关系型数据库采用行列二维表格的方式进行存储。并且每个数据表的表项(列)都必须预先定义好该字段的属性(例如:类型、长度),然后再严格按照数据表的结构存入数据。结构化存储的好处在于数据的结构在存入之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高;相对的,结构化存储的灵活性就会很差,一旦存入数据后再要修改数据表的结构就会十分困难。这就要求了关系型数据库应用系统必须要考虑数据库灰度升级的方案(注:这里不是指 RDBMS 软件的升级)。

  2. 存储规范:关系型数据库为了避免储存冗余数据以及充分利用好存储空间,要求数据按照最小关系表的形式进行储存,根据合理的范式进行分表。

  3. 扩展方式:关系型数据库数据操作的瓶颈主要有两个方面:1)运行环境的硬件性能;2)数据库表设计的合理性。关系型数据库多表之间可能存在复杂的关联关系(例如:多表级联查询),而且数据表越多这个问题越严重。也由于多表间所具有的关联关系,导致关系型数据库不具备分布式运行的条件。关系型数据库大多采用主备高可用方案,只能纵向扩展,无法很好地实现原生的分布式集群方案。相对的大多数非关系型数据库都支持集群模式。

  4. 查询方式:关系型数据库采用结构化查询语言(即 SQL)来对数据库进行查询,SQL 支持 CRUD(增加,查询,更新,删除)操作,还可以采用类似索引的方法来加快查询操作。

  5. 事务性:即 ACID 规则,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  6. 读写性能:关系型数据库十分强调数据的一致性,并为此付出了降低读写性能的代价。因此相对于非关系型数据库,关系型数据库具有非常不错的数据处理可靠性,但高并发读写性能欠佳。

科德十三准则(RDBMS 十三准则)

全关系系统应该完全支持关系模型的所有特征。关系模型的奠基人埃德加·科德具体地给出了全关系系统应遵循的基本准则。

  1. 一个关系型的关系数据库管理系统必须能完全通过它的关系能力来管理数据库。
  2. 信息准则:关系数据库管理系统的所有信息都应该在逻辑一级上用表中的值这一种方法显式的表示。
  3. 保证访问准则:依靠表名、主键和列名的组合,保证能以逻辑方式访问关系数据库中的每个数据项。
  4. 空值的系统化处理:全关系的关系数据库管理系统支持空值的概念,并用系统化的方法处理空值。
  5. 基于关系模型的动态的级联数据字典数据库的描述在逻辑级上和普通数据采用同样的表述方式。
  6. 统一的数据子语言:一个关系数据库管理系统可以具有几种语言和多种终端访问方式,但必须有一种语言,它的语句可以表示为严格语法规定的字符串,并能全面的支持各种规则。
  7. 视图更新准则:所有理论上可更新的视图也应该允许由系统更新。
  8. 高级的插入、修改和删除操作:系统应该对各种操作进行查询优化。
  9. 数据的物理独立性:无论数据库的数据在存储表示或访问方法上作任何变化,应用程序和终端活动都保持逻辑上的不变性。
  10. 数据逻辑独立性:当对基本关系进行理论上信息不受损害的任何改变时,应用程序和终端活动都保持逻辑上的不变性。
  11. 数据完整的独立性:关系数据库的完整性约束条件必须是用数据库语言定义并存储在数据字典中的。
  12. 分布独立性:关系数据库管理系统在引入分布数据或数据重新分布时保持逻辑不变。
  13. 无破坏准则:如果一个关系数据库管理系统具有一个低级语言,那么这个低级语言不能违背或绕过完整性准则。

ACID 原则

  • 原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 一致性(Consistency):指一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态,即:从一个一致性状态变换到另外一个一致性状态。

  • 隔离性(Isolation):指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

  • 持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

事务的 ACID 特性是由 RDBMS 来实现的。RDBMS 通常会采用日志机制来保证事务的 ACID。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。简单来说:

  • 原子性:要么全有,要么全无;
  • 一致性:每次读取的都必须是最新数据;
  • 隔离性:多并发事务互相隔离,对共享数据加锁;
  • 持久性:数据最终的落盘变更是持久而不变的。

数据结构

数学建模

  • 域(Domain):是一组具有相同数据类型的值的集合。例如:整数、实数、介于某个取值范围的整数、指定长度的字符串集合、{‘男’,‘女’}。

  • 笛卡尔积(Cartesian Product):表示为 X × Y,第一个对象是 X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。假设集合 X={a, b},集合 Y={0, 1, 2},则两个集合的笛卡尔积为 {(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。在关系数据结构中,运算因子为一组域,例如:D1,D2,…,Dn。

在这里插入图片描述

  • 元组(Tuple):笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个 n 元组(n-tuple)。

  • 分量(Component):笛卡尔积元素(d1,d2,…,dn)中的每一个值 d[i] 叫作一个分量。

  • 基数(Cardinal number):若 di(i=1,2,…,n)为有限集,其基数为 mi(i=1,2,…,n)。简而言之,基数就是笛卡尔积中所包含的元组的数量。例如:D1×D2×…×Dn 的基数 M 为:
    在这里插入图片描述
    下面看一个示例。

给出 3 个域:

  1. D1 = 导师集合 SUPERVISOR ={张清玫,刘逸}
  2. D2 = 专业集合 SPECIALITY ={计算机专业,信息专业}
  3. D3 = 研究生集合 POSTGRADUATE ={李勇,刘晨,王敏}

D1,D2,D3 的笛卡尔积为:

D1×D2×D3={
(张清玫,计算机专业,李勇),(张清玫,计算机专业,刘晨),
(张清玫,计算机专业,王敏),(张清玫,信息专业,李勇),
(张清玫,信息专业,刘晨),(张清玫,信息专业,王敏),
(刘逸,计算机专业,李勇),(刘逸,计算机专业,刘晨),
(刘逸,计算机专业,王敏),(刘逸,信息专业,李勇),
(刘逸,信息专业,刘晨),(刘逸,信息专业,王敏)

基数为:2 × 2 × 3=12。

实现表征

回头再看关系数据结构在关系型数据库中的应用,当我们要查询的数据被存放在 n 张表时,RDBMS 首先需要对 n 张表求得笛卡尔积,然后在根据过滤条件返回其中的 m 个元组(记录)。

  • 笛卡尔积 R(D1×D2×…×Dn) 的子集叫作在域 D1,D2,…,Dn 上的一个关系(R:关系名;n:关系的目)。对于关系型数据库而言,笛卡尔积的某个子集才有实际含义。
  • 关系表现为一张二维表,每行对应一个元组,每列或多列对应一个域。
  • 关系中不同列可以对应一个相同的域,为了加以区分,必须对每列起一个名字,称为属性(Attribute), n 目关系必有 n 个属性。
  • 码(键):
    • 候选码(Candidate key):若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码。
    • 全码(All-key):极端的情况,关系中的所有属性组都是这个关系的候选码,称为全码。
    • 主码(Primary key):若一个关系有多个候选码,则选定其中一个为主码。
    • 主属性:候选码的主属性(Prime attribute),不包含在任何侯选码中的属性称为非主属性(Non-Prime attribute)或非码属性(Non-key attribute)

关系的性质:

  • 列是同质的(Homogeneous)。
  • 不同的列可以出自同一个域,其中的每一列称为一个属性,不同的属性要给予不同的属性名。
  • 行或列的顺序无所谓。
  • 任意两个元组的候选码不能相同。
  • 分量必须取原子值。

完整性约束

完整性约束用于维护数据的完整性或者满足业务约束的需求。实体完整性、参照完整性是关系模型必须满足的完整性约束条件,称为关系的两个不变性,应该由 RDBMS 支持。而用户定义的完整性,是应用领域需要遵循的约束条件,体现了具体领域中的语义约束 。

实体完整性(主键约束)

规则:

  1. 若属性 A 是基本关系 R 的主属性,则属性 A 不能取空值。
  2. 空值就是 “不知道” 或 “不存在” 或 “无意义” 的值。

规则说明:

  • 实体完整性规则是针对基本关系而言的,一个基本表通常对应现实世界的一个实体集。
  • 现实世界中的实体是可区分的,即它们具有某种唯一性标识。
  • 关系模型中以主码作为唯一性标识。
  • 主码中的属性即主属性不能取空值。主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。

参照完整性(外键约束)

注:参照,Reference 也翻为 “引用”。

规则:若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 Ks 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 中每个元组在 F 上的值必须为:

  • 或者取空值(F 的每个属性值均为空值)。
  • 或者等于 S 中某个元组的主码值。

关系间的引用

在关系模型中实体及实体间的联系都是用关系来描述的,自然存在着关系与关系间的引用。

如下例:

  • “学号” 是主码,“班长” 是外码,它引用了本关系的 “学号”。
  • “班长” 必须是确实存在的学生的学号。

在这里插入图片描述

外码(键)

设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码。如果 F 与基本关系 S 的主码 Ks 相对应,则称 F 是 R 的外码。

  • 基本关系 R 称为参照关系(Referencing Relation)
  • 基本关系 S 称为被参照关系(Referenced Relation)或目标关系(Target Relation)

规则:

  • 关系 R 和 S 不一定是不同的关系。
  • 目标关系 S 的主码 Ks 和参照关系的外码 F 必须定义在同一个(或一组)域上。
  • 外码并不一定要与相应的主码同名,当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别。

例如:

  • 学生关系的 “专业号” 与专业关系的主码 “专业号” 相对应。
  • “专业号” 属性是学生关系的外码。
  • 专业关系是被参照关系,学生关系为参照关系。

在这里插入图片描述

用户定义完整性(非空约束、唯一约束、检查约束和默认值)

用户定义完整性是针对某一具体关系数据库的约束条件,反映某一具体数据库应用程序所涉及的数据必须满足的语义要求。RDBMS 应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能。

例如:课程(课程号,课程名,学分)

  • “课程号” 属性必须取唯一值。
  • 非主属性 “课程名” 也不能取空值。
  • “学分” 属性只能取值 {1,2,3,4}。

操作集合

关系操作的本质就是集合的操作,操作的对象和结果都是集合,一次一集合的方式。

  • 数据查询操作:选择(Selection)、投影(Projection)、连接(Join)、并集(Union)、差集(Exception)、交集(Intersection)、笛卡尔积(Cartesian product)、除。其中,选择、投影、并、差、笛卡尔基是 5 种基本操作。
  • 数据更新操作:插入、删除、修改。

关系代数运算

关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。运算对象是关系、运算结果亦为关系、关系代数的运算符有两类:集合运算符和专门的关系运算符。

  • 传统的集合运算是从关系的 “水平” 方向即行的角度进行。
  • 专门的关系运算不仅涉及行而且涉及列。

关系代数运算符:
在这里插入图片描述

传统的集合运算

  • R:
    在这里插入图片描述

  • S:
    在这里插入图片描述

R 和 S:

  • 具有相同的 n 目(即两个关系都有 n 个属性)
  • 相同的属性取自同一个域。

并集运算

R ∪ S:仍为 n 目关系,由属于 R 或属于 S 的元组组成。

在这里插入图片描述

差集运算

R - S:仍为 n 目关系,由属于 R 而不属于 S 的所有元组组成。

在这里插入图片描述

交集运算

R ∩ S:仍为 n 目关系,由既属于 R 又属于 S 的元组组成。

在这里插入图片描述

笛卡尔积

R × S:

  • 列:(n + m)列元组的集合,元组的前 n 列是关系 R 的一个元组,后 m 列是关系 S 的一个元组。
  • 行:k1 × k2 个元组。

在这里插入图片描述

专门的关系运算

在这里插入图片描述

  • Student
    在这里插入图片描述

  • Course
    在这里插入图片描述

  • S-C:
    在这里插入图片描述

选择运算(WHERE 根据条件过滤行)

选择运算又称为限制(Restriction):在关系中选择满足给定条件的元组。选择条件是一个逻辑表达式,例如:>,≥,<,≤,= 或 <>,结果为 “真” 或 “假”。选择运算主要是从列的角度进行运算。

例如:查询 IS 系(信息系)全体学生。

在这里插入图片描述

投影运算(SELETE 显式选取列)

从关系 R 中选择出若干属性列组成新的关系 S。投影运算主要是从列的角度进行运算。投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)。

在这里插入图片描述

例如:查询学生的姓名和所在系。即:求 Student 关系上学生姓名和所在系两个属性上的投影。

在这里插入图片描述

连接运算(JOIN 多表级联)

在这里插入图片描述

连接运算有以下类型:

  • 等值连接:是条件连接(或称 θ 连接)在连接运算符为 “=” 号时。例如:select * from A, B where A.学号=B.学号

  • 非等值连接:对比等值连接,例如:select * from B, B mm where B.成绩>mm.成绩

  • 自连接:自己和自己做笛卡尔积,例如:select * from A mm, A tt where mm.姓名=tt.姓名

  • 自然连接:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。即:自然连接使用多表中所有相同字段(不但值相同,名字也要相同)进行连接(两表中有几个相同,就连接合并几个相同字段)。例如:select * from A natural join B

  • 外连接(Outer Join):将两个表等值连接了起来,次结果会将 A 表或 B 表中不符合的行删除。此时保留不合格的次行信息,便有了左外连接和右外连接和全连接。

    • 左外连接(LEFT OUTER JOIN 或 LEFT JOIN),左表 A 的记录将会全部表示出来,而右表 B 只会显示符合搜索条件的记录。右表记录不足的地方均为 NULL。例如:select * from A left outer join B on A.成绩=B.成绩 order by A.学号
    • 右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN),与左外连接实现效果相反。
    • 全连接(FULL OUTER JOIN 或 FULL JOIN):同时实现了左外和右外连接的效果。

除运算

除运算是同时从行和列角度进行运算。

  • 给定关系 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 分别为下图。

  • R
    在这里插入图片描述

  • S
    在这里插入图片描述

  • R / S
    在这里插入图片描述

在关系 R 中,A 可以取四个值 {a1,a2,a3,a4}

  • a1 的象集为 {(b1,c2),(b2,c3),(b2,c1)}
  • a2 的象集为 {(b3,c7),(b2,c3)}
  • a3 的象集为 {(b4,c6)}
  • a4 的象集为 {(b6,c6)}

关系 S 在 (B,C) 上的投影为:{(b1,c2),(b2,c1),(b2,c3) }

只有 a1 的象集包含了 S 在 (B,C) 属性组上的投影,所以 R / S = {a1}。

主流的 RDBMS

下面列举笔者使用过的几个主流 RDBMS:

  • Oracle:Oracle 公司前身叫 SDL,由 Larry Ellison 和另两个编程人员在 1977 创办,是最早的 RDBMS 厂商之一。1983 年,Oracle 公司发布了世界上第一个商业化 RDBMS。

  • MySQL:是一个轻量级的开源 RDBMS,开发者为瑞典 MySQL AB公司。MySQL 是最流行的关系型数据库管理系统之一,在 2008 年被 Sun 公司收购,然后又被 Oracle 收购并闭源。在社区切出了开源分支 MariaDB,所以 MySQL 常被诟病为不纯粹的开源软件。

  • PostgreSQL:是以加州大学伯克利分校计算机系开发的 ORDBMS(对象关系型数据库管理系统),完全开源并由社区驱动,具有可以说是目前世界上最丰富的数据类型的支持。另外,PostgreSQL 是目前唯一一个同时支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的开源数据库管理系统。

参考文档

https://blog.csdn.net/sjjsaaaa/article/details/106781879

  • 2
    点赞
  • 2
    评论
  • 14
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值