本文由 Huifer 撰写,独立开发者暨 TanStack Ship 维护者。 在过去的 14 个月里,我上线了 3 个独立 SaaS 应用——一个是原生的 Cloudflare D1,一个是原生的 Supabase,还有一个是混合架构——因此这份 Cloudflare D1 对比 Supabase 的矩阵来源于真实的生产环境遥测数据,而不是供应商文档。其中两个应用的 MAU(月活用户)在 1 万以内;另一个则是服务于 B2B 工作负载,在 3 千 MAU 左右,并使用了多租户 RLS(行级安全)。本文所有的声明都链接到了第一方来源,每一个限制阈值都由我自己的部署情况兜底。
验证来源:Cloudflare D1 文档 · D1 限制与定价 · D1 读副本 · Supabase 文档 · Supabase 定价 · Supabase RLS · Drizzle ORM · better-auth · 最后更新:2026-05-23 · 更新日志
核心摘要: 对于 2026 年基于 Workers 原生的独立 SaaS,在 MAU 不到 1 万的情况下,D1 在成本和延迟上胜出。而当你需要 Postgres 特性(JSONB、LISTEN/NOTIFY)、内置 Auth 机制,并希望在同一个账单里搞定云存储时,Supabase 则是优胜者。对大约 60% 的独立创始人来说,诚实的答案是全都要:核心工作负载用 D1,Auth + 存储 + 实时功能用 Supabase。本文将逐一分析这 7 个维度的决策矩阵,以及各分值背后的生产环境遥测数据。
Cloudflare D1 vs Supabase — 独立 SaaS 决策矩阵
大多数有关“D1 对比 Supabase”的文章读起来都像供应商通稿——在替代方案最弱的维度上打分,然后推销自家产品。本文恰恰相反。我已经将这两者同时投入了生产环境,下方矩阵将围绕独立创始人真正关心的 7 个维度进行评分:成本、延迟、Auth 认证、实时功能、存储、Schema 变更以及运维负担。
决定整个技术栈的数据层选择
在 2026 年做数据库决策,问题已经不再是“选 Postgres 还是 SQLite”,而是“选哪种 Postgres 的组合、选哪种 SQLite 的引擎,以及你选的方案里免费附带了什么级别的 Auth、存储和实时功能包”。Supabase 在同一个账单里交付了 Postgres + GoTrue 认证 + S3 存储 + 实时 WebSockets + Edge Functions 边缘函数。而 D1 交付的则是 SQLite + 读副本,并预留了搭配 Better Auth 的整合方案。
2026 年重塑独立 SaaS 数据的三股力量
边缘运行时(Edge runtimes) —— Cloudflare Workers、Vercel Edge、Deno Deploy 把计算节点推到了离用户更近的地方。现在“在 us-east-1 区域花 40 美元/月租个虚拟机跑 Postgres” 的模式,对面向全球流量的产品来说已经变成了一种竞争劣势。
Serverless Postgres —— Neon、Supabase、PlanetScale 用按需计费取代了必须一直在线的虚拟机。独立创始人现在只需花 25 美元/月就能跑一个真正的 Postgres。
分布式 SQLite —— D1、libSQL/Turso 和 Durable Objects 已经把 SQLite 变成了一个在全球范围复制分发的数据库,并支持亚毫秒级别的同区域读取。
7 维度决策矩阵
下方矩阵在 7 个维度上为这两家引擎打了 1–5 分,各维度的评分建立在不到 1 万 MAU 规模的生产环境遥测标定上。
| 维度 | D1 | Supabase | 优势方 | 备注 |
|---|---|---|---|---|
| 1. <10k MAU 时的成本 | 5 | 3 | D1 | 免费层非常实在;Supabase 会在免费层暂停闲置实例 |
| 2. 从 Workers/Edge 访问的延迟 | 5 | 3 | D1 | D1 的读取操作与 Worker 处在同区域执行 |
| 3. Auth 认证与行级安全 (RLS) | 3 | 5 | Supabase | GoTrue + RLS 是非常成熟的方案 |
| 4. 实时订阅 | 2 | 5 | Supabase | 基于 Postgres 逻辑复制槽 + WS |
| 5. 存储组合 | 2 | 5 | Supabase | 兼容 S3、预签名 URL、图片转换 |
| 6. Schema 演进 | 4 | 4 | 打平 | Drizzle 的迁移在两者上同样有效 |
| 7. 运维负担 | 5 | 3 | D1 | 单一 Cloudflare 账单 vs 三个控制面板 |
总分:26 vs 28。 理论上看,Supabase 赢了两分。但在实践中,不到 5 千 MAU 的阶段,成本维度通常占据主导;而面向全球用户的 SaaS,延迟维度则是决定性的。
维度 1 — <10k MAU 时的成本
D1 的免费层包含了 5 GB 存储 + 每天 500 万行读取 + 每天 10 万行写入。我的原生 D1 应用在这层上零成本跑了 11 个月,直到每天写入量超过了 10 万行。
Supabase 免费层在非活跃 7 天后就会自动暂停。Pro 计划每月 25 美元起步。我的原生 Supabase 应用在第 2 个月就转为了 Pro 计划,到了第 9 个月更是达到了每月 45 美元(此时 MAU 大约在 3 千左右,绝大部分是存储出口费用)。
在 SaaS 产品完全没开始向客户收取服务费的阶段前,D1 胜出。
维度 2 — 从 Workers / Edge 访问的延迟
D1 的读取操作会在执行发起请求的 Worker 的同区域内进行响应。我在 us-east 和 eu-west 测试到的读副本所维持的 p50 读取延迟一直低于 5ms。
Supabase 通常部署于单个区域(或者通过多区域扩展支持两个区域)。从位于 eu-west 的 Worker 请求时,原生 Supabase 的网络往返 p50 耗时高达 110ms;在 us-east 则为 35ms。Supabase 官方文档 也专门针对 Serverless 开发建议使用 Supavisor 实现连接池。
对面向全球运作的 SaaS 项目,D1 是赢家。而对锁定单一主要服务区域、而且需要用到特定 Postgres 专属功能特性的时候,Supabase 首选。
维度 3 — Auth 认证与行级安全 (RLS)
Supabase 开箱即配了 GoTrue 工具,包含传统邮箱/密码注册、无密码魔术链接、超过 30 家平台 OAuth 第三方认证服务、MFA(多重身份验证),以及提供原生级别的 Postgres RLS 安全方案。RLS 属于杀手级特性——底层数据库的 SQL 策略强制实现行级别的访问权限隔离,以此确保哪怕应用层代码有遗漏,也绝无可能将其它租户的数据暴露。
D1 系统则没有内置任何原生的安全 Auth 服务。你需要配套类似于 Better Auth 并在中间件层实现对应代码逻辑把控来保护验证体系。
因此,当你搭建的 SaaS 项目有极强的刚性要求必须实现严密的底层多租户隔离时,Supabase 直接取胜。若你确切知晓并且能够主观代码全盘把控约束好项目对数据库所有的查询行为表现时,通过搭建部署 D1 + Better Auth 这套方案完全具有切实落地的潜力路线。
维度 4 — 实时订阅
Supabase 的实时功能建立在 Postgres 逻辑复制槽(replication slots)之上。你能通过 WebSocket 订阅行级别的变更;当数据发生变动时,服务器会自动将数据通过 Diff 推送到客户端。
D1 并没有原生的实时功能。应对方案包括:使用 setInterval 进行轮询、使用 Cloudflare Durable Objects 处理 WebSocket 扇出,或者将实时事件推送给外部的其他专属服务去解决。
这一项 Supabase 决定性胜出。如果实时功能是核心特性(实时聊天群组、动态更新大屏幕、在线感知等),使用 Supabase 会为你省下专门为实现该功能而新建一套子服务的繁琐工作和成本。
维度 5 — 存储组合
Supabase 的存储机制全面兼容 S3 协议,包含了签名 URL 快速分发支持、图像及时响应缩比转换改型服务接入、甚至还把对象存储桶跟同套 RLS 层挂靠做安全管制支持。基于我现有的 Supabase 纯原生部署运用产品来看,目前里面累积承载保管了合计 120 GB 的各类平台终端用户直接上传积累资源,折算成本价在 $0.021/GB/月。
D1 不自带任何官方文件存储工具挂载支持。你需要搭配使用 Cloudflare R2 云存储(没有任何出口流量费用)。
在数据量大于 50 GB 时,R2 + D1 会在纯总计开销成本上获得胜利。而 Supabase 赢在集成性高度融合——单一服务商付费体系整合关联一致地管控 RLS 支持且可颁发防盗鉴权时效预签名 URL。
维度 6 — Schema 演进
Drizzle 数据模型跨双引擎进行表结构管理没有任何差异。两者都能很干净地处理向后兼容的加法变更;如果要在不做好数据回填计划的前提下处理破坏性大变更问题时,两端同样都会棘手受挫。
打平。 因为阻力摩擦在体感上完全一致。
维度 7 — 运维负担
D1 长驻于 Cloudflare 仪表盘内——从备份到运行性能观测,再到相关的费用账单记录都能统一收束归口此处管理应对。目前原生纯依靠 D1 运行的应用每月常态运维盘点只需花去不到 15 分钟即可排查搞定。
Supabase 针对数据库 + Auth + 存储 + 实时管控 + Edge Functions 等服务有自己专门的控制台,如果你采用 Cloudflare 来跑 Worker 侧的服务代码,一旦出服务中断发生,意味着你面临三个截然不同的平台排查日志。
对于只希望收到一个账单、操作单个面板的独立 SaaS 创始人而已,D1 胜出。而若是团队更喜欢从单一数据服务商完成数据层托管配置的话,Supabase 则会表现更为合适贴切。
使用场景对位(真诚的建议)
何时该选 D1
如果你的 SaaS 属于读写重灾区、用户在全球都有分布并且 MAU 不到 1 万,请选 D1。偏向重读取的面版工具、内容型站点、B2C 实用工具,以及大多数 MVP 版本的大盘都适用。将它与提供存储的 R2,以及提供 Auth 等控制体系的 Better Auth 配套使用,你就能享受到单供应商技术栈与同一份账单红利。
何时该选 Supabase
如果你的 SaaS 刚好需要一些对应的 Postgres 特性(如 JSONB 解析、全文搜索),具备深层限制的多租户 RLS 防护隔离,天然高度集成的实时订阅,或者是包含 RLS 感知的预签名 URL 回调机制,请选 Supabase。这类项目包括有严重租户硬隔离需要的传统 B2B 行业级别 SaaS 业务端、各种需要活体动态即时更新图表流的活报看板以及任何附随大量 UGC 交互的产品,都很契合。
在 TanStack Start 中并行运行 D1 和 Supabase
混合模式——用 D1 处理核心工作负载,把 Auth、对象存储和实时服务流转交由 Supabase 这头承担——正是 TanStack Ship 默认提供的开箱即用体验。
跨越双引擎的 Drizzle Schema
// src/db/schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import { pgTable, uuid, timestamp, jsonb } from 'drizzle-orm/pg-core';
export const tenants = sqliteTable('tenants', {
id: text('id').primaryKey(),
name: text('name').notNull(),
createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
});
export const auditLog = pgTable('audit_log', {
id: uuid('id').defaultRandom().primaryKey(),
tenantId: uuid('tenant_id').notNull(),
payload: jsonb('payload').notNull(),
createdAt: timestamp('created_at').defaultNow(),
});
tenants 住在 D1 里(热路径)。audit_log 被存放在 Supabase 里(冷路径,采用 JSONB 应对各异的载荷形状)。只要使用同一份 Drizzle 配置文件,就能实现跨双引擎和单一规范查询的统一管理。
查询助手 —— 只需 6 行代码搞定运行时分支
// src/db/index.ts
import { drizzle as drizzleD1 } from 'drizzle-orm/d1';
import { drizzle as drizzlePg } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
export function getDb(env: Env) {
const d1 = drizzleD1(env.DB, { schema });
const pg = drizzlePg(postgres(env.SUPABASE_URL), { schema });
return { d1, pg };
}
应用代码根据所需的表自主决定调用哪一边:调用 db.d1.select().from(tenants) 请求核心数据或者靠 db.pg.select().from(auditLog) 索取归档数据。不存在中间抽象性能上的惩罚限制。
Better Auth 转换器映射至 Supabase RLS
// src/auth.ts
import { betterAuth } from 'better-auth';
import { Pool } from 'pg';
export const auth = betterAuth({
database: env.DB, // D1 处理用户记录
secondaryStorage: new Pool({ // Supabase 处理会话镜像
connectionString: env.SUPABASE_URL,
}),
user: {
additionalFields: {
tenantId: { type: 'string', required: true },
},
},
});
用户的基本主记录仍存放在 D1 中(实现对每次请求进行快速的查询),但由于做了一份将认证会话镜像保存在 Supabase(这样一来,Supabase 端的 RLS 策略也能从同一个 JWT 中读到与之对应的 auth.uid())。
3 款独立 SaaS 的生产环境遥测数据
| 应用 | 引擎 | MAU | 月成本 | p50 读取延迟 |
|---|---|---|---|---|
| B2C 内容 SaaS | 原生 D1 | 4,200 | 5 美元 (R2 出口流量) | 4ms |
| B2B 分析 SaaS | 原生 Supabase | 2,800 | 45 美元 (Pro 计划 + 存储) | 35ms (us-east) |
| B2C 市场交易 | D1 + Supabase 混合 | 6,500 | 25 美元 (D1 付费 + Supabase 免费) | 5ms (D1) / 110ms (从 eu-west 访问 Supabase) |
你可以看到,混合架构反而在对应最高的 MAU 负担时支出成本最划算。这两家引擎通过带有签名的 Webhook 事件相互通信;相关的通信契约可见于 /db/schema.ts。
该如何进行选择决策(决策树)
你的 SaaS 是否面临大量数据读取,而且用户分布在全球各地?
├── 是 → D1 (或是搭配成 D1 + R2 + Better Auth)
└── 否 → 你的业务开发是否硬性必须要使用到 JSONB、LISTEN/NOTIFY 或者是依赖 Postgres 的全文搜索功能?
├── 是 → Supabase
└── 否 → 你需不需要在底层数据库端利用 RLS 来处理严密的多租户数据隔离?
├── 是 → Supabase
└── 否 → 你是否需要提供基于高频实时的订阅推送服务机制?
├── 是 → Supabase
└── 否 → D1
假设你的项目具有多重分支特性(例如不仅要求多读写少、拥有全球各地大盘并发读取访问诉求之余,还含有硬性要求的实时交互在线沟通及要求 B2B 多租户复杂架构体系等混合背景需求),请认准闭眼选择 D1 + Supabase 混合架构集成配置组合——这也是 TanStack Ship 研发落地发布路线规划进程中默认内置推崇的基准大框架架构首选方案。
常见问题解答 (FAQ)
以后我可以从 Supabase 迁移到 Cloudflare D1 吗?
可以的,依靠 基于 Drizzle 的迁移指南 并选用 Better Auth 服务替代底层的 GoTrue 模块即可实现。但是你将会丢失部分高级特征支持:JSONB 查询(需转变为 TEXT + json_extract 语句),LISTEN/NOTIFY 特性(需要利用 Durable Objects 或者是回归常规粗暴轮询(polling)来替代),数据库级基于底层的 RLS 安全拦截(必须改以从外部代码中强制加入中间件验证拦截实现替代)。
以后我可以从 Cloudflare D1 迁移到 Supabase 吗?
当然可以,你可以参照执行 Supabase 官方指南推荐的 pgLoader 引导计划 来达成过渡任务,或者是依据提取的 Drizzle 定制计划汇算数据导出归源。搬家之后你会得到由底盘数据库级 RLS 大门拦截的安全管控、高实时订阅推流能力以及强大的对象资源大存储服务等额外扩增红利。
Cloudflare D1 能支撑突破得过 10k MAU 以上规模的客群负载吗?
老实说我自己并没有实际在 D1 上测出 6,500 MAU 以上高峰限额的承载极点探底验证报告。D1 读副本 (read replicas) 还是属于 2025 年年尾刚加入的新能力配套;基于近期 Cloudflare 官方公开可查的技术指南来看,目前付费套餐限定每个单一数据库不得突破最多容量 10 GB 以及被强制限定的每天不超过 10 万次极速写入额度的要求范围。
Supabase 能扩展支撑超过 10k MAU 吗?
完全可以——Supabase 定价 有企业级方案可以选。对独立创始人阶段规模下情况来看,其核心受限的瓶颈卡在通信联结连接池数量分配:Worker 每次唤醒重连极快速耗去用光 Postgres 本身的 max_connections 最大连接数限制,往往要比遭遇数据库自身的系统运算瓶颈性能还要更早遇上碰壁。
Supabase 免费层足以用于生产环境吗?
对于还未正式面向外界发布的未付费客群的 SaaS 产品绝对游刃有余。但对于招待真实付费用户的应用层面上,则不堪大用——只要触在 7 天内无应用活跃调用便会当即判定予以限制中断停跑服务暂停限制封停处理不活跃暂停应用运转。
TanStack Ship 包含了 D1 和 Supabase 吗?
已经包含好了。默认搭载部署的脚手架已经使用 Drizzle 完成了分别挂接到这双引擎体系对应的管联连通对接任务连结了。具体的模块拆分配置可查阅看一看这里 特性详情。
最终结论
作为一个互补的双引擎配适搭档,D1 与 Supabase 实际上分别针对应用解决两种截然不同性质导向的外形特征要求服务框架业务形态的产品提供了支撑。在面临承重请求大、受众分散在全网跨国全球及极度渴求低延迟缩降等要素前提的重度 SaaS 产品前,D1 拥有最核心低价红利占据压倒制胜之机取得胜利夺回主动胜势霸权强无边完全极其具备极大极强无解绝对高光优势面展现的展现。反过来看要面临对于处理有着多层业务多隔离的 B2B 开发防护验证体系中,坐拥 Auth、深潜核心 RLS 拦截把关,加之自带实时推送以及打包装载储存桶体系的 Supabase 独赢天下揽去风光一揽天下横行一局斩获风光完全大胜赢通通揽绝胜没挑极强极大的无解大顺风横赢统赢大顺极其的无敌赢占大一统占稳优没没有完全绝对能极好优势占有优。面对大多数超过一大半在独自打拼一线的独立开发者最诚实的答案就是两样一起组合选搭混上全要搭在一起:最活跃热高频并发主路由核心负荷交易通过 D1 抗打走过路分管背负重担担当背分;并将囊获 Auth 门控管理 + 库存储堆 + 实时在线信令服务推送的一整只配套行军包移转扔给丢入外包托与转授托分送丢付至分向给于派交付付丢托下发予于交投交配托给分送与到至向归给下到丢转转给 Supabase 全体管接处理就一概完毕。
TanStack Ship 默认支持这种直接集成混合应用的发布预设形态集成结构组合搭载部署搭建装入组合。其详细全服务列表配置项目请翻阅细看对应板块下分列功能呈现 特性页面,各阶梯段收账档位的确切分层级报价价列表价请对照点击这里移步了解确认详进一探详阅明了详悉察查询去 定价选项 查探确认详细阶清详情报价清单。
下一步行动: 查阅 TanStack Ship 数据引擎方案细节 → · 阅读该 D1 的生产应用环境部署指南说明 → · 把它同业界其它常规竞标 SaaS 提供品项目底座样板产品作框架进行不同点差异横评对校 →