DDIA 第一版中文翻译:三部分十二章内容地图、在线阅读功能与 Hugo 站点构建指南
DDIA 第一版中文翻译:三部分十二章内容地图、在线阅读功能与 Hugo 站点构建指南
《Designing Data-Intensive Applications》(DDIA,设计数据密集型应用)第一版是数据系统领域的经典读物,本仓库以 content/v1/ 目录完整保留其中文译文,并配套章节树、稳定图号交叉引用、全文搜索、整书打印与 llms.txt 输出等现代阅读设施。本文以仓库中的 第一版首页 为骨架,结合 目录页、三个部分的章节概览与站点配置源码,系统梳理第一版的十二章节内容地图、在线阅读功能实现,以及用 Hugo 自行构建该站点的完整方法,帮助读者快速定位章节、理解数据系统三大主线,并掌握站点的构建与校订流程。
第一版在仓库中的定位
DDIA 第一版的中文翻译由 冯若航(Vonng) 与众多贡献者共同完成,仓库在提供第二版译文的同时,完整保留了第一版的中文译文与稳定链接。这是因为许多文章、课程与讨论至今仍引用第一版的章节编号和图号(见 首页说明),保留第一版既便于读者继续访问旧链接,也方便与第二版逐章对照。
从仓库结构看,第一版内容全部组织在 content/v1/ 目录下:
- 入口页 content/v1/_index.md:版本总览与阅读指引;
- content/v1/preface.md:译序与全书目标;
- content/v1/toc.md:完整目录(含插图目录);
- content/v1/part-i.md、content/v1/part-ii.md、content/v1/part-iii.md:三个部分的章节概览与索引;
content/v1/ch1.md~content/v1/ch12.md:十二章正文;- content/v1/glossary.md、content/v1/colophon.md、content/v1/contrib.md:术语表、后记与贡献者记录。
首页以一句译序点题:"不懂数据库的全栈工程师不是好架构师"。第一版全书沿着可靠性、可伸缩性与可维护性展开,系统讲解数据模型、存储、复制、分区、事务、一致性,以及批处理和流处理——这也是评价任何数据系统的三条主线。
三部分十二章:内容地图
第一版共十二章,分为三个部分。各部分概览页(part-i/part-ii/part-iii)在每章正文之前给出了该部分的定位、章节要点与锚点索引,是快速定位内容的最佳入口。
第一部分:数据系统基础(第 1–4 章)
见 content/v1/part-i.md,本部分介绍数据系统底层的基础概念,无论单机数据系统还是分布式数据系统均适用:
- 第一章 · 可靠性、可伸缩性和可维护性(ch1):定义全书术语与方法。章节从"数据密集型应用"出发——与计算密集型相对,这类应用的瓶颈通常在数据量、数据复杂性与数据变化速度,而非 CPU。应用通常由数据库、缓存、搜索索引、流处理、批处理等标准组件拼装而成,当多个工具组合时,应用代码需要负责让缓存/索引与主数据库保持同步,此时开发者事实上成为了复合数据系统的设计者。随后分别展开三大目标:
- 可靠性:系统在困境(硬件故障、软件故障、人为错误)中仍可正常完成功能并达到期望性能;区分"故障(fault)"与"失效(failure)",并介绍通过故意触发故障(如 Netflix Chaos Monkey)来提高容错信心的反直觉做法;
- 可伸缩性:用负载参数(如 QPS、读写比、缓存命中率)描述负载,用百分位数(p50/p99)衡量性能,并讨论垂直伸缩(scale up)与水平伸缩(scale out)的不同策略;
- 可维护性:从可运维性、简单性与可演化性三个维度,讨论让工程师在系统生命周期内高效工作的设计原则。
- 第二章 · 数据模型与查询语言(ch2):比较关系模型、文档模型与图数据模型,分析不同数据模型适用的应用场景。
- 第三章 · 存储与检索(ch3):深入存储引擎内部,研究数据库如何在磁盘上摆放数据,包括日志结构存储与 LSM 树、B 树索引、OLTP 与 OLAP 的区分、列式存储等。
- 第四章 · 编码与演化(ch4):比较 JSON、XML、Thrift、Protobuf 等数据编码格式,讨论模式随时间演化的兼容性问题与数据流类型。
第二部分:分布式数据(第 5–9 章)
见 content/v1/part-ii.md,本部分回答"如果多台机器参与数据的存储和检索,会发生什么"。开篇即给出分布式的三个动机:可伸缩性(数据量与负载超出单机能力)、容错/高可用性(单机或数据中心故障时仍能服务)、延迟(全球部署,就近服务用户)。
在架构层面,本部分区分了三种模式:共享内存架构(shared-memory,垂直伸缩,成本超线性增长)、共享磁盘架构(shared-disk,受竞争与锁定开销限制)与无共享架构(shared-nothing,水平伸缩,本部分讨论的重点——它最需要谨慎对待,因为数据库无法把分布式系统的约束与权衡魔术般地隐藏起来)。数据分布在多个节点上有两种常见方式:
两者经常同时使用。下图即 第二部分概览页 中的图 II-1,展示了一个数据库切分为两个分区、每个分区各有两个副本的典型布局:
其余章节继续深入分布式系统的核心难题:
- 第七章 · 事务(ch7):事务的棘手概念、弱隔离级别(读已提交、快照隔离等)与可串行化;
- 第八章 · 分布式系统的麻烦(ch8):故障与部分失效、不可靠的网络、不可靠的时钟,以及"知识、真相与谎言"——讨论系统可能做出的错误假设;
- 第九章 · 一致性与共识(ch9):一致性保证、线性一致性、顺序保证,以及分布式事务与共识协议。
第三部分:派生数据(第 10–12 章)
见 content/v1/part-iii.md,前两部分假设应用中只使用一种数据库,而现实系统通常组合多个组件(数据存储、索引、缓存、分析系统等)并需要移动数据的机制。本部分引入两个关键概念:
- 记录系统(System of record):也称真相源,持有数据的权威版本,每个事实恰好表示一次;
- 衍生数据系统(Derived data systems):由其他系统数据转换/处理而来,丢失后可从原始来源重建,典型例子是缓存、索引与物化视图。记录系统与衍生数据系统的区别不在于工具,而在于应用中的使用方式。
具体章节:
- 第十章 · 批处理(ch10):从 Unix 工具链到 MapReduce 与分布式文件系统,再到 MapReduce 之后的数据流引擎;
- 第十一章 · 流处理(ch11):传递事件流、数据库与流(含变更数据捕获)、流处理语义;
- 第十二章 · 数据系统的未来(ch12):数据集成、分拆数据库、将事情做正确与做正确的事情,探讨如何构建可靠、可伸缩、可维护的应用。
目录页 content/v1/toc.md 通过 book-toc 与 book-figures 两个短代码自动生成按章、节、插图定位的完整目录;全书编号插图使用稳定图号和锚点,正文中的"图 N-N"引用会同时链接到插图目录中的目标,保证外部引用长期有效。
在线阅读功能:从章节树到整书出版
第一版在线版本围绕阅读体验构建了多项能力(见 首页 与 data/home/v1.yaml):
- 章节树导航:侧边栏按三个部分折叠展示十二章层级,支持键盘导航与命令面板(按
⌘ K搜索全文与常用操作,按/运行阅读、版本、语言等命令); - 稳定图号与交叉引用:全书约 90 幅编号插图使用稳定图号与锚点,正文引用语义化互联,支持高清缩放(
image_zoom); - 全文搜索:站点启用本地语言感知的离线全文搜索(hugo.yaml 中
offline_search: true,索引内容为content,摘要长度 120 字符,最多返回 12 条结果),不依赖外部搜索服务; - 顺序阅读:从第一章开始逐章阅读,每页末尾提供上一章/下一章导航;
- 整书打印:通过
/_print/整书打印视图可另存为 PDF; - Markdown /
llms.txt输出:站点配置了outputs: [HTML, print, markdown, LLMS],提供适合工具读取的 Markdown 与llms.txt输出(首页outputs字段同样声明了这些格式),便于搜索引擎、Agent 与 LLM 直接抓取结构化内容; - 评论与勘误:启用基于 giscus 的评论区(
comments.type: giscus,仓库Vonng/ddia,按 pathname 映射),页面可直接跳转编辑或提交问题,第一版内容同样接受勘误与改进。
这些能力在首页数据文件 data/home/v1.yaml 中被归纳为"旧版内容,现代阅读体验":搜索与命令面板、图表与整书出版、开放校订三大支柱。
版本与语言切换机制
站点通过 hugo.yaml 的多语言配置同时承载两版 × 简繁中文四种阅读版本:
| 语言标识 | 标签 | 内容目录 | 版本 |
|---|---|---|---|
zh |
简体 · 二版 | content/zh |
第二版 |
tw |
繁體 · 二版 | content/tw |
第二版 |
v1 |
简体 · 一版 | content/v1 |
第一版 |
v1_tw |
繁體 · 一版 | content/v1_tw |
第一版 |
每个语言块通过 params.versions 声明版本菜单项(如第一版菜单提供"第二版 https://ddia.vonng.com/#"与"第一版 /v1/"两个入口),并各自配置命令面板(start_reading、browse_glossary、print_book)与主导航菜单(完整目录、术语表、后记、贡献)。阅读第二版时,可通过顶部版本菜单随时回到对应语言的第一版首页;语言菜单则在简体与繁体之间切换。
本地构建与运行
仓库是一个 Hugo 项目,通过 Hugo Module 引入 OINK 主题(module.imports 指向 github.com/pgsty/oink),Makefile 提供了完整的开发与发布命令:
dev: # 开发模式:读取本地 OINK 主题 checkout,显示草稿/未来/过期页面,不写 public/
HUGO_MODULE_REPLACEMENTS="$(OINK_MODULE) -> $(OINK_LOCAL)" \
hugo server --renderToMemory -DFE
serve: # 生产模式预览:压缩输出、禁用快速渲染与热重载
hugo serve --environment production --minify --disableFastRender --disableLiveReload
build: # 构建静态站点
hugo build
check: # 校验:go mod verify + Hugo 路径/i18n 警告(panicOnWarning)
GOWORK=off go mod verify
GOWORK=off hugo --cleanDestinationDir \
--printPathWarnings --printI18nWarnings --panicOnWarning
translate: # 由简体中文生成繁体中文版本(OpenCC)
uv run --with opencc-python-reimplemented==0.1.7 -- python bin/zh-tw.py
epub: # 生成 EPUB 电子书
bin/epub
其中 dev 目标使用 HUGO_MODULE_REPLACEMENTS 将 OINK 模块替换为本地 checkout,便于主题改动即时可见;check 目标在 CI 场景下对链接与国际化警告零容忍。若只需查看第一版页面,本地 hugo server 启动后访问 /v1/ 路径即可。
授权说明与贡献方式
首页明确声明:本译文仅供学习研究参考,不追求任何经济利益,不得公开传播发行或用于商业用途;译者保留译文署名权,其他权利以原作者与出版社的主张为准。有能力阅读英文的读者请购买正版支持作者与出版社。
翻译校订与完整贡献记录见 贡献者页面:译者冯若航为 PostgreSQL 专家,校订与维护由 Yin Gang(@yingang)负责,繁体中文版本由 @afunTW 维护。截至 2026-09-19,仓库已收录 212 位贡献者,页面按 Issue/PR 记录每条翻译修正、勘误与状态(如"图 10-2 的描述错误""scalability 譯名由可伸縮改為可擴展"等),无论是否采纳、合并或关闭,反馈本身即是贡献。发现内容或排版问题时,可通过贡献者页面的链接提交 Issue 或 Pull Request,第一版内容同样接受持续校订。
