资讯动态

DDIA 第一部分《数据系统基础》导读:前五章构建数据密集型应用的核心知识体系

发布时间:2026/10/3 1:55:47 来源:尧图企业网站定制
文档教程【免费下载链接】ddia《Designing Data-Intensive Application》DDIA 第一版 / 第二版 中文翻译项目地址https://gitcode.com/gh_mirrors/dd/ddia点击查看免费下载本篇导读基于《Designing Data-Intensive Applications》DDIA中文翻译仓库中的 第一部分总览页 展开系统梳理第一部分的五章内容——数据系统架构权衡、非功能性需求、数据模型与查询语言、存储与检索、编码与演化——并结合仓库中对应章节的源码级细节帮助你建立从单机到分布式、从存储引擎到数据流模式的完整知识骨架。读完本文你将掌握每一章的核心概念、关键术语与可直接定位的阅读路径为后续阅读第二、第三部分打下基础。第一部分在全书中的位置与阅读顺序《Designing Data-Intensive Applications》共分三大部分第一部分数据系统基础Part I、第二部分分布式数据Part II、第三部分派生数据Part III。正如 part-i.md 开篇所强调的本书前五章介绍了数据系统底层的基础概念无论是在单台机器上执行的单点数据系统还是分布在多台机器上的分布式数据系统都适用。也就是说第一部分的五章讨论的是所有数据系统共享的底层问题如何权衡架构、如何定义需求、如何选择数据模型、数据如何存储与检索、数据如何编码与演化。这些内容不依赖分布式这一前提因此是后续第二、第三部分的技术前提。从仓库的 Hugo 内容结构也能印证这一点content/tw/part-i.md的 front matter 中book_kind: part、book_number: I、weight: 100而五章分别以weight: 101–105紧随其后见 content/tw 目录即按 1→2→3→4→5 的固定顺序组织说明第一部分内部存在明确的前后依赖关系——例如 第三章 介绍的数据模型会被 第四章 的存储引擎设计复用第五章 的编码演化问题又建立在前两章的术语之上。第一章数据系统架构中的权衡第一章 回答一个根本问题既然数据系统没有唯一正确的架构我们应该如何在相互冲突的目标之间做取舍章节开篇引用了 Thomas Sowell 的话没有解决方案只有权衡取舍。本章首先区分两类应用数据密集型data-intensive应用关心的是如何存储和处理海量数据、如何管理数据变更、如何在故障与并发面前保证一致性、如何维持高可用而计算密集型compute-intensive系统的难点在于把某项庞大计算并行化。绝大多数现代 Web、移动、SaaS 与云应用都属于前者。数据系统的标准构件章节列出了几乎所有数据密集型应用都会用到的标准构件数据库database存储数据供自己或其他应用日后查找缓存cache记住开销昂贵的操作结果加快读取搜索索引search index允许用户按关键字搜索或过滤数据流处理stream processing在事件和数据变更发生后立即处理批处理batch processing定期处理累积的大批量数据应用通常用若干软件系统数据库、API 等拼装而成难点在于判断哪种工具最适合当前任务以及当单件工具无法独立完成时如何组合它们。三组核心权衡章节正文围绕三组相对概念展开对应 分析型与事务型系统、云服务与自托管、分布式与单节点系统 三个小节事务型系统OLTP与 分析型系统OLAP事务型系统由创建数据的后端服务组成按某个键做低延迟的点查询point query并插入、更新、删除记录分析型系统则存储事务型数据的只读副本扫描海量记录计算聚合统计量。章节进一步讨论了数据仓库data warehouse、从数据仓库到数据湖data lake、权威记录系统与衍生数据derived data等概念并引入了数据工程师与分析工程师两个专业角色。云服务与自托管对比二者的利弊云服务的利弊讨论云原生系统架构云服务分层、存储与计算分离以及云时代的运维模式。分布式与单节点系统说明何时应当从单节点转向分布式分布式系统的问题并延伸到微服务与无服务器serverless架构微服务与无服务器。此外本章还讨论了 数据系统、法律与社会 这一面向合规与用户权利的议题并提供全书通用的术语基础——例如前端与后端数据基础设施无状态服务等概念。章节末尾的 总结 浓缩了上述权衡的核心结论。第二章定义非功能性需求第二章 讨论功能需求之外的另一半性能、可靠性、可伸缩性、可维护性等非功能性需求nonfunctional requirements。它们未必被明确写下来但一个慢得让人无法忍受、或是很不可靠的应用几乎等于不存在。案例研究社交网络首页时间线为了让抽象概念落地章节用一个类似 X原 Twitter的社交网络作为贯穿案例并给出了真实的 SQL 查询示例——获取某位用户首页时间线的核心查询SELECT posts.*, users.* FROM posts JOIN follows ON posts.sender_id follows.followee_id JOIN users ON posts.sender_id users.id WHERE follows.follower_id current_user ORDER BY posts.timestamp DESC LIMIT 1000由此引出两个关键工程概念见 案例研究社交网络首页时间线 与 时间线的物化与更新扇出fan-out一次发帖引发多个下游请求请求数量被放大的倍数。物化materialization预先计算并持续更新查询结果时间线缓存就是一种物化视图materialized view。物化以写入时更多工作换取读取时更快的速度章节还讨论了关注极多账号、或拥有海量粉丝的名人账号等极端场景下的取舍。描述性能描述性能 小节区分了延迟latency与响应时间response time并介绍了用平均值、中位数与分位数尤其尾部延迟 p95/p99来刻画用户体验的方法平均值、中位数与分位数以及如何将其落实为 SLO / SLA 指标响应时间指标的应用。可靠性、可伸缩性与可维护性可靠性reliability系统在出问题时仍能继续正确工作。章节覆盖容错fault tolerance、硬件与软件故障含通过冗余容忍硬件故障、以及人为因素——人为错误往往比硬件故障更常见人类与可靠性。可伸缩性scalability系统负载增长时能否高效增加计算能力。描述负载 给出了描述负载的指标如 Twitter 案例中的每秒发帖数、时间线读取率共享内存、共享磁盘与无共享架构 对比了三种横向扩展的硬件组织方式。可维护性maintainability从三个维度展开——可运维性让运维更轻松、简单性管理复杂度、可演化性让变化更容易。第三章数据模型与查询语言第三章 讨论数据模型——它们不仅影响软件的编写方式还影响我们的解题思路。章节用一个四层模型说明数据抽象的层次应用层的数据结构与 API → 通用数据模型JSON/XML 文档、关系表、图的顶点与边→ 存储引擎的字节表示 → 硬件层。每层通过明确的模型隐藏下层复杂性。关系模型与文档模型本章对比的核心是关系模型relational model1970 年由 Edgar Codd 提出与文件模型document model由 NoSQL 运动推广常以 JSON 表示对象关系不匹配阻抗不匹配对象式编程语言与关系表模型之间需要笨拙的转换层。章节专门用一节讨论 ORM如 ActiveRecord、Hibernate的局限与优势对象关系映射 ORM包括著名的N1 查询问题。一对多关系文档模型天然适合一对多关系用于一对多关系的文档数据模型。规范化、反规范化与连接讨论正规格的权衡以及社交网络案例中的反规范化正规格化的权衡、社交网络案例研究中的反规范化。多对一与多对多关系多对一与多对多关系文档模型在这一场景下需要仿照关系模型做连接。星型与雪花型分析模式星型与雪花型分析模式分析型数据建模的经典模式。何时使用哪种模型从模式灵活性读时模式 vs 写时模式、读写的数据局部性、文档的查询语言、文档与关系数据库的融合四个角度给出决策框架文档模型中的模式灵活性、读写的数据局部性、文档的查询语言、文档和关系数据库的融合。图数据模型、事件溯源与其他模型图数据模型从属性图property graph属性图讲起依次对比 Cypher 查询语言、SQL 中的图查询、三元组存储与 SPARQL含 RDF 数据模型、Datalog递归关系查询以及 GraphQLCypher 查询语言、SQL 中的图查询、三元组存储与 SPARQL、GraphQL。事件溯源与 CQRS事件溯源与 CQRS以不可变事件日志为核心的数据模型。数据框、矩阵与数组数据框、矩阵与数组面向数据科学/机器学习场景的模型。章节还以术语框形式介绍了声明式查询语言SQL、Cypher、SPARQL、Datalog 等与命令式算法的区别声明式查询由查询优化器决定执行计划数据库可以无修改地并行执行并提升性能。第四章存储与检索第四章 从数据库的视角回答数据如何存储、如何重新找到。章节开篇用两个 Bash 函数展示了世界上最简单的数据库完整演示了追加写日志的核心思想db_set () { echo $1,$2 database } db_get () { grep ^$1, database | sed -e s/^$1,// | tail -n 1 }调用db_set key value将键值对追加到文件末尾db_get key返回该键最后一次出现的值。这个例子说明仅追加append-only日志是所有复杂存储引擎的基础真正的数据库还要解决并发写入、磁盘空间回收、崩溃恢复处理写了一半的记录等问题。OLTP 存储引擎的两大流派日志结构log-structured存储以不可变文件顺序写入数据通过压实compaction回收空间。章节依次讲解SSTable 文件格式、SSTable 的构建与合并、布隆过滤器加速键是否存在判断与压实策略SSTable 文件格式、构建和合并 SSTable、布隆过滤器、压实策略。B 树B-tree就地更新数据页的经典结构需要*预写日志WAL*保证可靠性使 B 树可靠并有多种变体。随后章节给出 B 树与 LSM 树的系统性对比比较 B 树与 LSM 树读取性能、顺序与随机写入、写放大write amplification、磁盘空间使用四个维度。此外还覆盖多列索引与二级索引、全内存存储in-memory等主题。分析型数据存储与高级索引分析型数据存储分析型数据存储云数据仓库、列式存储列压缩、排序顺序、写入列式存储以及现代查询引擎的编译与向量化执行查询执行编译与向量化、物化视图与多维数据集。多维度索引与全文索引多维度索引与全文索引全文检索与向量嵌入embedding向量嵌入等支撑复杂查询的索引技术。第五章编码与演化第五章 的主题是唯变所适应用必然随时间变化数据格式与模式也随之演化。章节的核心框架是一对兼容性定义向后兼容backward compatibility较新的代码可以读取由较旧代码写入的数据——通常不难实现。向前兼容forward compatibility较旧的代码可以读取由较新代码写入的数据——更难因为旧代码必须忽略新代码新增的字段。章节还用一个具体场景旧版代码读出新字段记录、更新后写回若模型对象不显式保留未知字段就会丢失数据说明向前兼容的难点这也是选择编码格式时最重要的判据。编码数据的格式特定语言的格式如 JavaSerializable、Pythonpickle、RubyMarshal方便但存在语言锁定、任意类实例化的安全风险、版本管理缺失、效率低下等问题通常不适合长期存储。JSON、XML 及其二进制变体跨语言标准格式章节讨论了JSON Schema与二进制编码方案。Protocol Buffers通过字段标签field tag支持模式演化字段标签与模式演化。Avro基于写入者模式与读取者模式的兼容机制写入者模式与读取者模式以及模式演化规则、动态生成的模式等特性。模式的优点模式的优点显式模式带来的文档价值与校验能力。数据流的模式编码不仅用于存储也用于进程间通信。章节将数据流归纳为三种模式流经数据库的数据流不同时间写入的不同值、归档存储不同时间写入的不同值、归档存储。流经服务的数据流REST 与 RPCWeb 服务、RPC 的固有问题重试、超时、幂等、负载均衡器、服务发现与服务网格以及 RPC 场景下的数据编码与演化Web 服务、RPC 的问题、负载均衡器、服务发现和服务网格、RPC 的数据编码与演化。事件驱动的架构持久化执行与工作流durable execution、消息代理message broker与分布式 actor 框架持久化执行、消息代理、分布式 actor 框架。仓库中的阅读路线与延伸资源本仓库同时维护了简体中文、繁体中文与第一版译文便于对照阅读简体中文第一部分的五章见 content/zh/ch1.md 至 content/zh/ch5.md本篇所依据的繁体中文版见 content/tw/ch1.md 至 content/tw/ch5.md第一版译文位于 content/v1 目录可供版本对比每章的图集中存放于 static/fig如 ddia_0201.png、ddia_0501.png 等按章节编号章首还配有位于 static/map 的章节思维导图如本章引用的 ch01.png 对应第二章全书目录与阅读说明见 README.md其目录一节列出了三大部分共十四章的完整结构。读完全部五章之后即可进入 第二部分分布式数据对应第六章至第十章届时第一部分的单机知识会与复制、分片、事务、一致性与共识等分布式主题衔接起来。从仓库的 front matter 结构看第二部分以book_number: II、weight紧随第一部分编排见 content/tw/part-ii.md两部分构成全书递进的知识链条。结语第一部分数据系统基础是整本 DDIA 的基石第一章确立权衡的世界观第二章给出衡量系统的指标语言第三章教会你选择数据模型第四章揭示存储引擎的内部机理第五章则解决系统长期演化中的兼容性问题。五章环环相扣、层层递进无论你最终面向单机系统还是分布式系统这部分知识都同样适用。建议按照 ch1 → ch5 的顺序通读并结合本仓库的章节链接与思维导图资源边读边对照为第二部分的分布式主题做好准备。赞分享文档教程【免费下载链接】ddia《Designing Data-Intensive Application》DDIA 第一版 / 第二版 中文翻译项目地址https://gitcode.com/gh_mirrors/dd/ddia点击查看免费下载相关推荐BepInEx 6.0.0插件加载稳定性机制拆解与IL2CPP调优实操手册BepInEx 6.0.0插件加载稳定性机制拆解与IL2CPP调优实操手册 BepInEx 6.0.0 是面向 Unity 与 .NET 游戏的插件框架。本篇文档教程DDIA 第三部分导读派生数据Derived Data与多系统数据集成架构DDIA 第三部分导读派生数据Derived Data与多系统数据集成架构 《Designing Data Intensive Application》文档教程DDIA核心概念解析数据系统基础架构DDIA核心概念解析数据系统基础架构 本文深入探讨了现代数据系统的基础架构设计重点分析了事务型系统OLTP与分析型系统OLAP的核心区别、技术实现差文档教程上一篇Java代码生成最佳实践基于gh_mirrors/auto/auto的设计模式应用下一篇Applaudo 档案全解析remote-jobs 目录中远程友好型科技公司的档案结构与构建链路创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑