背景¶
在没有数据库的情况下,我们可以使用简单的csv文件来存储文件,并编写简单的脚本文件来查找数据。但是这种方案会有很多缺陷:
- 数据的质量
- 很难保证同一类型记录中相应字段的一致性
- 很难阻止用户写入该字段不合法的数据
- 很难优雅的处理数据之间的逻辑关系
- 实现方面
- 查询特定记录的效率低
- 当有多个应用使用时
- 查询脚本需要重复读
- 多个线程一起写时,如何保证数据一致性
- 数据持久
- 正在写记录时遇到宕机
- 如何复制数据到多台机器上保证高可用
针对上面的问题,提出了专业的数据库系统(DBMS)。
DBMS的提出¶
分离逻辑层和物理层¶
Ted Codd提出DBMS的抽象:
- 用简单的、统一的数据结构存储数据
- 通过高级语言操作数据
- 逻辑层和物理层分离,系统开发者只关心逻辑层,而DBMS开发者才关系物理层
数据模型¶
在逻辑层中,我们通常需要对所需存储的数据进行建模。如今,市面上有的数据模型包括:
- Relational => 大部分 DBMS 属于关系型,也是本课讨论的重点
- Key/Value
- Graph
- Document
- Column-family
- Array/Matrix
Relational Model¶
Relation & Tuple¶
每个 Relation 都是一个无序集合(unordered set),集合中的元素称为 tuple,每个 tuple 由一组属性构成,这些属性在逻辑上通常有内在联系。
Primary Keys¶
primary key 在一个 Relation 中唯一确定一个 tuple,如果你不指定,有些 DBMSs 会自动帮你生成 primary key。
Foreign Keys¶
foreign key 唯一确定另一个 relation 中的一个 tuple
DML¶
Data Manipulation Languages,即DML。
在 Relational Model 中从数据库中查询数据通常有两种方式:Procedural 与 NonProcedural:
- Procedural:查询命令需要指定 DBMS 执行时的具体查询策略,如 Relational Algebra
- Non-Procedural:查询命令只需要指定想要查询哪些数据,无需关心幕后的故事,如 SQL
使用哪种方式是具体的实现问题,与 Relational Model 本身无关。Relational Algebra
Relational Algebra¶
relational algebra 是基于 set algebra 提出的,从 relation 中查询和修改 tuples 的一些基本操作,它们包括:
- Select ( )
- Projection ( )
- Union ( )
- Intersection ( )
- Difference ( − )
- Product ( )
- Join ( )
- Rename ( )
- Assignment ( S )
- Duplicate Elimination ( )
- Aggregation ( )
- Sorting ( )
- Division ()
将这些操作串联起来,我们就能构建更复杂的操作
注意:使用 Relation Algebra 时,我们实际上指定了执行策略,如:
它们所做的事情都是 ”返回 R 和 S Join 后的结果中,b_id 等于 102 的 tuples“。
虽然 Relational Algebra 只是 Relational Model 的具体实现方式,但在之后的课程将会看到它对查询优化、执行的帮助。