首发于编程之路
《数据密集型应用系统设计》 读书笔记 02:数据模型与查询语言

《数据密集型应用系统设计》 读书笔记 02:数据模型与查询语言

本章的思维导图:

关系型模型(Relational Model) VS 文档型模型(Document Model)

关系型模型典型的例子就是关系型数据库,通过 SQL 语言来进行数据查询。

下面显式了一条 SQL 语句的执行过程

NoSQL的诞生

NoSQL 意为 Not Only SQL,其流行背后的原因有:

  • 比关系型数据库更好的扩展性,基于超大规模数据或者非常高的吞吐量要求
  • 相比商业收费数据库,NoSQL 往往是基于开源免费的
  • 特殊的查询需求,摆脱关系型 SQL 语言的约束
  • 动态的和更具表达意义的数据模型

The Object-Relational Mismatch

如果关系型数据库用来存储对象信息的话,那么我们的应用里通常需要增加一层 translation layer,例如 ORM 框架(Hibernate or Mybatis),复杂且繁琐。

考虑一个例子——存储一个人的一份简历信息,那么此时采用 JSON 比在传统 RDBMS 中建多张表要方便得多。并且 JSON 数据往往具有更好的局部性(locality),因为它的存储方式更聚合,而不需要你用 SQL 写各种聚合查询操作。

关系/文档数据库比较

  • 应用代码:如果应用数据具有类似文档结构(一对多,树结构)。关系模型倾向某种数据分解,模式笨重。但文档模型也有局限性:不能直接饮用文档中的嵌套项。文档模型处理多对一的数据关系很弱。
  • 文档模型的模式灵活性:文档模型类/关系模型 类似于编程语言中的动态/静态类型检查。文档模型是读时模式(数据结构是隐式的,只有在读取以后才解释),关系数据库传统的方式是写时模式(模式时显式的,写入/读取时都必须遵循预定的结构)。
  • 文档模型可以认为没有数据结构模式,因此改变模式非常方便。关系模式更改更复杂。大多数数据库能够在几毫秒内执行 alter,但 MySQL 不行,MySQL 会复制整张表(有辅助工具解决这个限制)
  • 数据的存储局部性(data locality:数据视为整体存储):文档数据通常存储为 JSON/XML/变体(MongoDB 的 BSON) 连续字符串。如果频繁读取整个文档,则文档型数据库非常适用。文档数据库更新记录时,只有修改量不改变原文档大小时,才能采用原地覆盖更新,这些说明文档数据库不适用频繁更新记录的场景。
  • 现在文档/关系数据库正在互相融合对方的功能点。如 MySQL从 5.7 版本之后开始支持 JSON 数据类型。

多对一和多对多关系

关系型数据库中很容易用 ID 区分每一行的数据,而在文档型模型中则不容易,因此文件型数据库不支持 join 操作,且文件型数据有可能在不久的将来变得愈发庞大,导致新需求需要多对多关系。

图关系数据模型

如果你的应用里多对多关系数据很多怎么办?JSON 形式的数据并不适用,这时候要换用图结构的数据。一个图结构由两部分组成,节点(vertices)和边(edge)。

图数据库应用场景

是基于实体和关系建模的数据库系统。相较于传统关系型数据库有以下优点:

  • 容易建模。图中存储的是带属性的实体和带属性的关系,能够更为直接、自然的表达现实世界,另外图数据库有配套的查询语言,比如Gremlin等,可以方便描述查询条件。比如:查我通过2层人际关系可以认识的人,用Gremlin可以表示为g.V(我).both(认识).both(认识).both(认识)。用传统关系数据库建模抽象层次高,且SQL语句也更为抽象,尤其在表达多层关系或者涉及多表关联时显得更为复杂。由于建模的简单,基于图数据库的图形化展示也往往非常友好。
  • 海量关系数据存储和查询。图数据库支持KV存储(如Titan和HugeGraph),可以很高效的插入大量数据。总数据量级别可达亿或十亿以上,有的甚至达到百亿;传统关系数据库则在规模达到千万以上时,就需要考虑分库分表,否则插入和查询性能会大幅下降
  • 复杂关系查询和分析。图数据库在多层次、多样性复杂关系查询能力方面,完胜关系数据库。传统关系数据库在递归查询和多表关联查询方面效率低下。图数据库则得益于其存储模型和基于存储模型上优化的查询算法,可以高效的处理复杂关联关系查询。

这些优点也就是图数据库更为适合的使用场景: 海量关联关系复杂关系查询和分析目前常见的使用图数据库场景有:

知识图谱,风控,设备管理,社交关系,网址安全等。

参考知友的回答:图数据库的应用场景有哪些? - 愚人混世的回答 - 知乎 zhihu.com/question/5898

数据查询语言

DDIA 介绍了两种数据库查询语言,分别是:SQL 和 MapReduce。

SQL 是一种声明式的查询语言。相对的是命令式语言。声明式查询语言只需要指定所需的数据模式,而命令式语言要指定哪些操作(过程),类似于编程语言。声明式查询语言 API 比命令式简单,数据库引擎可自行优化查询性能。例如 HTML 当中指定样式,使用 Style 是一种声明式的,而 DOM 对象则是命令式的。

MapReduce 是一种编程模型,用于在许多机器上批处理海量数据。一些 NoSQL 存储系统(MongoDB,CouchDB) 支持有限的 MapReduce 方式在大量文档上执行只读查询。它介于声明式和命令式之间。它基于两个操作 map,reduce。map 用于收集/过滤 数据集,reduce 执行在数据集上的各种操作。所以通常需要手动实现 map/reduce 函数来表达查询需求。

更多精彩

在这里送大家一本帮助我拿到 BAT 等一线大厂 offer 的算法笔记,结合了 Google 大佬和阿里大神的精华,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重:

在阅读过程中,有任何问题都可以问小贺,欢迎交流,一起成长!

觉得不错的小伙伴,记得帮我 @herongwei 点个赞哟,笔芯~~

发布于 2021-04-10 22:17