《数据密集型应用系统设计》整理01

第二章 数据模型与查询语言

The limits of my language mean the limits of my world.
—Ludwig Wittgenstein, Tractatus Logico-Philosophicus (1922)

关系模型和文档模型

关系模型最著名的是SQL,我们在应用的时候都需要在应用代码和数据库模型之间插入一个笨拙的转换层,这个时候以JSON文档为代表的文档模型就派上了用场,我们可以将类似简历那样子的文档存放在数据库的文本列中。
关系的表示:以SQL为代表的关系模型所做的是定义了所有数据的格式:关系(表)只是元组(行)的集合。文档数据库则是某种类型的层次模型:即在其父记录中保存了嵌套记录。
文档模型对联结的支持不足,使用的时候需要按照应用程序来决定是否适用。
对于高度关联的数据,文档模型不太适合,关系模型可以胜任。

文档数据是读模式,数据的结构是隐形的,只有在读取时才解释。类似动态语言中的动态类型检查。
关系数据是写模式,模式是显式的,并且数据库确保数据写入时都遵从。类似静态类型检查。

文档数据库有查询的数据局部性优势,适合需要同时访问文档大部分内容的场景。

数据查询语言

SQL是一种声明式查询语言,MS和CODASYL是命令式的。

  • 命令式语言告诉计算机以特定顺序执行某些操作。
  • 声明式语言则只需指定所需的数据模式,结果需满足什么条件,以及如何转换数据,而不需指明如何实现这一目标。
    声明式查询语言比命令式API简洁和容易使用,对外隐藏了数据库引擎的很多细节实现,能够让数据库系统在不改变查询语句的情况下提高性能。声明式适合于并行执行,命令式由于指定了特定的执行顺序,所以很难在多核计算机上做并行化。

MapReduce查询既不是声明式查询,也不是一个完全命令式的查询API,它查询的逻辑用代码片段表示,这些片段被处理框架重复调用,主要基于许多函数式编程语言中的map和reduce函数。

图数据查询

图数据库处理对于文档模型和数据模型都难以处理的存在许多多对多关系的数据。
图由顶点(结点、实体)和边(关系、弧)组成。SQL也可以使用WITH RECURSIVE实现图数据库的递归查询,但是非常复杂。

三元存储中,所有信息都以非常简单的三部分形式存储(主体,谓语,客体),例如(吉姆,喜欢,香蕉)。
三元组的主体相当于图的顶点,而客体有以下两种情况:

  • 原始数据类型中的值,这时候三元组的谓语和客体分别相当于主体(顶点)属性中的键值对,例如(lucy, age, 33)。
  • 图中的另一个顶点,这时候谓语是边,主体是尾部顶点,客体是头部顶点,例如(lucy, marriedTo, alain)。
comments powered by Disqus