关系型数据库,是指采用了关系模型来组织数据的数据库,借助集合代数等数学概念和方法来处理数据库中的数据。其中,关系模型,即:实体(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),包括基础表、派生表(查询结果)和虚拟表(视图),一组表再组成了数据库。从这个角度来看,“实体” 可以理解为二维表格模型,而 “关系” 则是这些二维表及其之间的组织方式。简而言之,关系型数据库是由多张能互相联接的二维行列表格组成的数据库。
关系型数据库的特点:
基于模型的储存方式,也称为结构化存储,储存结构化数据:关系型数据库采用行列二维表格的方式进行存储。并且每个数据表的表项(列)都必须预先定义好该字段的属性(例如:类型、长度),然后再严格按照数据表的结构存入数据。结构化存储的好处在于数据的结构在存入之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高;相对的,结构化存储的灵活性就会很差,一旦存入数据后再要修改数据表的结构就会十分困难。这就要求了关系型数据库应用系统必须要考虑数据库灰度升级的方案(注:这里不是指 RDBMS 软件的升级)。
存储规范:关系型数据库为了避免储存冗余数据以及充分利用好存储空间,要求数据按照最小关系表的形式进行储存,根据合理的范式进行分表。
扩展方式:关系型数据库数据操作的瓶颈主要有两个方面:1)运行环境的硬件性能;2)数据库表设计的合理性。关系型数据库多表之间可能存在复杂的关联关系(例如:多表级联查询),而且数据表越多这个问题越严重。也由于多表间所具有的关联关系,导致关系型数据库不具备分布式运行的条件。关系型数据库大多采用主备高可用方案,只能纵向扩展,无法很好地实现原生的分布式集群方案。相对的大多数非关系型数据库都支持集群模式。
查询方式:关系型数据库采用结构化查询语言(即 SQL)来对数据库进行查询,SQL 支持 CRUD(增加,查询,更新,删除)操作,还可以采用类似索引的方法来加快查询操作。
事务性:即 ACID 规则,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
读写性能:关系型数据库十分强调数据的一致性,并为此付出了降低读写性能的代价。因此相对于非关系型数据库,关系型数据库具有非常不错的数据处理可靠性,但高并发读写性能欠佳。
全关系系统应该完全支持关系模型的所有特征。关系模型的奠基人埃德加·科德具体地给出了全关系系统应遵循的基本准则。
原子性(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 个域:
D1,D2,D3 的笛卡尔积为:
D1×D2×D3={
(张清玫,计算机专业,李勇),(张清玫,计算机专业,刘晨),
(张清玫,计算机专业,王敏),(张清玫,信息专业,李勇),
(张清玫,信息专业,刘晨),(张清玫,信息专业,王敏),
(刘逸,计算机专业,李勇),(刘逸,计算机专业,刘晨),
(刘逸,计算机专业,王敏),(刘逸,信息专业,李勇),
(刘逸,信息专业,刘晨),(刘逸,信息专业,王敏)
}
基数为:2 × 2 × 3=12。
回头再看关系数据结构在关系型数据库中的应用,当我们要查询的数据被存放在 n 张表时,RDBMS 首先需要对 n 张表求得笛卡尔积,然后在根据过滤条件返回其中的 m 个元组(记录)。
关系的性质:
完整性约束用于维护数据的完整性或者满足业务约束的需求。实体完整性、参照完整性是关系模型必须满足的完整性约束条件,称为关系的两个不变性,应该由 RDBMS 支持。而用户定义的完整性,是应用领域需要遵循的约束条件,体现了具体领域中的语义约束 。
规则:
规则说明:
注:参照,Reference 也翻为 “引用”。
规则:若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 Ks 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 中每个元组在 F 上的值必须为:
在关系模型中实体及实体间的联系都是用关系来描述的,自然存在着关系与关系间的引用。
如下例:
设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码。如果 F 与基本关系 S 的主码 Ks 相对应,则称 F 是 R 的外码。
规则:
例如:
用户定义完整性是针对某一具体关系数据库的约束条件,反映某一具体数据库应用程序所涉及的数据必须满足的语义要求。RDBMS 应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能。
例如:课程(课程号,课程名,学分)
关系操作的本质就是集合的操作,操作的对象和结果都是集合,一次一集合的方式。
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。运算对象是关系、运算结果亦为关系、关系代数的运算符有两类:集合运算符和专门的关系运算符。
R 和 S:
R ∪ S:仍为 n 目关系,由属于 R 或属于 S 的元组组成。
R - S:仍为 n 目关系,由属于 R 而不属于 S 的所有元组组成。
R ∩ S:仍为 n 目关系,由既属于 R 又属于 S 的元组组成。
R × S:
选择运算又称为限制(Restriction):在关系中选择满足给定条件的元组。选择条件是一个逻辑表达式,例如:>,≥,<,≤,= 或 <>,结果为 “真” 或 “假”。选择运算主要是从列的角度进行运算。
例如:查询 IS 系(信息系)全体学生。
从关系 R 中选择出若干属性列组成新的关系 S。投影运算主要是从列的角度进行运算。投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)。
例如:查询学生的姓名和所在系。即:求 Student 关系上学生姓名和所在系两个属性上的投影。
连接运算有以下类型:
等值连接:是条件连接(或称 θ 连接)在连接运算符为 “=” 号时。例如: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 表中不符合的行删除。此时保留不合格的次行信息,便有了左外连接和右外连接和全连接。
select * from A left outer join B on A.成绩=B.成绩 order by A.学号
。除运算是同时从行和列角度进行运算。
示例:设关系 R、S 分别为下图。
在关系 R 中,A 可以取四个值 {a1,a2,a3,a4}
关系 S 在 (B,C) 上的投影为:{(b1,c2),(b2,c1),(b2,c3) }
只有 a1 的象集包含了 S 在 (B,C) 属性组上的投影,所以 R / S = {a1}。
下面列举笔者使用过的几个主流 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