概述
swyx 以讽刺信件的形式,论证了一个常见现象:开发者为了避免使用”笨重”的数据库(如 Postgres),从简单的 KV 存储或 JSON 文件开始,最终在应用层重新实现了数据库的所有核心功能。灵感来自 “Dear sir, you have built a compiler” 一文。
核心观点
“Those who fail to study databases are doomed to write them.”
当你说 “Postgres is overkill” 时,你可能短期快了 30%,但长期每个团队成员每月慢 30%。
论证路径:逐步重新发明数据库
文章按时间线展示了一个团队如何一步步”被迫”重建数据库功能:
- Schema(模式):数据实体和属性越来越多,需要记录”哪些东西存在、它们有什么字段、值的范围”→ 你写了一个 schema
- Transactions(事务):多用户/多应用访问同一数据出现不一致 → 加了
Pending/Complete状态 → 你写了一个事务管理器 - WAL(预写日志):把 Pending 更新分离到单独的 “log” 防止崩溃丢数据 → 你写了 WAL
- CDC/Triggers(变更数据捕获):数据更新时触发其他操作的 “hook” 系统 → 你写了 stored procedures / CDC
- Query Language(查询语言):把常用 CRUD 操作封装成可猜测、语法一致的 API,甚至暴露给终端用户 → 你写了查询语言
- Caching & Indexing(缓存和索引):
- 重复查询 → memoize → 缓存
- 可预测的热查询 → 预计算 → 物化视图
- 不可预测的嵌套依赖 → 图+缓存层(如 Dataloader)
- Query Planning(查询规划):慢写入 → 读写分离、第三范式 → 查询优化
- Security / Auth(安全/授权):企业客户要求文档权限、API 安全、数据隔离、数据驻留
- Recovery & Audit(恢复和审计):回滚、时间旅行调试、操作日志
提到的例子和引用
- Reddit has two tables:极端的反规范化案例
- Dan Pritchett (eBay) BASE 论文:最终一致性
- tRPC / Apollo GraphQL:类型安全和 codegen 工具
- Dataloader (Lee Byron):解决 N+1 查询的批处理/缓存层
- Designing Data Intensive Applications (DDIA):团队读书会参考
- Third Normal Form:数据库规范化
关键启示
这篇文章对于做 infra/平台工具的人特别有价值:
- 数据库不仅是存储,而是一整套数据管理原语(schema、事务、恢复、安全等)
- “简单”方案的总成本往往高于”复杂”方案:短期快,长期债务累积
- Greenspun 定律的数据库版:任何足够复杂的应用都包含一个临时的、不完整的、有 bug 的数据库实现
- 对 Chroma(向量数据库)的创始人来说,这篇文章是在为”为什么需要专业数据库”做论证
相关链接
Takeaway
- no silver bullet
- trade off