ERD 是写给几个月后的自己的中间文档
讲座从氛围编程者的开发方式说起。现阶段与其直接读代码,不如借助代码之外的中间文档,让自己尽可能保持主导系统的状态继续开发。中间文档可以理解为:把代码在做什么,用人的文字和图画重新写下来的文档。
讲座列出的中间文档有三种。第一是 PRD,用文字写明要做什么、为什么做的策划文档。第二是界面文档:画出用户按什么顺序经过哪些界面的用户流程图、只用线条画出界面骨架的线框图、画得接近真实样子的样机图,三者合为一类。第三就是 ERD。
前两种是文字和图画,不用专门学也能看懂。ERD 不一样。没有概念的话,看到的只是方框和线条,会忍不住想「这到底要拿来干什么」。这就是讲座专门为 ERD 花一堂课的原因。
第二个理由更实用。一开始通常只放真正需要的功能,用最简单的方式做出第一版。隔了很久想再加功能而重新打开时,当时的来龙去脉已经记不起来了。讲座说,在那个时刻帮你迅速找回「我当初是怎么做的」的,就是 ERD。
实体、表、行、列 — 四个词就能读懂
ERD 是 Entity Relationship Diagram 的首字母缩写,意思是画出实体之间如何建立关系的图。关系从下一篇开始讲,这一篇只走到读懂图里的一个方框为止。
实体是服务需要关注并管理的对象。以手机请柬服务为例,管理员和请柬就是实体。实体进入数据库后就成为表。数据库是服务存放数据的地方,打开来看像一张电子表格,其中一张表就是一个表。
表下面一行一行堆起来的每一条数据叫行。一张请柬就是一行。表所拥有的每一个属性,比如编号、姓名,叫列,也就是把表格竖向分开的一个个格位。
同样的东西在代码里有时换个名字。按讲座的归纳,实体叫对象,一行叫实例。在 AI 写的代码或说明里看到这两个词时,分别想成一张表和其中的一行就可以了。
| 在数据库里 | 含义 | 在代码里的叫法 | 请柬的例子 |
|---|---|---|---|
| 表 | 装一个实体(管理对象)的表格 | 对象 | 请柬表 |
| 行 | 一条数据 | 实例 | 一张请柬 |
| 列 | 一个属性 | — | 标题、日期、地点 |
用手机请柬区分实体和列

讲座以手机请柬服务为例。需求很简单:管理员登录;管理员制作手机请柬;请柬里有标题、日期、地点、留言;模板事先定好三种左右,从中挑一种使用。
这里的实体是什么?讲座的答案是两个。首先是管理员。这不是谁都能进来的服务,而是登录的管理员来制作请柬,所以管理员这个对象要单独管理。其次是管理员制作的请柬。请柬表里放一个 admin_id 格子,记下是谁创建的;这种把两张表连起来的格子,从下一篇开始细讲。
标题、日期、地点、留言不是实体。它们是请柬所具有的性质,所以作为列放进请柬表。新郎姓名、新娘姓名也一样。区分的问题只有一个:这是要单独存放、单独管理的对象,还是附属于某样东西的属性?
你也可以对自己的服务照做一遍。把服务涉及的名词全部写下来,逐个问这个问题。是前者就是表,是后者就是那张表的列。如果还剩下拿不准归哪边的名词,那正是需要考虑对象之间关系的地方。
invitations (请柬)
────────────────────────────────────────
id 每张请柬的编号
admin_id 创建它的管理员
title 标题
date 婚礼日期
place 地点
message 留言
groom_name 新郎姓名
bride_name 新娘姓名
template 模板 1·2·3 之一
一行 = 一张请柬每一格都要定数据类型

定好列之后,再定每一格放什么形态的值。这就是数据类型。它事先钉住规则,让数字格里不会混进文字,日期格里不会随便塞一句话。讲座讲到的类型见下表。
大多数看名字就能猜到。容易混淆的有两个。decimal 是数字,看起来和 integer 很像,但讲座归纳说它主要用于付款余额这类与钱有关的值。vector 是用于 RAG 的类型。RAG 是让 AI 在回答前先查找并阅读相关文档的方式;把文档的意思转换成一串数字,就能找到内容相近的文档,装这串数字的格位就是 vector。
enum 是只接受事先定好的值的类型。比如登录方式只接受 Kakao、Google、Apple 之一,或模板只接受 1、2、3 之一。目录之外的值进来时,就让它报错。
放到请柬上看是这样的:讲座把编号定为 UUID,把地点、新郎姓名、新娘姓名定为 varchar,把模板定为 enum。其余的按同样的标准挑选即可。标题是短文字,用 varchar;留言可能很长,用 text;婚礼日期用 date 一类。
如果你手上正在做一个服务,把下面的请求原样交给 AI 就行。把表、列、类型整理成一张表拿到手,就是几个月后再打开来看的记录的起点。下一篇给请柬加上祝福留言功能,看哪些值该留作列,哪些值该拆成表。
| 类型 | 装什么 | 例子 |
|---|---|---|
| integer / bigint | 整数(没有小数点的数);bigint 能装更大的数 | 数量、序号 |
| UUID | 为了不重复而生成的不规则字母数字组合 | 编号 |
| varchar | 短文字 | 姓名、地点、图片地址 |
| text | 长文字 | 说明、留言 |
| boolean | 真或假 | 用是或否回答的值 |
| date / timestamp | 日期;日期加时间 | 婚礼日期 |
| decimal | 精确到小数点的数字 | 付款余额之类的钱 |
| vector | 用于 RAG 的一串数字 | 文档检索用的值 |
| enum | 事先定好的值之一 | 登录方式(Kakao、Google、Apple)、模板 1·2·3 |
找出这个项目里所有的数据库表,
按表整理出 列名 · 数据类型 · 一句话说明,做成表格。
enum 列请一并写出允许的值。
不要修改代码,只读。