第二章:数据模型与查询语言-《数据密集型应用系统设计》读书笔记
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 属性图
- 顶点
- 唯一标识
- 出边 组
- 入边 组
- 属性(键值对) 组
- 边
- 唯一标识
- 边开始结点(尾部)
- 边结束结点(头部)
- 两顶点关系标签
- 属性(键值对) 组
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)应用基本模块
- 数据库:存储数据,应用可多次访问
- 高速缓存:缓存操作复杂或代价高昂的结果,加速访问速度
- 索引:支持关键字搜索与各种过滤
- 流处理:持续处理数据,并将结果发送至另一进程
- 批处理:定期处理大量累积数据
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库