需求沟通、设计指导、文档资产三个层面来理解,下面结合实例说明。
一、核心作用:把业务需求"可视化"为数据结构
E-R图用图形化的方式,把现实世界中的业务对象及其联系抽象出来,让非技术人员也能看懂。
没有 E-R 图时,需求可能是这样一段文字:
"一个用户可以下多个订单,一个订单可以包含多种商品,每种商品有名称、单价和库存。订单需要记录下单时间、总金额和收货地址。用户有 VIP 等级,不同等级享受不同折扣。"
有 E-R 图后,同样的信息变成:

好处:用户一眼就能确认"是不是这样",开发者也能直接看出表结构和关联关系。二、具体作用详解
1. 需求确认:让用户"看到"自己的需求
用户往往不擅长读文字规格说明书,但能看懂图形。
发现遗漏:画图时容易发现"咦,退款记录放哪里?"
发现矛盾:比如用户说"一个订单只能有一种商品",但图上画的是 N:M,立即就能对质。
确认边界:明确哪些实体在系统内,哪些是外部系统。
实例:某医院系统,用户 initially 说"病人和医生是多对多关系"。画 E-R 图时发现,还需要记录"就诊时间""诊断结果",于是引入"就诊记录"这个关联实体,把 M:N 拆成两个 1:N。用户一看就明白:"对,每次就诊是独立的。"
2. 指导数据库设计:从 E-R 图到表结构
E-R 图是概念设计,转换成逻辑模型(关系模式)再转到物理模型(建表 SQL),有明确的规则:
| E-R 元素 | 转换规则 | 示例 |
|---|---|---|
| 实体 | 一张表 | User 表 |
| 属性 | 字段 | user_id, name, email |
| 1:N 关系 | 在 N 方加外键 | Order 表加 user_id |
| M:N 关系 | 新建关联表 | OrderItem 表存 order_id + product_id |
| 关联实体 | 独立表 + 外键 | Visit 表存 patient_id + doctor_id |
这样,E-R 图直接成为数据库设计的蓝图,减少拍脑袋建表带来的返工。
3. 统一团队认知:业务、开发、DBA 的共同语言
业务方:确认实体和关系是否符合实际业务
开发方:理解数据模型,设计 API 和类结构
DBA:据此设计索引、分区、约束
测试方:根据实体关系设计测试用例(如级联删除、唯一性约束)
实例:电商系统中,"购物车"和"订单"的关系。业务方认为购物车是临时的,订单是永久的;开发方可能想复用同一张表。E-R 图明确画出两个独立实体后,团队就能提前达成共识,避免后期架构冲突。
4. 发现业务规则与约束
E-R 图不仅画实体和关系,还能标注基数约束和参与约束:
基数:1:1、1:N、M:N
参与:强制参与(双线)还是可选参与(单线)
例如:
[订单] ——必须属于—— [用户]
[用户] ——可选拥有—— [订单]
这直接对应业务规则:"订单必须有用户,但用户可以不买东西。"
5. 文档与维护资产
新人培训:一张 E-R 图胜过十页文字
影响分析:要改某个实体时,顺着关系线就能找到所有受影响的部分
系统集成:多个系统对接时,E-R 图是数据映射的基础
三、E-R 图在开发流程中的位置
需求收集 → E-R 图(概念模型) → 关系模式(逻辑模型) → 建表 SQL(物理模型) → 编码
↑ ↑ ↑
用户能看懂 设计者能看懂 DBA 能执行
E-R 图是从业务语言到技术语言的第一道转换,也是最关键的一道。它错了,后面全错;它对了,后面只是实现问题。
四、E-R 图的局限性
| 局限 | 说明 | 补充手段 |
|---|---|---|
| 只描述静态数据 | 不表达流程、时序、状态变化 | 配合 DFD、状态图、序列图 |
| 不涉及非功能需求 | 性能、安全、并发不在图上 | 单独写非功能规格 |
| 复杂业务规则难表达 | 如"VIP 折扣按累计消费动态计算" | 配合决策表、业务规则引擎 |
| 大系统图会过于庞大 | 几百个实体一张图无法阅读 | 分模块画子图,再画总览图 |
五、一个完整小例子
场景:图书馆管理系统
E-R 图:

转换后的表:
Reader(reader_id, name, phone)Book(book_id, title, author, isbn)Borrow(borrow_id, reader_id, book_id, borrow_date, due_date, renew_flag)
作用体现:
用户确认:"对,一个人可以借多本书,一本书可以被多人借过。"
开发知道:需要三张表,
Borrow是关联表。DBA 知道:
reader_id和book_id要建外键和索引。测试知道:要测"同一本书不能同时被两个人借"这个约束。
