Skip to main content

数据与数据库实战

数据库是全栈应用的事实来源:用户身份、内容、订单、权限、日志和统计最终都需要被可靠地保存、查询和恢复。本小册面向应用开发者,不把重点放在背面试题,而是通过可以在本机运行的案例,学习怎样为真实产品选择、设计、连接、保护和运维数据库。

全书保留并完善了原有的 MySQL、MongoDB、Strapi、Prisma、Drizzle、PostgreSQL、Supabase、Cognito 与 DynamoDB 章节,同时增加 SQLite、Redis、数据建模、迁移、数据工程、安全可靠性和综合项目。共 10 个部分、71 章;每一章都包含实操命令、代码、错误场景和验收任务。

书中的本地密码、端口和容器配置只用于隔离实验。生产环境必须使用私有网络、TLS、最小权限账号和 Secret 管理,不要把连接串、管理员密钥或真实用户数据提交到 Git。

适合谁

  • 会使用 JavaScript/TypeScript 或另一门后端语言,想系统补齐数据层能力的前端/全栈开发者;
  • 能完成简单 CRUD,但对建模、事务、索引、并发、迁移和备份缺少完整方法的开发者;
  • 正在选择 MySQL、PostgreSQL、SQLite、MongoDB、Redis、Supabase 或云数据库的独立开发者;
  • 想把登录、内容、缓存、Webhook、数据同步和部署串成真实项目的人。

不要求数据库基础。第 1、2 部分从表、文档、键和值开始;后续逐步进入 ORM、云服务、多租户、CDC 和生产可靠性。

学习路线

部分主题主要实战成果
第1部分关系型数据库图书馆模型、MySQL/SQL、JOIN、索引、SQLite 边缘应用
第2部分非关系型数据库MongoDB 任务库、文档演进、聚合索引、Redis 会话/缓存/限流
第3部分CMS 与 APIStrapi 内容模型、REST/GraphQL、认证插件、前端集成与部署
第4部分应用数据访问浏览器离线数据、Node.js 驱动、连接池、Prisma、Drizzle、迁移和测试
第5部分PostgreSQL 与 SupabasePostgreSQL 进阶、Supabase Data API、RLS/Auth/Storage、Realtime、Cloudflare
第6部分Cognito 与 DynamoDBAWS 身份、用户资料、权限、DynamoDB、Webhook 与 Serverless API
第7部分开源登录系统方案选型、用户/会话模型、组织权限、认证 Adapter、自托管安全
第8部分数据建模与数据工程ER 模型、范式、多租户、Schema 演进、ETL、CDC、数据质量
第9部分性能、安全与可靠性最小权限、注入与加密、备份恢复、慢查询、容量、复制和事故响应
第10部分综合项目PostgreSQL + MongoDB + Redis + Supabase 的内容订阅 SaaS

建议初学者按顺序完成。已有 SQL 基础的人也不要完全跳过第 1 部分:其中的 SQLite、条件更新、执行计划和恢复实验是后续章节的共同基础。

贯穿案例

图书馆系统

第 1 部分使用读者、图书和借阅记录学习主键、外键、约束、事务、查询与索引。你会用两个并发终端争抢最后一本库存,观察条件更新怎样阻止超卖,再完成导出和恢复。

任务协作应用

第 2、4、6、8 部分围绕用户、工作区、项目、任务、评论和标签展开。相同业务会分别用关系模型、MongoDB 文档、DynamoDB 单表和多租户结构表达,从而理解数据库差异,而不是只比较产品宣传。

书签与 Supabase

第 5 部分使用 PostgreSQL/Supabase 创建多用户书签应用,前端通过公开 anon key 调用 Data API,数据库 RLS 强制空间成员权限,Storage 保存私有附件,Realtime 同步变化,Edge Function 与 Outbox 处理异步预览。

Knowledge Hub 综合项目

第 10 部分实现内容订阅 SaaS。PostgreSQL 保存成员与文章元数据,MongoDB 保存动态内容版本,Redis 保存可重建缓存和热榜,对象存储保存附件,Outbox 推动跨系统发布。随后再用 Supabase JSONB 实现单数据库替代方案,比较复杂度和适用条件。

推荐实验环境

安装以下工具:

Git
Node.js 22 或项目当前 LTS
Docker Desktop / Docker Engine + Compose
数据库命令行:psql、mysql、sqlite3、mongosh、redis-cli
代码编辑器

不必一次安装所有本地数据库。优先用 Docker 运行服务端数据库,用 sqlite3 完成零配置 SQL 实验。云服务章节需要对应账号,但多数核心建模和 API 可以先在本地 Supabase/AWS 模拟环境练习。

每个实验使用独立数据库名和资源前缀,例如:

library_dev
task_lab
hub_test
hub:dev:session:...

清理命令执行前确认环境和目标,不对工作区根目录或未知数据卷做递归删除。

每章怎么学

  1. 先阅读“访问模式”或业务规则,自己预测数据结构;
  2. 复制命令到隔离实验环境,观察真实输出和错误;
  3. 不只执行成功路径,主动触发重复键、外键、版本冲突、超时和服务中断;
  4. 完成本章验收,保存查询、执行计划、测试或恢复报告;
  5. 把示例替换为自己的项目实体,再判断结论是否仍成立。

教程中的 SQL 需要根据数据库方言运行。PostgreSQL 使用 $1 参数、timestamptz 和 JSONB;MySQL 常用 ?、不同 DDL 与执行计划;SQLite 的类型和写并发语义又不同。不要只替换连接串便假定完全兼容。

共同工程原则

先写访问模式,再选数据库

列出查询、写入、排序、数据量、一致性和生命周期。关系型数据库通常是业务事实的稳妥默认选择;文档数据库适合整体读写和结构演进;Redis 适合已知键的低延迟、过期数据和可重建缓存。没有明确收益时,不为“以后可能很大”提前引入多数据库。

数据库约束和应用校验同时存在

前端/服务校验提供友好错误,数据库 NOT NULL、UNIQUE、CHECK、外键和条件写抵抗并发及其他写入源。先查再插不能代替唯一约束,先查库存再无条件扣减不能抵抗并发。

所有输入都不可信

使用参数化查询,动态列名和排序用固定白名单;用户身份来自已验证会话,不来自 Body;所有资源查询带租户/工作区作用域;浏览器公开密钥依赖 RLS,管理员密钥永远不进入客户端。

缓存、搜索和统计是派生数据

为每份派生数据指定事实来源、失效/同步机制、可接受延迟和重建方法。Redis 丢失应能回源;搜索索引损坏应能由事实库重建;计数字段应有质量检查。

备份必须恢复过

同时定义 RPO(最多丢多少)和 RTO(多久恢复),定期把备份恢复到隔离环境,并用行数、抽样、权限和业务流程验证。备份命令成功不等于系统可恢复。

章节验收标准

完成小册后,你应能独立完成:

  • 从业务需求画 ER 模型,设计关系、文档、键和索引;
  • 使用 MySQL、SQLite、PostgreSQL、MongoDB 和 Redis 完成可运行 CRUD;
  • 使用原生驱动、Prisma/Drizzle 和 Supabase API 安全访问数据库;
  • 通过事务、条件写、版本和幂等键处理并发;
  • 为多租户系统建立数据库作用域和反向权限测试;
  • 执行兼容滚动部署的 Schema 迁移与批量回填;
  • 使用 Outbox/CDC 驱动跨系统事件并处理重复、乱序和重放;
  • 分析执行计划、连接池、锁与慢查询;
  • 建立最小权限、密钥轮换、备份恢复、容量和事故 Runbook;
  • 部署并验收一个 PostgreSQL、MongoDB、Redis/Supabase 组合项目。

从第 1 部分开始时,只需要准备 SQLite 或 MySQL 环境。每一部分会给出后续工具和数据,按验收任务逐步推进即可。