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

 

 

0 基本说明

应用软件是通过一层一层叠加数据构建过程:
1. 开发人员,将现实世界抽象为对象、数据结构以及对数据操作的API
2. 存储数据及诶欧,采用通用数据模型(JSON、XML、关系数据库的表或图)
3. 使用内存、磁盘、网络字节等来存储数据,需支持查询、搜索、操作和处理数据
4. 硬件上采用电流、光脉冲、磁场等进行表示
 

1 关系模型与文档模型

1.1 关系模型

即SQL,表:数据被组织成的关系;行:元组,每个关系都是元组的无序集合; 核心为数据处理,包括事务处理、批处理。 目标,将实现细节隐藏到简洁的接口后。

1.2 NoSQL(Not Only SQL)

  采用NoSQL的驱动因素: 更好扩展性,支持超大集群、超高吞吐量; 普遍为免费和开源; SQL不好支持的查询; SQL限制性,期待更动态、更具表达力的模型;

1.3 对象关系不匹配

  应用关系模型,应用层中对象与SQL的表、行、列的数据不能直接匹配,需要转换层。 对象-关系映射(ORM:object-relational mapping)简化了转换层,但不能完全隐藏两者差异。 对于树状结构对象的处理,JSON更具显式化。

1.4 多对一与多对多关系

  文档模型本身支持,无需级联; ​关系模型,需要在应用层进行多次查询以模拟级联。 文档模型(文档引用)、关系模型(外键)无本质区别,相关项目均被指定为标识引用。

1.5 文档数据库是否在重蹈覆辙?

  为解决层次模型局限性,提出来关系模型、网络模型
  • 网络模型
  存在多条不同路径指向相同结果,编程时需考虑所有可能路径。 查询和更新数据异常复杂且不具灵活性。
  • 关系模型
  定义:关系(表)只是元组(行)的集合。 查询优化器:自动决定执行顺序和索引使用,“访问路径”对开发人员透明。

1.6 关系数据库与文档数据库现状

  • 代码更简单?
  文档模型适用于一对多关系,关系型通常将数据分解导致处理复杂; 文档模型不能直接引用结构的深层嵌套项; 无需级联的场景更适合文档模型; 对于高度关联的数据,更适合使用关系模型来处理; 孰优孰劣,需要根据应用场景进行分析
  • 文档模型的模式更灵活
  读时模式:隐式结构,读取时才做解释,类似于动态类型检查。 写时模式:显式,静态检查,所有数据写入时都必须遵循。
  • 查询的数据局部性
  局部性优势适用于同时访问大部分内容的场景。 文档应尽量小,避免更新是增加文档大小。 不只是文档模式具有局部性设计,Spanner、Bigtable也有类似的设计。
  • 两者的融合
  MySQL、PostgreSQL提供JSON支持; RethinkDB、MongoDB支持了联结查询与引用关系; ​优势互补,两者融合是未来很好的发展方向。
 

2 数据查询语言

  声明式:如SQL,遵循关系代数结构,需指定数据模式、结果筛选条件、准换方式,无需关注实现细节,更为简洁易用。适用于并行执行。 命令式:常用编程语言为命令式,指定计算机以特定顺序执行操作,执行过程可推理,很难实现并行化。

2.1 WEB上的声明式查询

  WEB应用,声明式的CSS样式表比JS简介好用。 ​数据库,声明式查询语言使用上也优于命令式。

2.2 MapReduce查询

  既不是声明式,也不是命令式。 查询逻辑使用代码片来表示,基于编程语言的map(或collect)和reduce(或fold、inject)函数。 聚合管道:声明式的查询语言,基于JSON语法,相当于是SQL的子集
 

3 图状数据模型

  • 文档模型处理一对多关系或记录之间无关系情况;关系模型适合简单的多余多关系;图模型适合复杂的多对多关系。
  • 图:由顶点vertices(或称结点odes、实体entities)和边edges(或称关系relationships或弧arcs)组成。
  • 可用属性图模型、三元组模型进行存储。 ​
  • 例如:社交网络(人和关系)、Web图(网页和链接)、铁路网(交叉点和路线)等。
  • 图可存储完全不同的类型对象。

3.1 属性图

  • 顶点
    1. 唯一标识
    2. 出边 组
    3. 入边 组
    4. 属性(键值对) 组
    1. 唯一标识
    2. 边开始结点(尾部)
    3. 边结束结点(头部)
    4. 两顶点关系标签
    5. 属性(键值对) 组

3.2 Cypher查询语言

一种属性图的声明式查询语言。

3.3 SQL中的图查询

使用递归公用表 表达式,查询过程十分复杂。

3.4 三元组

分为主体、谓词、客体。 主体为图中的顶点,谓词和客体有两种情况: 1. 谓词为主体顶点的属性键,客体为属性的值 2. 客体为另一个顶点,谓词为两者关系的边

3.5 资源描述框架RDF,Resource Description Framework

可使用Turtle、N3类的人类可读格式,也可采用XML格式。 ​RDF是特殊的三元组,其主体、谓词、客体通常都是URI。

3.6 SPARQL查询语言

是一种采用RDF数据模型的三元组查询语言。 RDF不区分属性和边,采用相同语法匹配属性上的查询条件。 Cypher的模式匹配借用了SPARQL,两者很相似。

3.7 Datalog基础

  • Datalog的数据模式是更为通用的三元存储模式,采用“谓语(主体,客体)”格式。 ​
  • 谓语并非存储在数据库中的三元组,而是从数据或其他规则派生而来,规则可以引用其他规则。
  • 复杂的查询可由各个小块逐步构建起来。
  • Datalog十分强大,体现在规则可以在不同的查询中组合和重用。
 

 


 

书籍基本信息:

  • 《数据密集型应用系统设计》,英文名称是《Designing Data-Intensive Application》 ,也被简称为 DDIA
  • 推荐指数:🌟🌟🌟🌟🌟
  • 作者:Martin Kleppmann,译者 :赵军平、李三平、吕云松
  • 内容简介:驾驭处理数据和存储数据的相关技术。探索经典数据系统的设计之道,梳理核心算法、设计理念、权衡之道,以便重新审视系统架构,在实际应用场景中选择最佳工具搭配。
  • 数据密集型(data-intensive)应用基本模块
    • 数据库:存储数据,应用可多次访问
    • 高速缓存:缓存操作复杂或代价高昂的结果,加速访问速度
    • 索引:支持关键字搜索与各种过滤
    • 流处理:持续处理数据,并将结果发送至另一进程
    • 批处理:定期处理大量累积数据
 
posted @ 2022-03-24 19:32  雪梨大佬  阅读(47)  评论(0编辑  收藏  举报