描述表和它们之间的关系,拿一张带主键外键的 ER 图。
博客数据库结构:users(id, email, name, created_at)、posts(id, user_id FK, title, body, published_at)、comments(id, post_id FK, user_id FK, body, created_at)。一个用户可以写多篇文章,一篇文章可以有多条评论,一个用户可以留多条评论。
Try it →多租户 SaaS:organizations(id, name, plan)、users(id, org_id FK, email, role)、workspaces(id, org_id FK, name)、documents(id, workspace_id FK, author_id FK, title, content)。每个组织有多个用户和 workspace,每个 workspace 有多篇文档,用户可以写多篇文档。
Try it →电商结构:customers(id, email)、products(id, sku, name, price)、orders(id, customer_id FK, total, status, placed_at)、order_items(id, order_id FK, product_id FK, quantity, unit_price)。一个客户下多个订单,每个订单包含多个订单项,每个订单项指向一件商品。
Try it →产品分析结构:users(id, anonymous_id, identified_at)、events(id, user_id FK, name, timestamp, properties json)、sessions(id, user_id FK, started_at, ended_at, device)、page_views(id, session_id FK, url, referrer, duration_ms)。
Try it →写第一个 migration 之前,先把表、字段、关系画出来。字段怎么命名、是一对多还是多对多,对着一张图讨论,比散在五个群里各说各的强。
要把 users 一张表拆成 users、profiles、preferences?在图上标出哪些字段搬到哪。前后两张图一对比,评审的人一眼就能看出哪个外键断了。
新人第一个问题往往是「钱记在哪张表里」。README 里紧挨着 migration 放一张 ER 图,比让他翻四十个 model 文件快。
等保、SOC2、GDPR 评审都会问个人信息存在哪、怎么流转。在 ER 图上把这些字段标出来,比给一张字段清单表格清楚。
为了读得快要不要反范式?要不要加一张预先 join 好的表?把三范式版本和反范式版本并排放,讨论起来快得多。
一句话描述 schema,基数只能靠模型猜:一对多还是多对多,要不要中间表,外键能不能为空。对话模式只就那个会改变整张表结构的基数问一句,剩下的直接画,画完再把猜的地方一条条列出来给你划掉。下面是一套招聘系统的表结构,起点是一句故意含糊的话。
四句话画出了两张中间表、一张可以重复投递的申请表和一张带版本的 offer 表 —— 「画一下我们招聘系统的数据库」这句话里一个都没有。同样一句话直接一次性生成,大概率给你一个 candidate.job_id、一场面试一个面试官,外加每张表都挂着的 created_at,还得你自己一条条删。
ER 图用来讲清楚数据存成什么样,而不用直接甩一段建表语句给对方看。它把每张表画成一个框,列出字段和类型,标出主键外键,最关键的是把表之间是一对一、一对多还是多对多标清楚。
三个时候用得上:写第一个 migration 之前先把结构画出来给大家评审;新人接手已有项目的时候;技术方案里要解释数据模型为什么长这样的时候。要拆表或者合表的时候也好用 —— 可以直接在图上标出哪些字段搬到哪。
Mermaid 的 erDiagram 用的是鸦爪符号,支持字段类型、主键外键标记和关系上的说明文字,画设计文档够用了。它不画索引、不画键之外的约束,也不管物理存储 —— 这些要看 dbdiagram.io 或者 ORM 自带的可视化。但大部分时候你只是想说清楚「数据长什么样」,一张跟 migration 放在一起的纯文本 ER 图正好。
对话模式里 AI 会先问你两三个问题 —— 谁参与、发生什么、异常分支怎么走 —— 弄清楚了再动笔。
教程里讲了常用符号、几种基本结构、九条画法规范,还有可以直接拿去用的 prompt 模板和真实业务例子。