如何为你的应用添加数据库(避免日后丢数据)
要为你的应用添加数据库,请选择一个托管的关系型数据库(通常默认选Postgres),把它的连接字符串保存在服务器端的密钥中,为应用存储的每一类事物创建一张表,并让后端(而不是浏览器)读写这个数据库。如果你使用AI应用构建器,通常只需说一句“把这个保存到数据库”,代理就会设置好表和代码;你的工作是清楚地描述数据,并确认数据真的被保存下来。
本指南涵盖何时需要数据库、主要的选择、如何描述你的数据,以及导致数据丢失或泄露的常见错误。
你的应用何时需要数据库
当应用必须在页面关闭后记住某些内容,或者在人与人之间共享数据时,你就需要数据库。典型迹象包括:
- 访客提交内容:表单、注册、预订、订单
- 用户拥有带有自己已保存内容的账户
- 管理员需要查看或编辑其他人创建的内容
- 你希望统计一段时间内的报表或计数
如果是一个所有人看到的内容都相同的静态网站,例如作品集或简单的落地页,则不需要数据库。如果你不确定数据库到底是什么,请先阅读什么是数据库。
你的选择
| 选项 | 是什么 | 适合 | 权衡 |
|---|---|---|---|
| AI应用构建器自带的数据库 | 为你的项目创建并连接好的数据库 | 大多数用AI构建器做的应用 | 与该平台的托管绑定;导出和备份取决于平台 |
| 托管的Postgres或MySQL | 你单独注册的托管关系型数据库 | 自己托管的应用,或多个服务共享的数据库 | 你需要自己管理密钥、连接数上限和套餐 |
| 后端即服务(BaaS) | 数据库加上身份认证、存储和API,集成在一个产品中 | 前端为主、希望直接用现成登录功能的应用 | 需要学习更多厂商特有的概念 |
| 文档型(NoSQL)数据库 | 存储灵活的类JSON文档 | 结构非常不规则的数据 | 关系和报表更难处理 |
| 把电子表格当数据库 | 通过API使用Google Sheets等 | 很小的内部工具、原型 | 速度慢,没有真正的约束,并发编辑时容易出错 |
对于大多数中小型Web应用,像Postgres这样的关系型数据库是合适的默认选择。它擅长处理关联关系(一个客户有多个订单),能保持数据一致,并且之后可以用SQL回答各种问题。通俗的介绍见什么是Postgres。
先描述你的数据
最有用的一步,是写下你的应用要存储的事物以及它们如何关联。你不需要数据库术语。以一个预订应用为例:
- 客户: 姓名、邮箱、电话
- 服务: 名称、时长、价格
- 预订: 哪位客户、哪项服务、开始时间、状态(待确认、已确认、已取消)
这就是三张表。“哪位客户”和“哪项服务”会成为它们之间的关联(外键)。早期把这一点想清楚,比任何技术选型都重要得多,因为修改已经存有真实数据的结构,比修改页面布局困难得多。
几条经验法则:
- 每类事物一张表。 不要把订单以文本形式塞进客户的某一列里。
- 每一行都要有ID和创建时间。 以后你一定会用到。
- 使用正确的数据类型。 日期用日期类型,金额用整数分或定点小数,不要存成文本。
- 把必填字段标记为必填。 让数据库拒绝错误数据,而不只是依赖表单。
示例提示词
一次只做一个功能,不要一口气丢给它整个数据结构:
为这个应用添加数据库。创建一张 bookings 表,包含客户姓名、邮箱、服务、开始时间和状态(待确认、已确认、已取消;默认待确认)。把预订表单的提交保存到该表,显示成功提示,并添加一个管理页面,按最新优先列出所有预订。
然后再扩展:
添加一张 services 表(名称、时长(分钟)、价格(分))。把预订中自由填写的服务字段替换为指向 services 的关联,并迁移现有预订,且不要删除任何记录。
然后收紧约束:
确保所有数据库读写都在服务器上进行。浏览器绝不能接收到数据库连接字符串。在插入前,先在服务器上校验邮箱和开始时间。
分步操作
- 列出你的数据,如上所述:事物、字段、它们之间的关联。
- 创建数据库。 在AI构建器中,直接在聊天里要求创建。其他情况下,创建一个托管的Postgres实例并复制其连接字符串。
- 把连接字符串保存为密钥(服务器上的环境变量),绝不要写进代码。参见环境变量与密钥。
- 创建表。 使用迁移(migrations),即记录版本、用于修改结构的脚本,这样变更可以重复执行且可以回退。
- 构建服务器路由,负责创建、读取、更新和删除记录(CRUD)。浏览器调用这些路由,而不是直接访问数据库。
- 把界面连接到这些路由:保存的表单、加载的列表,以及没有数据时的空状态。
- 测试持久化。 提交一条数据,刷新页面,然后在另一个浏览器中打开。如果数据不在,说明它没有被保存到数据库。
- 检查访问权限。 以第二个用户登录,确认你看不到或修改不了第一个用户的数据。
- 发布后再次测试线上地址,因为已发布的应用可能使用与预览不同的连接。
常见错误
- 保存到浏览器就以为已经存好了。 localStorage 在你的电脑上看起来正常,直到有人在另一台设备上打开应用才会发现问题。务必在第二个浏览器中测试。
- 把连接字符串放进前端代码。 任何人都能读到前端代码,这等于把整个数据库交了出去。
- 没有访问检查。 “显示我的订单”必须在服务器上按当前登录用户过滤,而不是只在界面里过滤。这是AI构建应用中最常见的安全漏洞;我们的安全检查清单涵盖了这一点。
- 破坏性的结构变更。 要求“重命名表”或“修改结构”时,可能会删除并重建该表。如果已有真实数据,请明确说“迁移现有行,不要删除任何内容”。
- 把文件存进数据库。 图片和PDF应该放在文件存储中,表里只保存它们的URL或键。参见如何为应用添加文件上传。
- 没有备份。 在拥有客户之前,就要弄清楚平台如何备份数据、如何恢复。
检查清单
- 每类事物都有自己的表,并带有ID和创建时间
- 必填字段和数据类型由数据库强制执行
- 连接字符串只保存在服务器端密钥中
- 所有读写都通过服务器路由进行
- 每个用户只能读取和修改自己的数据
- 数据在刷新后依然存在,并能在另一个浏览器中看到
- 结构变更使用迁移,并保留现有行
- 你知道备份和恢复如何操作
- 发布后已在线上地址测试过应用
在Mythex中添加数据库
在Mythex中,每个项目都可以获得一个专属的Postgres数据库,Free和Pro套餐均可使用。你通常不需要单独点击“附加”按钮:在聊天中提出需求(例如“把候补名单邮箱保存到数据库”),或输入 /database,连接信息就会注入到工作区和已发布的应用中。项目设置中会显示数据库是否已启用。
数据库在空闲5分钟后休眠,下一次请求时再唤醒。已发布应用的用量按数据库实际处于唤醒状态的时间计费,并从你构建时使用的同一积分余额中扣除。如果你是在发布之后才添加的数据库,请重新发布,让线上应用获取到它。
更多信息见文档中的数据库,以及构建CRUD应用示例。关于按用户保存数据所需的登录功能,请阅读如何为应用添加登录。
常见问题
我的应用需要数据库吗?
只要应用需要在访问之间记住某些内容,或在用户之间共享数据,就需要数据库,例如注册、订单、预订、帖子或设置。只向所有人展示相同内容的静态网站不需要数据库。
小型Web应用应该用哪种数据库?
对大多数小型Web应用来说,Postgres这类关系型数据库是稳妥的默认选择。它擅长处理用户、订单、关联关系和报表,支持广泛,在小规模下几乎不会超出其能力。
我可以把数据存在浏览器里,而不用数据库吗?
localStorage等浏览器存储只保存在一台设备的一个浏览器里,而且用户随时可以清除。它适合保存主题选择之类的偏好设置,但不适合任何你或其他用户之后需要看到的数据。
Mythex包含数据库吗?
包含。Free和Pro套餐中,每个Mythex项目都可以获得专属的Postgres数据库。你可以在聊天中提出需求,或输入 /database 命令,连接信息会自动注入。用量与构建所用的积分余额相同,从同一余额扣费。