尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

长期免费的数据库方案——零成本基建系列

长期免费的数据库方案——零成本基建系列 长期免费的数据库方案——零成本基建系列做完前面几篇零成本 API 的整理后数据库这一块花了更久。原因很简单很多“免费数据库”的介绍只写了注册时送多少额度却没写清楚额度会不会重置、闲置会不会暂停或者把缓存服务也算成数据库。服务类型当前免费规则这次测试Cloudflare D1SQLite / SQL5 GB总计每天 500 万行读取、10 万行写入完整 CRUD 通过SupabasePostgreSQL500 MB 数据库、2 个活跃项目本机完整 CRUD 通过MongoDB Atlas M0文档数据库512 MB、共享实例本机完整 CRUD 通过Firebase Firestore文档数据库1 GiB、每天 5 万读 / 2 万写 / 2 万删完整 CRUD 通过TiDB Cloud StarterMySQL 兼容前 5 个实例各有 5 GiB 行存储和每月 5000 万 RU能连接但默认用户无建表权限这里的“长期免费”指的是服务商目前有可反复使用的免费档不是承诺永远不改价。个人博客、小工具、原型验证先用这些方案问题不大业务跑起来以后还是要盯一下控制台里的用量和邮件。先按数据长什么样来选如果数据是用户、订单、文章、权限这类有明确关系的东西优先从 SQL 数据库里挑。以后要补查询、统计和关联省得把原本简单的关系拆成一堆文档。MongoDB Atlas 和 Firestore 更适合结构变化频繁的文档数据例如聊天记录、表单内容、设备状态。Firestore 还和 Firebase Auth、移动端 SDK 接得很近已经在 Android 或 Firebase 生态里做东西时会省掉不少接线工作。Redis 也常出现在免费数据库清单里。Upstash Redis 的免费档目前是 1 个库、256 MB、每月 50 万命令。它适合缓存、限流、短期状态不能替代上面这些用来长期存业务数据的库所以没有把它放进正文的主选项。Cloudflare D1已经在 Cloudflare 上时少折腾一套账号D1 是 SQLite和 Cloudflare Workers、Pages Functions 放在同一个体系里。免费计划现在给 5 GB 总存储每天 500 万行读取和 10 万行写入流量不收费配额在 UTC 零点重置。D1 定价说明 写得比较细。我创建了一个临时数据库依次执行建表、插入、查询、更新、删除全部返回正常后立刻删库。D1 不提供给普通 Node 程序直接连的 TCP 地址它更适合把查询放在 Worker 或 Pages Function 里exportdefault{asyncfetch(request,env){awaitenv.DB.prepare(CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT)).run();awaitenv.DB.prepare(INSERT INTO notes (body) VALUES (?)).bind(D1 CRUD test).run();const{results}awaitenv.DB.prepare(SELECT * FROM notes).all();returnResponse.json(results);}};已经在用 Cloudflare Pages 的网站后面真要加一个留言、订阅或访问统计的小接口D1 是我会先试的选项。数据量很大、查询很重或者程序根本不跑在 Cloudflare 上就别为了 D1 绕路。看过前面几期使用过Cloudflare并创建过token的可以在原来的token上增加D1的权限来复用这个token。PostgreSQLSupabase 能直接用Supabase 免费项目给 500 MB PostgreSQL、共享 CPU、5 GB 出站流量和 2 个活跃项目一周没有活动的免费项目可能会暂停免费档也没有自动备份。Supabase 价格页 的限制比较直白。注册的死后注意选择Free。这次用 Node 的pg连 Supabase完整 CRUD 在本机 PowerShell 里通过。中间碰到过一个容易误判成网络故障的问题项目直连地址是 IPv6 优先的在没有 IPv6 的网络里会超时。换成控制台给的 Session Pooler5432 端口后才正常。官方的连接说明也把这两种连接方式分开写了。importpgfrompg;constclientnewpg.Client({connectionString:process.env.SUPABASE_DATABASE_URL});awaitclient.connect();awaitclient.query(CREATE TABLE IF NOT EXISTS codex_db_test (id SERIAL PRIMARY KEY, body TEXT));const{rows:[note]}awaitclient.query(INSERT INTO codex_db_test (body) VALUES ($1) RETURNING id,[Supabase CRUD test]);awaitclient.query(SELECT body FROM codex_db_test WHERE id $1,[note.id]);awaitclient.query(UPDATE codex_db_test SET body $1 WHERE id $2,[updated,note.id]);awaitclient.query(DROP TABLE codex_db_test);awaitclient.end();MongoDB Atlas 和 Firestore文档数据各有各的顺手处MongoDB Atlas 的 M0 仍是免费共享集群容量 512 MB最高 100 次操作/秒。连续 30 天没有连接的免费集群会自动暂停需要时再恢复。Atlas 定价页和闲置集群说明都提到了这一点。注册创建相对简单就不赘述了。测试时用了独立集合插入文档后做了查询、更新、删除最后把集合删除。本机的结果是通过的import{MongoClient}frommongodb;constclientnewMongoClient(process.env.MONGODB_URI);awaitclient.connect();constcollectionclient.db(codex_test).collection(crud_${Date.now()});awaitcollection.insertOne({body:MongoDB CRUD test,version:1});awaitcollection.findOne({version:1});awaitcollection.updateOne({version:1},{$set:{version:2}});awaitcollection.deleteOne({version:2});awaitcollection.drop();awaitclient.close();Firestore 的免费额度是 1 GiB 存储、每天 5 万次读、2 万次写、2 万次删每个项目只能有一个免费数据库。它的计量日按太平洋时间过零如果打开 TTL、PITR 或备份等功能则需要启用计费。Firestore 价格页把这些边界写得很清楚。我用服务账号通过 Admin SDK 写入和删除了一个临时文档CRUD 通过。下面这段是最小的写入、读取和删除import{cert,initializeApp}fromfirebase-admin/app;import{getFirestore}fromfirebase-admin/firestore;constappinitializeApp({credential:cert(JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_JSON))});constdbgetFirestore(app);constrefdb.collection(codex_tests).doc(crud_${Date.now()});awaitref.set({body:Firestore CRUD test,version:1});awaitref.get();awaitref.update({version:2});awaitref.delete();TiDB Cloud Starter连上了卡在权限上TiDB Cloud 的免费 Starter 计划在 2025 年已经改名为 Serverless。一个组织前 5 个 Starter 实例各有 5 GiB 行存储、5 GiB 列存储和每月 5000 万 RU额度用完且消费上限为 0 时连接会被拒绝或限流等下个自然月恢复不会直接自动扣费。Starter FAQ有完整说明。注册创建相对简单注意选择Starter。它用的是 MySQL 协议公网连接要求 TLS。我这次的连接、TLS 和认证都成功了真正执行CREATE TABLE时返回了下面这个错误CREATE command denied to user 3z7**********y71.root%也就是说问题不在连接串或防火墙而是默认prefix.root用户没有建表权限。控制台里没看到SQL Users也不是漏找菜单这个页面目前还是 public preview要从右下角?进入 Support Tickets 申请开通默认 root 用户的角色不能修改。细节见 SQL Users 文档。importmysqlfrommysql2/promise;constconnectionawaitmysql.createConnection({uri:process.env.TIDB_CONNECTION_URL,ssl:{rejectUnauthorized:true}});awaitconnection.query(SELECT 1);// 这一步通过awaitconnection.query(CREATE TABLE codex_db_test (id INT PRIMARY KEY));// 默认用户在这里被拒绝awaitconnection.end();TiDB 的 MySQL 兼容性对已有项目很友好但这次的结果不能写成“CRUD 已通过”。等 SQL Users 申请下来创建一个有 DDL 权限的测试用户再补一次完整测试。注意实际使用时公网白名单不要长期放0.0.0.0/0测试结束后应收回到自己的出口 IP。怎么选要给 Cloudflare 上的小功能加数据选 D1需要 PostgreSQL 又想顺手把登录、文件存储一起处理选 Supabase移动端项目已经在 Firebase 里Firestore 更自然。MongoDB Atlas 适合明确想用文档模型的场景。免费额度能让人少花一笔钱注意做好数据备份切用且珍惜如果你觉得文章对你有用可以关注我获取更多的零成本基建资讯。
返回列表