跳转至

关系模型与关系代数

1.简介

无论是主流的关系数据库或者其他非关系数据库,它们的本质都是由无序的数据集构成模型,且能够提供高效的查询、修改等操作的系统。

同时,数据库往往能支持许多特性,如事务、并发控制、原子操作等,甚至支持分布式等能力。

15-445主要讨论的是关系模型下的关系数据库。关系模型的数据结构常常以关系,也称之为表(relation、table)呈现,其中relations是由无序的元组(tuple)组成的。tuple在table中表现为行,由各个属性(attributes)组成,表现为table中的列。

2.关系模型

如有一张名为instructor的表,如下所示

ID Name dept_name Salary
10101 Srinivasan Comp.Sci. 65000
12121 Wu Finance 90000

其中定义了tuple结构的 |ID|name|dept_name|salary| 称之为模式(schema),按照schema定义存储的行就是上述的tuple,其属性为attribute。

schema不仅定义了tuple的组成,还需要定义主码(primary key),利用primary key去区分关系中不同的tuple。

关系模型有三类完整性约束(Integrity)

  • 实体完整性:指的是一个tuple的primary key不能为空。事实上,若开发者在定义schema时没有制定primary key,数据库会自行利用唯一的方式去构建primary key。在MySQL中,如果没有主动设置主键,MySQL就会选一个不包含NULL的第一个唯一索引列作为主键列,并利用它生产聚集索引。如果没有这样的索引就会利用行号作为主键,大小为6bytes,并且自增。可以用select _rowid from table来查询。
  • 参照完整性:是指参照关系中每个元素的外码(foreign key)要么为空(NULL),要么等于被参照关系中某个元素的主码。这也是foreign key的定义:对于参照关系的每一个tuple来说,foreign key的取值肯定等于被参照关系中某个tuple中primary key的取值。
  • 用户定义的完整性:比如primary key常用的自增约束,非空(NOT NULL)约束等

实体完整性很好理解,用于识别唯一的tuple;参照完整性主要用于在多表进行合并(JOIN)时,将tuple进行一一对应;用户定义的完整性则是去除部分不合理的数据。

因此,除了还没有提到的操作(Manipulation),关系模型主要关注三方面

  • Structure:关系的定义。
  • Integrity:保证数据的合理。
  • Manipulation:如何去对数据进行操作。

3.SQL & 关系代数

SQL是数据库操作语言,通过上层的关系逻辑运算对已有的一个或多个table进行操作,从而生成新的table的工具。

常见的关系代数有

  • 投影Projection(π):选择table中特定的attribute,生成新的表table。
  • 选择Select(σ):类似Filter,将table作为输入,输出为经过筛选的subset table。
  • 并运算Union(∪):取两个table的交集作为输出,拥有自动去重的能力。
  • 交运算Intersection(∩):取两个table的交集作为输出。
  • 差运算Difference(-):取两个table的差集作为输出。
  • 笛卡尔积Product(×):生成两个table所有可能的tuple作为新的table。
  • 连接Join:用于把来自两个或多个表作为输入,基于这些表之间的共同字段将tuple结合起来,可以看成是Product的扩展。

参考与扩展

Why Tables need a Primary Key in MariaDB and MySQL

SQL 与关系代数