news 2026/10/3 2:09:41

DDIA 中文译本导读:第一部分《数据系统基础》——五章主线、权衡框架与阅读地图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DDIA 中文译本导读:第一部分《数据系统基础》——五章主线、权衡框架与阅读地图
  • 文档
  • 教程

【免费下载链接】ddia

《Designing Data-Intensive Application》DDIA 第一版 / 第二版 中文翻译

项目地址:https://gitcode.com/gh_mirrors/dd/ddia
点击查看免费下载

本篇导读围绕《Designing Data-Intensive Applications》(DDIA)第二版中文翻译仓库中的 第一部分导读页 展开,为你梳理"数据系统基础"(Foundations of Data Systems)这一部分的完整知识脉络:前五章各解决什么问题、彼此如何递进、与后续"分布式数据""派生数据"两部分如何衔接。读完本文,你将获得一张可对照仓库原文逐章深入阅读的路线图,并理解贯穿全书的核心分析框架——"没有完美的方案,只有权衡(trade-offs)"。

一、Part I 在全书中的定位

《设计数据密集型应用》第一部分覆盖前五章,聚焦适用于所有数据系统的基础思想——无论是运行在单台机器上,还是分布在一组机器集群上。原导读页开宗明义地指出:前五章是全书的地基,从"数据在磁盘上如何布局"一路讲到"出现故障时分布式一致性极限"之前的全部基础问题。

与全书其他两部分的关系是清晰的递进结构:

  • 第一部分:数据系统基础(本文主题):单机视角下所有数据系统都必须面对的基本问题;
  • 第二部分:分布式数据:当数据被复制、分片、多机协作时出现的特殊问题(复制、分片、事务、分布式系统麻烦、一致性与共识);
  • 第三部分:派生数据:如何把多个(可能分布式的)数据存储整合进一个更大的应用架构(批处理、流处理、流处理系统哲学、做正确的事)。

仓库根目录的 README.md 提供了在线阅读入口(第二版与第一版两个版本),以及使用 Hugo 自行构建的方式;英文主页 则给出了全书完整的目录树,可对照使用。

二、五章主线一览

第一部分五个章节构成了一个"由外到内、再由内到外"的完整闭环:

  1. 第 1 章:数据系统架构中的权衡——从宏观取舍入手,回答"该选哪种系统、如何组合系统";
  2. 第 2 章:定义非功能性需求——把性能、可靠性、可扩展性、可维护性这些"说不清但很重要"的需求用工程语言讲清楚;
  3. 第 3 章:数据模型与查询语言——进入数据库内部之前,先比较开发者视角下最显眼的差异:数据以何种模型组织、用何种语言查询;
  4. 第 4 章:存储与检索——深入存储引擎内部,看数据库如何在磁盘上布局数据,不同引擎如何针对不同工作负载优化;
  5. 第 5 章:编码与演化——讨论数据编码(序列化)的多种格式,以及应用需求变化、模式(schema)需要随时间演进时的应对之道。

下面逐章展开。

三、第 1 章:数据系统架构中的权衡(Trade-offs in Data Systems Architecture)

第一章是第二版新增的开篇章节(对应源码 content/en/ch1.md),引用 Thomas Sowell 的名言点题:"没有解决方案,只有权衡"。章节先定义了贯穿全书的核心概念——数据密集型应用(data-intensive application):如果数据管理是开发应用时的主要挑战,这个应用就是数据密集型的;与之相对,计算密集型系统的核心挑战在于并行化大规模计算。

1. 操作型系统与分析型系统(Analytical versus Operational Systems)

这是全书第一组、也是最重要的一组二分法:

  • 操作型系统(Operational / OLTP):由后端服务与数据基础设施构成,数据在这里被创建,应用代码基于用户行为读取和修改数据,典型访问模式是按键查找少量记录(点查询 point query);
  • 分析型系统(Analytical / OLAP):服务于业务分析师与数据科学家,持有来自操作型系统的只读数据副本,为聚合类处理优化,典型访问模式是扫描海量记录并计算 count、sum、average 等统计量。

第一章用一张特性对照表总结了二者差异(见 ch1.md 中 Table 1-1),核心维度包括:主要读模式(点查询 vs 大量记录聚合)、主要写模式(单条记录的增删改 vs ETL 批量导入或事件流)、查询类型(应用预定义固定查询 vs 分析师自由构造任意查询)、数据含义(当前最新状态 vs 随时间发生的事件历史)、数据集规模(GB 到 TB vs TB 到 PB)。

由此延伸出数据仓库概念:大型企业拥有数十乃至数百个 OLTP 系统(面向客户的网站、门店收银、库存、路线规划、供应商管理、员工管理等),分析师不宜直接查询这些系统——数据散落在多个系统形成数据孤岛(data silos)、OLTP 的 schema 与数据布局不适合作分析、昂贵查询会影响其他用户、部分系统出于安全合规原因不允许直接访问。数据仓库通过ETL(Extract–Transform–Load)流程从 OLTP 系统抽取数据、转换为利于分析的 schema、清洗后加载,形成只读副本。演进路径还包括:从数据仓库到数据湖(data lake,不强制文件格式与数据模型,常以 Avro/Parquet 等格式存放)、数据湖仓(lakehouse,直接在湖文件上跑 SQL 与数据科学负载,Apache Hive、Spark SQL、Presto、Trino 属于此类)、反向 ETL(reverse ETL,把分析系统的产物如训练好的机器学习模型部署回生产系统)。

第一章还引入了与操作/分析二分法平行的一对概念:记录系统(system of record / source of truth,持有权威数据,每个事实只表示一次)与派生数据系统(derived data,对既有数据加工的结果,丢失后可从源头重建——缓存、反规范化值、索引、物化视图、训练好的模型都属于此类)。这两个术语在 第三部分导读 中会成为贯穿性主题。

2. 云服务与自托管(Cloud versus Self-Hosting)

第二章视角下,任何组织都面临"自建还是购买"的决策,其本质是业务优先级问题:核心能力自研,非核心常规事务交给供应商。章节给出从"自行编写并托管"到"SaaS 纯外部服务"的完整光谱,中间地带是自托管开源/商业软件(如自己下载 MySQL 部署到自控服务器,可在自有硬件上,也可在云端虚拟机 IaaS 上)。

关键取舍包括:

  • 云服务优势:负载随时间剧烈波动时按需伸缩、把不熟悉的系统运维外包给专业供应商、免去容量规划;
  • 云服务劣势:无法控制(缺功能只能请求厂商)、故障时只能等待恢复、难以诊断(看不到服务器内部指标与日志)、供应商锁定(无标准 API 时迁移成本高)、数据安全与隐私合规责任转移。

3. 分布式与单节点系统(Distributed versus Single-Node Systems)

章节随后解释为什么要分布式:天然分布式(多个用户各自设备交互)、云服务间请求、容错与高可用、可扩展性、延迟(全球就近部署)、弹性(按需扩缩容)、专用硬件、法律合规(数据驻留要求)、可持续性(利用可再生电力)。

同时强调分布式并非银弹:网络调用远比同进程内函数调用慢、每次请求都要面对超时与失败的不确定性、更多节点不一定更快(有时单线程程序比 100 核以上集群表现更好)、排查问题困难(由此引出可观测性 observability与 OpenTelemetry、Zipkin、Jaeger 等追踪工具)。微服务与 Serverless一节讨论了服务化架构的利弊与无服务器计算(FaaS)的按用量计费模式。

4. 数据系统、法律与社会(Data Systems, Law, and Society)

第一章以合规与伦理收尾:GDPR 赋予个人对其数据的控制权与删除权(被遗忘权),CCPA、EU AI Act 等法规进一步约束个人数据使用;"数据最小化"(Datensparsamkeit)原则与"大数据"思潮形成张力;PCI、SOC 2 等标准带来第三方审计要求。

四、第 2 章:定义非功能性需求(Defining Nonfunctional Requirements)

对应源码 content/en/ch2.md。功能需求回答"应用要做什么",非功能性需求回答"应用要有多快、多可靠、多安全、多好维护"——后者往往没有明文写出,却与功能同等重要:一个慢得无法忍受或频繁不可用的应用,等于不存在。

本章选取四个非功能性需求展开:性能(如何定义与度量)、可靠性(故障时继续正确工作)、可扩展性(负载增长时高效扩容)、可维护性(长期易于维护)。

为了让抽象定义落地,章节以"类 X(原 Twitter)社交网络"为案例研究贯穿全文:假设用户每天发布 5 亿条帖子(平均每秒 5,700 条,峰值可达每秒 15 万条),平均每个用户关注 200 人、拥有 200 名粉丝。用关系型数据库三张表(users、posts、follows)建模后,首页时间线(home timeline)查询可写成一条 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)、写放大/读放大、负载描述(百分位数 p95/p99)、可靠性与容错、可扩展性的负载参数(QPS、读写比、数据集规模)等全套核心词汇。章节开头还挂载了 第 1 章思维导图,可用于复习该章要点。

五、第 3 章:数据模型与查询语言(Data Models and Query Languages)

对应源码 content/en/ch3.md。章首引用维特根斯坦:"我的语言的界限意味着我的世界的界限。"数据模型之所以重要,是因为它不仅影响软件怎么写,更影响我们如何思考要解决的问题。

应用通常是在多层数据模型之上叠加构建的:应用开发者把现实世界建模为对象/数据结构与 API → 用通用数据模型(JSON/XML 文档、关系表、图的顶点与边)表达 → 存储引擎决定如何用字节表示 → 硬件工程师决定如何用电流、光脉冲、磁场表示字节。每一层都通过"干净的模型"隐藏下层复杂度。

本章比较的模型包括:

  • 关系模型 vs 文档模型:关系模型源自 1970 年 Edgar Codd 的论文,数据组织为关系(表)与元组(行);文档模型(JSON)以嵌套结构表达一对多关系,灵活但需权衡;
  • 图模型:适合多对多关系复杂、关系种类多样的场景(社交网络、推荐、路线规划),Cypher、SPARQL、Datalog 等声明式查询语言各有权衡;
  • 事件溯源与 CQRS:把状态变化记录为不可变事件流,读模型(查询侧)与写模型分离;
  • Dataframes、矩阵与数组:面向数据科学家的模型,如 pandas、R、Spark 生态。

章节还强调声明式查询语言的优势:你只描述"想要什么模式的结果",而把"如何执行"(用哪些索引、哪种连接算法、怎样的并行度)交给查询优化器,数据库可在不修改查询的前提下引入性能改进。本章对应思维导图见 static/map/ch02.png。

六、第 4 章:存储与检索(Storage and Retrieval)

对应源码 content/en/ch4.md。从数据库的视角回答第 3 章的镜像问题:数据给到数据库后,它如何存储、如何再次找到?作为应用开发者你大概率不会自己实现存储引擎,但为了给工作负载挑选合适的引擎并正确配置,你必须大致了解引擎在底层做了什么。

本章从"世界上最简单的数据库"(两个 Bash 函数实现的 key-value 存储)讲起:

#!/bin/bash db_set () { echo "$1,$2" >> database } db_get () { grep "^$1," database | sed -e "s/^$1,//" | tail -n 1 }

由此引出日志结构(log-structured)存储引擎(写入不可变数据文件,如 LSM-Tree)与B 树(原地更新数据页)两大 OLTP 引擎家族,并讨论它们各自如何服务主键索引与二级索引。随后转向面向分析的存储(列式存储等),解释为何数据仓库的数据布局与 OLTP 截然不同;最后简要覆盖多维与全文索引(文本检索等高级查询场景)。章节挂载 static/map/ch03.png 思维导图。

七、第 5 章:编码与演化(Encoding and Evolution)

对应源码 content/en/ch5.md。应用必然随时间变化:新功能上线、需求被更好地理解、业务环境改变。第 2 章引入的可演化性(evolvability)在此落地为具体技术问题:数据格式或 schema 变化时,代码往往需要同步变化,但大型应用的代码变更无法瞬时完成——服务端需要滚动升级(rolling upgrade / staged rollout,逐节点部署新版本并验证),客户端则"听命于用户"(用户可能迟迟不更新)。

因此新旧代码、新旧数据格式可能长期共存,系统必须维持双向兼容:

  • 向后兼容(backward compatibility):新代码能读旧代码写入的数据——通常不难,因为新代码作者了解旧格式;
  • 向前兼容(forward compatibility):旧代码能读新代码写入的数据——更难,要求旧代码能忽略新版本新增的字段。

这正是 JSON、MessagePack、Thrift、Protobuf、Avro 等编码格式的字段标签(field tags)、默认值、模式演进规则等设计要解决的核心矛盾。在数据流层面,章节考察三种模式:通过数据库(进程间)、通过服务调用(REST 与 RPC)、通过异步消息传递(消息代理)。第 4 章思维导图见 static/map/ch04.png。

八、五章小节索引(原文目录继承)

原导读页为每章提供了完整的小节级目录,可直接作为检索锚点(仓库中各章均定义了对应的锚点 id):

第 1 章:数据系统架构中的权衡

  • 操作型系统与分析型系统
  • 云服务与自托管
  • 分布式与单节点系统
  • 数据系统、法律与社会
  • 小结

第 2 章:定义非功能性需求

  • 案例研究:社交网络首页时间线
  • 描述性能
  • 可靠性与容错
  • 可扩展性
  • 可维护性
  • 小结

第 3 章:数据模型与查询语言

  • 关系模型与文档模型
  • 图数据模型
  • 事件溯源与 CQRS
  • Dataframes、矩阵与数组
  • 小结

第 4 章:存储与检索

  • OLTP 的存储与索引
  • 面向分析的数据存储
  • 多维与全文索引
  • 小结

第 5 章:编码与演化

  • 数据编码格式
  • 数据流模式
  • 小结

九、版本说明与阅读指引

原导读页与仓库中 content/en/part-ii.md、content/en/part-iii.md 均带有一条明确的版本警告:当前页面内容来自第一版,第二版尚未提供("This page is from the 1st edition, 2nd edition is not available yet")。需要注意的是,第一、二、五章的实际章节正文(content/en/ch1.md、content/en/ch2.md、content/en/ch5.md)已按第二版框架重写(如第一章新增"云原生架构""微服务与 Serverless""数据系统、法律与社会"等第二版主题),而第三、四章在 v1 目录 中另有第一版版本(第一版第三章、第一版第四章)。阅读时建议:

  1. 以本导读建立全局框架,先明确每章回答的核心问题;
  2. 按 content/en/part-i.md 中的小节索引定位到具体章节锚点,逐节精读;
  3. 每章结尾的 References 是深入学习各主题的优质索引(各章文件末尾均有完整参考文献列表);
  4. 读完前五章后,通过 第二部分导读 自然过渡到复制、分片、事务与分布式一致性等话题。

十、小结

第一部分《数据系统基础》的核心价值在于为全书建立一个统一的"权衡分析"语言:操作型与分析型、记录系统与派生数据、云与自托管、单节点与分布式、灵活 schema 与严格 schema……每一组对比都指向"针对你的具体场景选择合适方案"这一终极命题。仓库中的 README.md 与 英文主页 提供了全书目录与在线阅读方式,content/en/part-i.md 则是进入这一部分的最佳起点。

  • 文档
  • 教程

【免费下载链接】ddia

《Designing Data-Intensive Application》DDIA 第一版 / 第二版 中文翻译

项目地址:https://gitcode.com/gh_mirrors/dd/ddia
点击查看免费下载

相关推荐

上一篇:HarmonyOS / ArkTS 应用安全开发指南:ECC 规则体系下的权限、密钥与数据安全实践
下一篇:5分钟掌握微信好友批量添加的终极自动化方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 2:07:14

景点导览与门票系统源码实战:Spring Boot+Vue前后端分离开发指南

“可白嫖源码”这类标题非常常见,尤其是涉及景点导览与门票系统的课程设计或毕业设计。如果你也是冲着源码来的,而且需要的是能真正跑起来、能答辩、能写进简历的成绩,那这篇案例分析应该能帮到你。这套景点导览与门票系统,说白了…

作者头像 李华
网站建设 2026/10/3 2:03:39

Linux swapon 命令详解:激活与管理系统交换空间的完整实践指南

文档教程 【免费下载链接】linux-command Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux 项目地址: https://gitcode.com/GitHub_Trending/linux/linux-command 点击查看 免费下载 本篇指南以 linux-command 仓…

作者头像 李华
网站建设 2026/10/3 2:03:08

DRV8818+STM32F767工业级步进电机电流闭环设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华