理解信息在系统中如何流动,对于构建稳健的软件和高效的业务流程至关重要。数据流图(DFD)提供了这种流动的可视化表示。它们描绘了数据从外部来源到内部处理过程的流动,展示了数据的存储位置以及其转换方式。然而,绘制单一图表很少能捕捉到现代系统的复杂性。这正是0级、1级和2级数据流图层级结构变得至关重要的原因。
在正确的时间选择合适的细节层次,可以防止在需求收集和系统设计过程中产生混淆。本指南探讨了每一级的具体应用、组成部分和规则。我们将研究何时停止对过程进行分解,以及如何在文档中保持一致性。

🔍 什么是数据流图?
数据流图是信息系统中数据流动的图形化表示。与侧重于控制流和逻辑决策的流程图不同,数据流图专注于数据的流动。它们帮助利益相关者直观地理解输入如何转化为输出。
- 处理过程: 对数据进行转换的操作。
- 数据存储: 数据暂时存放以供后续使用的位置。
- 外部实体: 系统边界之外的来源或目标。
- 数据流: 这些组件之间数据的移动。
通过将系统分解为特定层级,分析人员可以管理复杂性。在第一张图上无需展示每一个交易的详细信息。相反,你可以从宏观入手,根据需要逐步细化。
🌍 0级:上下文图 🌍
0级数据流图通常被称为上下文图。它将整个系统表示为一个单一的过程。这种高层次视图确立了系统与其环境之间的边界。
🎯 何时使用0级
- 需求收集: 早期使用,以与利益相关者确认范围。
- 项目启动: 为新团队成员提供快速概览。
- 系统边界定义: 明确界定系统内部和外部的内容。
⚙️ 关键组件
- 一个处理节点: 整个系统由一个单一的圆圈或圆角矩形表示。通常用系统名称进行标注(例如,“订单处理系统”)。
- 外部实体: 这些是与你的系统交互的人、组织或其他系统。例如,“客户”、“支付网关”或“仓库管理系统”。
- 注意:如果内部部门属于同一系统范围,则不应将其作为外部实体包含在内。
- 数据流: 箭头显示实体与中心过程之间的输入和输出。
📝 示例场景
考虑一个图书馆管理系统。0级图将展示中心的“图书馆系统”过程。外部实体包括“图书管理员”、“会员”和“图书供应商”。数据流包括来自供应商的“新书请求”以及来自会员的“图书借阅”。
这一层级回答的问题是:“这个系统是什么,谁在与它交互?”
🔄 第1级:高层流程图 🔄
第1级DFD将0级中的单一过程扩展为它的主要子过程。它揭示了系统的内部运作,而不会陷入琐碎的细节。这通常是高层架构讨论中最重要的图表。
🎯 何时使用第1级
- 系统设计阶段: 开发人员需要了解主要模块。
- 功能规划: 产品经理使用它来识别不同的功能区域。
- 接口定义: 帮助识别数据进入和离开系统的位置,以定义API。
⚙️ 关键组件
- 主要过程: 将单一的0级过程分解为5到9个不同的过程。如果数量更多,考虑进一步分组。
- 数据存储: 第1级通常是引入数据存储(数据库、文件、表格)的地方。这显示了信息持久化的位置。
- 一致性: 0级中进入或离开系统的每个数据流都必须在第1级中出现。这被称为平衡.
📝 示例场景
继续以图书馆系统为例,第1级图将“图书馆系统”分解为“注册会员”、“借书”、“处理罚款”和“管理库存”。数据存储可能包括“会员数据库”和“图书目录”。0级中的“借书”流程在第1级中分解为与“会员数据库”和“图书目录”交互的流程。
这一层级回答的问题是:“主要功能是什么,数据存储在哪里?”
🔬 第2级:详细过程视图 🔬
第2级DFD深入探讨第1级中识别出的特定过程。单个第1级过程可能过于复杂,难以完全理解,因此需要进一步分解。并非每个过程都需要第2级图;只有那些需要详细说明的过程才需要。
🎯 何时使用第2级
- 详细规范: 在为开发人员编写技术需求时使用。
- 复杂逻辑: 涉及多个决策点或计算的流程。
- 遗留系统现代化: 将现有复杂工作流程映射到新系统。
⚙️ 关键组件
- 子流程: Level 1 流程的分解。例如,“借书”会分解为“验证会员资格”、“更新库存”和“生成收据”。
- 限制子流程的数量,以避免杂乱。
- 输入/输出详情: 明确展示这些子流程之间传递的数据元素。
- 控制逻辑: 尽管数据流图(DFD)不展示像代码一样的逻辑,但 Level 2 通常会暗示决策点(例如,“如果会员有效,则继续”)。
📝 示例场景
在图书馆示例中,Level 1 的“处理罚款”流程被进一步分解。它可能包括“计算逾期天数”、“应用费率”和“更新账户余额”。此层级确保罚款计算逻辑清晰,并与业务规则保持一致。
此层级回答的问题是:“这个特定功能究竟是如何工作的?”
📊 数据流图层级对比
| 特性 | Level 0(上下文) | Level 1(高层级) | Level 2(详细级) |
|---|---|---|---|
| 范围 | 整个系统 | 主要子系统 | 特定流程 |
| 流程数量 | 1 | 5 到 9 个 | 变量(深入探讨) |
| 数据存储 | 无 | 主要存储 | 详细存储 |
| 受众 | 利益相关者、高管 | 架构师、管理者 | 开发者、分析师 |
| 时间 | 需求阶段 | 设计阶段 | 实施阶段 |
| 重点 | 边界 | 功能 | 逻辑与数据 |
🛠️ DFD建模的最佳实践
创建准确的图表需要纪律。遵循特定规则可确保您的文档在整个项目生命周期中保持有用。
1. 保持平衡
当你将一个过程从0级分解到1级时,输入和输出必须一致。如果0级显示“用户登录请求”进入系统,1级必须显示相同的数据进入“认证过程”。如果数据凭空消失或出现,该图表就是无效的。
2. 命名规范
- 过程: 使用动词-名词结构(例如,“验证订单”,而不是“订单验证”)。这强调了动作。
- 数据流: 使用名词短语(例如,“客户数据”、“发票”)。
- 实体: 使用单数名词(例如,“客户”,而不是“客户们”)。
3. 避免数据混乱
不要过度绘制相互交叉的数据流。如果图表变成一张线的网,很可能过于复杂。考虑将1级过程拆分为多个独立的图表。
4. 无交叉通信
外部实体之间不应直接通信。所有通信必须通过系统进程进行。如果“仓库”向“计费系统”发送数据,必须经过“订单处理”进程。
5. 限制数据存储
过多的数据存储会让读者感到困惑。只包含当前详细程度所必需的数据存储。如果某个存储仅在第2层使用,可能在第1层无需出现。
🚫 应避免的常见陷阱
即使是经验丰富的分析师也会犯错。及早识别这些错误可以节省评审时间。
- 黑洞: 一个没有输出的进程。这意味着数据正在消失,这在正常运行的系统中在逻辑上是不可能的。
- 奇迹: 一个没有输入的进程。数据不可能凭空产生。
- 灰洞: 一个有输入但输出与输入预期不符的进程。这通常表明存在缺失的逻辑。
- 过早地加入过多细节: 在第1层未获批准前绘制第2层图会导致返工。应坚持层级结构。
- 忽略数据存储: 忽略数据保存位置会使系统显得短暂且不可靠。
📋 实施策略
在新项目中,应如何着手创建这些图表?请遵循此结构化工作流程。
阶段1:范围定义
从第0层图开始。确定系统名称和所有外部实体。目前无需担心内部流程。获得项目发起人对边界范围的确认。
阶段2:功能分解
创建第1层图。识别主要流程。确保所有数据存储均已定义。确认第0层的数据流在此处存在。这是系统架构成型的地方。
阶段3:详细逻辑
从第1层中选择需要澄清的复杂流程。为这些特定区域创建第2层图。可用于开发人员交接和单元测试规范。
阶段4:维护
DFD不是静态的。当系统发生变化时,应及时更新图表。一份过时的DFD比没有DFD更糟糕。建立规则:每次发布周期都必须更新图表。
🤝 与其他技术的集成
DFD并非孤立存在。与其他建模方法结合使用时效果最佳。
- 实体-关系图(ERD): DFD展示数据流动;ERD展示结构。使用ERD来定义DFD中显示的数据存储。
- 用例图:用例图关注用户交互。数据流图关注数据。它们在需求文档中相辅相成。
- 顺序图:顺序图展示时间顺序。数据流图展示结构。使用顺序图来明确二级流程中数据流的时间关系。
📝 使用总结
选择正确的数据流图层级取决于受众和文档的目标。
- 使用0级用于定义边界和范围。
- 使用1级用于定义架构和主要功能。
- 使用2级用于定义逻辑和实现细节。
通过严格遵守分解和平衡的规则,您将为系统开发创建清晰的路线图。这种清晰性减少了业务利益相关者与技术团队之间的误解。请记住,目标不仅仅是绘制图表,而是确保对数据如何服务于业务达成共同理解。
投入时间确保层级结构正确。一套结构良好的数据流图将在任何软件项目的开发和维护阶段带来回报。











