指南

什么是数据库?面向应用构建者的指南

数据库是应用用来保存和读取信息的一个有组织的存储,比如用户、订单、预约和消息。与只保存在浏览器标签页中的信息不同,数据库中的数据在刷新或重启之后依然存在,而且使用该应用的每个人看到的都是同一批记录。大多数数据库把数据组织成表,很像电子表格中的工作表,但它们有严格的规则来保证数据的一致性。

用 AI 做应用时,为什么这很重要

使用 AI 构建应用的人最常遇到的意外,是应用看起来已经完成了,却忘记了所有东西。你添加了一位客户,刷新页面,结果客户不见了。这通常说明应用是把数据保存在浏览器的内存里,而不是数据库中。

数据库也是许多最重要的决定所在的地方,不论你是否意识到:

  • 你记录什么。 如果你不保存预约的状态,就无法显示哪些预约已被取消。
  • 事物如何关联。 一位客户能否拥有多个预约,或者一个预约能否包含多项服务,决定了整个应用的结构。
  • 谁能看到什么。 大多数隐私问题都与用户能读取哪些记录有关。

你不需要亲自设计数据库。但理解基础知识,能让你清楚地描述自己的数据,并及早发现问题。

日常类比

想象一间井井有条的小型办公室里的文件柜。

每个抽屉存放一类东西:一个抽屉放客户,一个放预约,一个放发票。每个抽屉里,每个文件夹都遵循相同的格式,填写相同的字段。每个文件夹都有唯一的编号,当一张发票属于某位客户时,发票文件夹会记下那位客户的编号,而不是把整份客户档案复印一份。

这就是关系型数据库。抽屉是表,文件夹是行,字段是列,编号是主键,而指向另一个文件夹的备注就是外键。一位好的办公室经理还会执行规则:没有日期的预约不能录入,两位客户不能有相同的编号。数据库也是这样执行规则的。

实际例子:一个美发店预约应用

假设你请 AI 为一家美发店构建预约网站。一个合理的数据库会有四张表。

services(服务)

idnameduration_minutesprice
1剪发4540.00
2染发9095.00

staff(员工)

idnameemail
1Sarasara@example.com
2Omaromar@example.com

customers(客户)

idnameemailphone
101Lena Parklena@example.com555-0100

bookings(预约)

idcustomer_idservice_idstaff_idstarts_atstatus
5001101122026-10-03 14:00confirmed

看看 bookings 这张表。它没有把 Lena 的姓名和电话复制到每一条预约里,而是只存储 customer_id = 101。如果 Lena 更换了电话号码,只需在一个地方修改,每条预约都会显示新号码。这正是关系型数据库的核心思想:每个事实只存一次,然后通过链接去引用它。

同样的结构也能回答一些有用的问题:

  • “Omar 周五哪些时段空闲?”——查看 Omar 当天的预约。
  • “本月染发服务的收入是多少?”——将预约与服务表关联,再把价格加起来。
  • “哪些客户 90 天没有预约了?”——将客户与他们最近一次预约进行比对。

常用术语说明

术语含义
表(Table)同一类记录的集合,比如客户或预约。
行(Row / record)表中的一项,比如一位客户、一条预约。
列(Column / field)每一行都有的一项信息,比如邮箱或价格。
主键(Primary key)每一行的唯一 ID,通常是一个数字或随机字符串。
外键(Foreign key)指向另一张表中某一行的列,比如预约表中的 customer_id。
模式(Schema)整体设计:有哪些表、每张表的列以及它们如何关联。
查询(Query)读取或修改数据的请求,比如“明天所有的预约”。
SQL结构化查询语言(Structured Query Language),关系型数据库的标准查询语言。
迁移(Migration)对模式的一次已保存、可重复执行的修改,比如新增一列。
索引(Index)一种查找结构,让对某列的搜索更快,就像书的索引。
CRUD创建(Create)、读取(Read)、更新(Update)、删除(Delete),是应用处理数据的四项基本操作。
备份(Backup)数据的一份副本,出问题时可以用来恢复。

数据库的类型

类型存储方式示例适用场景
关系型(SQL)具有固定列以及表之间关联的表Postgres、MySQL、SQLite大多数业务应用:预约、商店、CRM、SaaS
文档型(NoSQL)灵活的类 JSON 文档MongoDB、Firestore每条记录的结构差异很大的数据
键值型通过键存储值Redis缓存、会话等短期数据

对于创业者或小企业首先要构建的几乎所有应用,关系型数据库都是安全的默认选择。

数据库在应用中的位置

访客不会直接与数据库通信。他们浏览器中的页面(前端)通常通过 API 向你的服务器(后端)请求数据。服务器会检查请求者的身份及其权限,然后查询数据库,并只把该用户应该看到的内容发送回去。

这一中间环节很重要。如果浏览器可以带着完全权限直接查询数据库,任何人打开开发者工具,就能读取所有数据。

常见错误与误解

  • 只把数据保存在浏览器里。 浏览器存储(比如 localStorage)只存在于一台设备、一个浏览器中。它适合用来记住一个筛选条件,但不适合保存订单。
  • 把所有东西塞进一张表。 一张“预约”表里,每一行都复制了客户的姓名、电话和服务价格,很快就会不同步。
  • 明文保存密码。 密码应当经过哈希处理,绝不能以可读形式存储。参见什么是身份验证。
  • 数据没有规则。 如果没有必填字段和唯一性规则,你就会得到没有日期的预约和重复的客户。
  • 忘记删除的问题。 要决定删除客户时,是同时删除他的预约、保留预约,还是直接阻止删除。
  • 用生产数据做实验。 在安全的地方先测试有风险的修改,并保留备份。
  • 永远把电子表格当作数据库。 电子表格很适合起步,但在多人同时使用和权限管理方面会力不从心。参见如何把电子表格变成应用。

向你的 AI 生成工具提出的要求

  • “把这些保存到数据库里,而不是浏览器中。告诉我你会创建哪些表。”
  • “用一张简单的表格展示模式:每张表、它的列以及它们如何关联。”
  • “一位客户可以有多条预约;每条预约恰好对应一项服务和一位员工。”
  • “客户的邮箱必须填写,并且唯一。”
  • “阻止同一位员工的两条预约时间重叠。”
  • “只有已登录的店主可以读取所有预约;客户只能看到自己的预约。在服务器端强制执行这一点。”
  • “删除某项服务时,不要删除过去的预约,而是将该服务标记为停用。”

Mythex 中的数据库

当你的应用需要保存数据时,Mythex 会为项目添加一个专用的 Postgres 数据库。你可以在聊天中提出要求(“把候补名单的报名信息保存到数据库”),也可以使用 /database 命令。连接信息会自动传给你的应用,并由智能体创建表。数据库在空闲 5 分钟后会进入休眠,并在下一次请求时唤醒;已发布的应用则按数据库处于唤醒状态的时长计费,计费从与构建相同的积分余额中扣除。免费版和 Pro 版都可以使用。数据库文档涵盖了所有细节,而应用模板则提供了数据驱动的入门起点。

常见问题

简单来说,什么是数据库?

数据库是一个有组织的信息存储,应用可以向其中保存数据,也可以从中读取数据,比如用户、订单或预约。与只保存在浏览器标签页中的数据不同,数据库中的内容在刷新、重启之后依然存在,而且有人从其他设备打开应用时也能看到。

电子表格是数据库吗?

电子表格可以保存同类数据,但它并不是为应用设计的。真正的数据库会强制规定每一列存放什么内容,可靠地关联各个表,能处理多人同时写入的情况,并控制谁可以读取哪些数据。

SQL 数据库和 NoSQL 数据库有什么区别?

SQL(关系型)数据库,比如 Postgres 和 MySQL,将数据存储在带有定义好的列以及表之间关系的表中。NoSQL 数据库,比如 MongoDB,存储更灵活的文档。大多数业务应用(预约、CRM、商店)都很适合关系模型。

我的应用需要数据库吗?

如果它需要记住用户输入的任何内容(注册信息、订单、消息、设置),并在之后或者对其他人展示这些内容,那么需要。纯信息型网站,没有会保存数据的表单,通常不需要。

Mythex · Pricing · 用 AI 构建任何东西 · 网站和应用模板 · Mythex 对比 · AI 应用构建术语表 · 免费的 AI 应用构建工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 繁體中文(香港) 繁體中文(台灣)