Insights·2026-09-28

ERD 是什么 — 氛围编程者几个月后重新读懂自己服务的地图

ERD 是把一个服务所管理的对象、以及这些对象彼此如何相连画在一张图上的图。对氛围编程者来说,它是与策划文档、界面文档并排放着的记录,几个月后想加功能时,能迅速找回「我当初做了什么、怎么做的」。读懂它需要四个词,再加上每一列要定的数据类型。被管理的对象叫实体,进入数据库后成为表;一条数据是一行;标题、日期这类属性是一列。数据类型决定每一列装什么形态的值。

ERD는 네 낱말로 읽힌다 엔티티·행·열·데이터 타입 — 글의 요약 도식

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 之一

一行 = 一张请柬

每一格都要定数据类型

为请柬表每一列确定的数据类型:id 为 UUID,地点与新郎新娘姓名为 varchar,留言为 text,模板为 enum

定好列之后,再定每一格放什么形态的值。这就是数据类型。它事先钉住规则,让数字格里不会混进文字,日期格里不会随便塞一句话。讲座讲到的类型见下表。

大多数看名字就能猜到。容易混淆的有两个。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
交给 AI 的请求
找出这个项目里所有的数据库表,
按表整理出 列名 · 数据类型 · 一句话说明,做成表格。
enum 列请一并写出允许的值。
不要修改代码,只读。