数据流图(DFD)完全指南:从入门到画好一张专业的数据流分析图

数据流图有很多种,主要有数据流图,数据流程图,数据流图在线绘制,数据流图在线设计。数据流图(Data Flow Diagram,简称 DFD)是一种描述数据在系统中如何流动、加工、存储的可视化工具。它不关心时间顺序,不关心判断分支,只回答一个问题:数据从哪来、到哪去、中间被谁处理了。

数据流图(DFD)完全指南

适用于:需要梳理系统数据流向、分析数据加工链路的系统分析师、开发人员、产品经理

结论先行

数据流图(Data Flow Diagram,简称 DFD)是一种描述数据在系统中如何流动、加工、存储的可视化工具。它不关心时间顺序,不关心判断分支,只回答一个问题:数据从哪来、到哪去、中间被谁处理了

如果你画了很多流程图还是说不清楚"数据在系统里怎么跑的",你需要的不是更细的流程图,而是一张 DFD。


一、什么是数据流图

数据流图诞生于 1970 年代末的结构化分析运动,由 Edward Yourdon 和 Tom DeMarco 提出,后在企业领域被 Chris Gane 和 Trish Sarson 发展出另一套符号体系。至今仍是系统分析、需求工程、数据架构设计中的经典工具。

DFD 的核心价值:

价值 说明
需求清晰 逼你在写代码前就搞清楚每个数据从哪来、到哪去、被谁加工
跨角色沟通 非技术人员也能看懂——方框是客户,箭头是数据,不需要懂编程
边界明确 一张上下文图就能说清"系统管什么、不管什么"
逐层分解 从全局到细节,一层层拆,不会一上来就陷入细节泥潭
活文档 系统变更后更新 DFD,比翻代码快十倍

二、四大核心要素

任何 DFD,无论多简单或多复杂,只用四种符号。

1. 外部实体(External Entity)

数据的来源或去向,存在于系统边界之外。

  • 可以是人:客户、管理员、供应商
  • 可以是系统:支付网关、邮件服务器、第三方 API
  • 又叫"源点/汇点"(Source/Sink)或"终止符"(Terminator)
  • 命名用名词,如"客户""银行"

2. 加工/过程(Process)

将输入数据转换为输出数据的处理环节。

  • 每个加工必须有至少一个输入流和一个输出流
  • 命名用"动词+名词"格式,如"验证订单""计算税费""生成报表"
  • 不要用模糊名称如"系统处理"或"数据处理"
  • 加工编号:1.0、2.0、3.0(Level 1),1.1、1.2(Level 2),方便跨层级引用

3. 数据存储(Data Store)

数据的停留地点,被动保存,不做加工。

  • 可以是数据库表、文件、缓存、消息队列
  • 编号用 D1、D2、D3,如"D1: 订单库""D2: 用户表"
  • 注意:两个数据存储之间不能直接连线,必须经过加工

4. 数据流(Data Flow)

数据在实体、加工、存储之间的流动通道。

  • 用带标签的箭头表示
  • 标签必须用名词短语,如"订单详情""支付确认"
  • 不能用动词,如"发送订单"是错的——数据流本身是数据,不是动作
  • 单向流动:双向数据交换要画两条独立箭头

两种符号体系对比

要素 Yourdon-DeMarco Gane-Sarson
加工 圆形(气泡图) 圆角矩形(上下分隔,上写编号下写名称)
数据存储 两条平行线 左端开口的矩形
外部实体 矩形 方形(带阴影边框)
数据流 带标签箭头 带标签箭头
常见场景 学术界、软件工程教材 企业信息系统、商业分析

两种符号表达的信息完全相同,选哪种取决于组织规范。一个项目内必须保持一致,混用会造成阅读混乱。


三、分层结构:DFD 最核心的设计

DFD 最强大的特性是分层分解。你不必在一张图上塞下所有细节,而是从高到低逐层展开。

Level 0:上下文图(Context Diagram)

最高抽象层,将整个系统视为一个加工。

  • 恰好一个加工(代表整个系统)
  • 显示所有外部实体
  • 显示进出系统的主要数据流
  • 不包含任何数据存储
  • 用途:项目启动时对齐范围,让所有干系人达成共识

示例(在线购物系统上下文图):

          订单详情              订单确认
客户 ──────────→ [购物系统] ──────────→ 客户
                   │    ↑
        支付信息   ↓    │ 支付状态
              [支付网关]

        发货请求   ↓    ↑ 库存状态
              [仓库]

Level 1:主要过程分解

将 Level 0 的单一加工拆解为 3-7 个子加工。

  • 引入数据存储
  • Level 0 的外部实体必须全部出现
  • Level 0 的进出数据流必须全部对应——这叫平衡规则(Balancing)
  • 用途:需求评审、设计交接

示例(在线购物系统 Level 1):

客户 ──订单详情──→ 1.0 管理订单 ──验证订单──→ 2.0 处理支付
                        ↓ 写入                    ↓ 读取
                   ═══════════              ═══════════
                   D1: 订单库               D2: 库存库
                   ═══════════              ═══════════

                   2.0 处理支付 ──支付状态──→ 3.0 发货通知 ──订单确认──→ 客户
                                                    ↓ 读取
                                               D1: 订单库

Level 2:详细分解

对 Level 1 中的复杂加工进一步拆解。

  • 只对需要进一步细化的加工做分解
  • 子加工编号为父加工编号加分号:1.1、1.2、1.3
  • 必须与父加工保持平衡(进出数据流一致)
  • 用途:实现规格、复杂流程细节

示例(对"2.0 处理支付"做 Level 2 分解):

支付信息 ──→ 2.1 验证卡片 ──验证结果──→ 2.2 提交扣款 ──扣款结果──→ 2.3 记录交易
                              ↓ 写入
                         ═══════════
                         D3: 交易记录
                         ═══════════

Level 3:原始图

极少使用,仅当系统极其复杂时才画。大多数项目到 Level 2 就足够了。

判断何时停止分解:如果一个加工能用一段自然语言描述清楚,就不需要再拆。


四、DFD vs 流程图:到底有什么不同

这是最常见的混淆。两者看起来都是方框+箭头,但关注点完全不同。

维度 数据流图(DFD) 流程图(Flowchart)
关注点 数据的流动和转换 步骤的顺序和控制逻辑
时间顺序 不建模 核心结构
判断分支 不表示 明确表示(菱形决策节点)
循环 没有
数据存储 有专属符号 不表示
谁执行 不体现 可用泳道体现
适用场景 系统分析、数据架构设计 流程文档、操作指南

一句话总结:流程图告诉你"先做什么后做什么",DFD 告诉你"数据从哪来到哪去"

举个例子——同样是"贷款审批":

  • 流程图画的是:申请→审查→(是否通过?)→放款/拒绝
  • DFD 画的是:客户→申请数据→审核加工→审核结果→审批记录库→放款加工→放款通知→客户

五、六步绘制法

第 1 步:定义系统边界

用一句话写清楚系统做什么。

例:"在线考试系统允许学生参加考试,教师创建试卷,系统自动评分并生成成绩报告。"

这句话直接告诉你:参与者是学生和教师,输入是试卷和答卷,输出是成绩报告。

第 2 步:列出所有外部实体

问三个问题:

  • 谁向系统提供输入数据?
  • 谁从系统接收输出数据?
  • 有没有外部系统与本系统交换数据?

例:学生(提交答卷、接收成绩)、教师(创建试卷、查看统计)、教务系统(接收成绩同步)

第 3 步:画上下文图(Level 0)

  • 画一个加工(圆形或圆角矩形),标注系统名
  • 把外部实体放在周围
  • 用带标签箭头连接,标注数据流名称
  • 检查:有没有未标注的箭头?有没有遗漏的实体?

第 4 步:分解为 Level 1

  • 将单一加工拆为 3-7 个子加工
  • 用动词+名词命名:验证订单、处理支付、发送通知
  • 编号:1.0、2.0、3.0
  • 加入数据存储,编号 D1、D2
  • 连接数据流,每条箭头必须有标签

第 5 步:验证平衡规则

这是最关键的技术规则。

  • Level 0 进入系统的数据流,必须在 Level 1 中某个子加工有对应输入
  • Level 0 离开系统的数据流,必须在 Level 1 中某个子加工有对应输出
  • 如果 Level 0 有"订单详情"进入系统,Level 1 必须有某个子加工接收"订单详情"

第 6 步:按需分解 Level 2

  • 只对 Level 1 中足够复杂的加工做进一步分解
  • 子加工编号 1.1、1.2、1.3
  • 每个 Level 2 图的进出数据流必须与父加工一致
  • 当一个加工能用一段话讲清楚时,停止分解

六、五个常见错误

错误 1:把 DFD 当流程图

在 DFD 里画菱形判断框、循环箭头 → 立刻暴露为新手。DFD 不建模控制逻辑。

正确做法:判断和循环留给流程图,DFD 只画数据流动。

错误 2:数据流不标注

无名箭头在 DFD 中是违规的。每条数据流必须用名词标注。

正确做法:每画一条箭头,立刻写上数据名称。

错误 3:实体直连存储

外部实体直接连到数据存储 → 违反规则。数据必须经过加工才能存储。

正确做法:实体 → 加工 → 存储,中间不能跳过。

错误 4:存储直连存储

两个数据存储之间直接画箭头 → 违反规则。数据必须经过加工才能从 A 库到 B 库。

正确做法:存储A → 加工 → 存储B。

错误 5:跨层级不平衡

Level 0 有"支付信息"进入系统,Level 1 却找不到任何子加工接收"支付信息" → 违反平衡规则。

正确做法:每拆解一层,回头检查进出数据流是否与上层一致。


七、进阶:DFD 在实际工程中的配合使用

DFD 很少单独存在,通常与其他图表配合使用:

配合图表 组合价值
上下文图 + ER 图 上下文图定义边界,ER 图定义存储结构
Level 1 DFD + 时序图 DFD 展示数据流向,时序图展示调用顺序
DFD + 流程图 DFD 理清数据通路,流程图理清操作步骤
DFD + 架构图 DFD 描述逻辑数据流,架构图描述物理部署
DFD + 鱼骨图 DFD 定位数据异常节点,鱼骨图分析根因

一个实用的文档组合:上下文图(边界)→ Level 1 DFD(数据流)→ ER 图(存储结构)→ 时序图(调用链路),这四张图能覆盖 80% 的系统设计文档需求。


八、工具选择

工具 优势 适合场景
singcheng.com 在线一站式,流程图/架构图/思维导图全覆盖,支持协作 日常画图首选
Draw.io(diagrams.net) 免费开源,符号库丰富 个人画图
Visual Paradigm 专业建模,支持 DFD/UML/BPMN 全系列 企业级建模
Lucidchart 协作友好,模板多 团队协作
StarUML 桌面端,支持扩展插件 独立开发者

如果只是日常画 DFD,用 singcheng.com 的流程图模块就能搞定——DFD 的四种符号在流程图工具里都能找到对应。如果需要严格遵循 Yourdon 或 Gane-Sarson 符号标准,Visual Paradigm 的模板更完整。


九、自检清单

画完 DFD 后,逐项核对:

符号规范

  • 四种符号是否都用到了?
  • 是否选定了唯一符号体系(Yourdon 或 Gane-Sarson)且全程一致?
  • 加工命名是否都是"动词+名词"?
  • 数据流命名是否都是名词短语?
  • 数据存储是否都编号了(D1、D2)?

规则检查

  • 每个加工是否至少有一个输入流和一个输出流?
  • 是否有未标注的数据流箭头?
  • 是否有外部实体直接连到数据存储?
  • 是否有两个数据存储直接相连?
  • 各层级之间是否满足平衡规则?

层级检查

  • 上下文图是否恰好一个加工?
  • 上下文图是否没有数据存储?
  • Level 1 是否拆解为 3-7 个子加工?
  • Level 1 的外部实体是否与上下文图一致?
  • 是否所有需要细化的加工都做了 Level 2 分解?
  • 是否在加工能用一段话讲清楚时停止了分解?

实用检查

  • 非技术人员能否看懂上下文图?
  • 数据流标签是否足够具体("订单详情"而非"数据")?
  • 是否有箭头交叉过多("意大利面"问题)需要重新布局?
  • 是否与其他图表(ER 图、时序图)配合使用?

总结

数据流图的核心思路就一句话:别管先做啥后做啥,先把数据从哪来到哪去画清楚

四步上手:

  1. 画上下文图锁定边界
  2. 拆 Level 1 理清主加工
  3. 验证平衡规则
  4. 按需深入 Level 2

更多图表绘制教程和实战案例,尽在 singcheng.com ——流程图、架构图、思维导图原型图白板,一站式在线画图平台。


发布平台:星程图示· Singcheng