CMU-15445


背景

在没有数据库的情况下,我们可以使用简单的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 的具体实现方式,但在之后的课程将会看到它对查询优化、执行的帮助。

Advanced SQL


文章作者: 不二
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不二 !
  目录