1. 从 KV 的局限说起
上一篇我们用 KV 存数据,体验很简单:给一个 key,存一个 value,取的时候再用 key 把 value 拿出来。
但你很快就会遇到 KV 干不了的事。比如你要做一个用户系统:
- "查出所有注册时间在上个月的用户" —— KV 做不到,它只能按 key 取值,不能按字段筛选
- "找出所有下过订单但没付款的用户" —— 这需要把用户表和订单表关联起来查,KV 连"表"的概念都没有
- "把用户的邮箱从 a@test.com 改成 b@test.com,但得先确认没有别人用了 b@test.com" —— 这涉及唯一性约束,KV 也管不了
这些需求指向同一个东西:关系型数据库。
2. 关系型数据库 vs 非关系型数据库
数据库大的方向分两类,在学 D1 之前先把这两个概念理清楚。
关系型数据库
关系型数据库把数据组织成一张张表(Table),就像 Excel 表格:每一行是一条记录,每一列是一个字段。
比如一张用户表:
| id | name | created_at | |
|---|---|---|---|
| 1 | Alice | alice@example.com | 2024-01-15 |
| 2 | Bob | bob@example.com | 2024-02-20 |
再来一张订单表:
| id | user_id | product | amount |
|---|---|---|---|
| 1 | 1 | T恤 | 99 |
| 2 | 1 | 帽子 | 59 |
| 3 | 2 | 背包 | 199 |
注意订单表里有个 user_id 字段,指向用户表的 id。这就是"关系"——表和表之间通过字段关联起来。你可以写一条 SQL 把两张表联查:
code.ts
1-- 查出 Alice 的所有订单2SELECT orders.product, orders.amount3FROM orders4JOIN users ON orders.user_id = users.id5WHERE users.name = 'Alice'
关系型数据库的核心能力就是这些:
- 结构化:每张表有固定的列,每条数据都遵循同样的结构
- SQL 查询:可以按任意字段筛选、排序、聚合、分组
- 表关联:通过外键把多张表串起来,联合查询
- 约束:唯一性、非空、外键约束,数据库帮你守规矩
常见的关系型数据库有 MySQL、PostgreSQL、SQLite。
非关系型数据库
非关系型数据库(NoSQL)不按表格来组织数据,根据存储方式的不同又分好几类。上一篇学的 KV 就是其中一种:
- 键值存储(Key-Value):一个 key 对应一个 value,就像一个巨大的
Map。Cloudflare KV、Redis 都属于这类 - 文档数据库(Document):存的是 JSON 文档,每条数据的结构可以不一样。MongoDB 是典型代表
- 列族存储、图数据库……还有其他类型,这里不展开
非关系型数据库的共同特点是:灵活,但查询能力有限。不能写 SQL,不能跨表联查,很多事情得靠应用层代码自己实现。
怎么选
简单判断:
- 数据之间有关联、需要复杂查询 → 关系型数据库
- 数据结构简单、按 key 存取就够用 → 非关系型数据库
在 Cloudflare 的生态里,KV 是非关系型的键值存储,而 D1 就是关系型数据库。
3. Cloudflare D1
D1 是 Cloudflare 提供的边缘 SQLite 数据库。前面讲了一堆概念,落到实际就是这几件事:
- 基于 SQLite,支持标准 SQL 查询
- 部署在 Cloudflare 边缘网络,读取速度快
- 适合读多写少的场景(用户信息、博客内容、配置数据等)
- 免费额度够个人项目用
上一篇用 KV 存简单的键值对,这一篇用 D1 来做需要建表、查询、关联的正经数据操作。
订阅后可阅读剩余内容
AI 电子伴侣企业级项目实战
已发布234节计划发布120节目标已完成195%