数据流图(DFD)是系统逻辑的蓝图,展示了信息如何在过程中流动。它们在系统分析与设计中至关重要,架起了业务需求与技术实现之间的桥梁。然而,未经验证的图表仅仅是一张草图。为了确保架构的完整性,每个数据流图都必须经过严格的审查。
本指南提供了一个全面的框架,用于验证数据流图。它重点关注结构的一致性、逻辑的正确性以及与业务规则的一致性。通过遵循此检查清单,分析人员可以在开发生命周期的后期避免昂贵的返工。

📋 验证前准备
在检查图表的视觉元素之前,必须明确上下文。验证不能脱离实际环境进行。以下先决条件可确保审查过程有效。
- 定义系统边界: 明确识别系统内部和外部的内容。外部实体(数据源和数据汇)必须明确界定。
- 收集需求: 确保功能性和非功能性需求均已准备就绪。图表必须直接对应这些规范。
- 建立标准: 确定符号标准(例如,Gane & Sarson 与 Yourdon & Coad)。混合使用符号会造成歧义。
- 审查数据字典: 确保存在一个数据元素的主列表。如果缺少数据定义,数据流图就无法有效。
🔄 层次结构与分解
数据流图具有层次性。它们从上下文图开始,分解为0级、1级及更深层级。验证需要检查这些层级之间的关系。
1. 上下文图验证
上下文图(第-1层)将系统表示为一个单一过程。在审查更深层级之前,必须确保其准确性。
- 单一过程节点: 验证是否存在且仅存在一个代表整个系统的进程。
- 外部实体: 确认所有外部数据源和目的地都已存在。缺失的实体意味着缺失的数据流。
- 数据流: 确保系统的所有输入和输出都被捕获。不允许数据的自发产生或销毁。
2. 0级与分解
0级将单一过程分解为主要子过程。这是复杂性开始的地方。
- 过程数量: 将过程数量限制在可管理的范围内(通常为5到9个)。过程过多会使读者困惑。
- 过程名称: 名称应具有动作导向性(动词+名词),例如“计算发票”而非“发票”。
- 数据存储: 确定数据在此层级中被存储的位置。确保没有数据存储直接连接到外部实体,而中间没有处理过程。
⚖️ 平衡规则
DFD创建中最常见的错误之一就是违反平衡规则。该规则规定,父过程的输入和输出必须与子过程的输入和输出完全一致。
- 输入守恒: 如果父过程接收“客户订单”,子过程必须共同接收“客户订单”。子层级中不能出现父层级中不存在的新输入。
- 输出守恒: 如果父过程发送“发票”,子过程必须共同发送“发票”。输出不能意外消失或出现。
- 流验证: 跟踪进入父过程的每一条线。跟踪离开父过程的每一条线。确认它们在子图中存在。
- 存储一致性: 如果在子层级中需要读取或写入数据,则父层级访问的数据存储在子层级中也必须可访问。
未能保持平衡会导致高层视图与详细实现之间脱节。这通常会导致开发人员构建未规划的功能,或忽略关键的数据需求。
🏷️ 命名规范
命名的一致性对于可读性和维护至关重要。模糊的名称会导致对系统行为的误解。
- 处理过程: 始终使用动词加名词的结构。避免使用单个词语。正确: “更新库存。”错误: “库存更新”。
- 数据流: 使用单数名词。正确: “项目。”错误: “项目们”。
- 数据存储: 使用复数名词。正确: “订单。”错误: “订单”。
外部实体: 使用专有名词或业务术语。正确: “客户”。错误: “用户”。
📊 常见错误与验证风险
即使是经验丰富的分析师也会犯错。下表概述了常见的违规行为及其对系统架构的潜在影响。
| 检查类别 | 验证标准 | 忽略后的风险 |
|---|---|---|
| 自发流程 | 每个流程必须至少有一个输入流。 | 数据凭空产生,违反了系统逻辑。 |
| 黑洞 | 每个流程必须至少有一个输出流。 | 数据被消耗却无结果,表明存在逻辑漏洞。 |
| 灰洞 | 输入和输出的数据内容必须一致。 | 数据被转换,但转换过程未明确定义。 |
| 直接实体到存储 | 没有数据流将实体直接连接到数据存储。 | 绕过了业务规则和验证逻辑。 |
| 不平衡的流 | 父级和子级流必须匹配。 | 架构漂移;实现与设计不符。 |
| 控制流 | 数据流图显示数据,而非控制信号。 | 数据流动与系统触发器之间的混淆。 |
📚 与数据字典的一致性
数据流图的质量取决于其背后的数据定义。数据字典是元数据的存储库,定义了每个数据流和数据存储的结构。
- 数据元素一致性: 检查DFD中命名的数据元素是否存在于数据字典中。
- 数据结构: 验证数据流的组成。“客户订单”是否包含“客户ID”和“订单日期”?
- 唯一标识符: 确保在数据存储中标识主键,以支持数据完整性。
- 别名: 如果某个数据元素在文档中存在多个名称,请进行标准化,以避免混淆。
- 数据类型: 验证数据类型(数字、字符串、日期)在图表和数据库模式之间是否一致。
🤝 利益相关方评审与确认
技术准确性还不够。图表必须被提供需求的业务利益相关方所理解。
- 业务术语: 标签中不要使用技术术语。使用业务部门使用的语言。
- 演示与讲解: 组织一次演示会,让利益相关方追踪特定交易中的数据流动过程。
- 差距分析: 询问利益相关方,图表中是否遗漏了任何关键的业务活动。
- 验证确认: 获取正式批准。这表明图表准确反映了双方一致认可的业务逻辑。
🛠️ 维护与版本控制
系统会不断演变,需求也会发生变化。今天有效的DFD明天可能就无效了。维护是验证生命周期的一部分。
- 变更管理: 对流程逻辑的任何更改都必须更新DFD。在未更新图表的情况下,不得修改代码。
- 版本控制: 使用版本号和日期标记图表。保留变更历史,以理解系统的演进过程。
- 关联性: 将DFD与需求文档关联。如果需求发生变化,相应的图形单元必须被标记。
- 定期审计: 安排定期审查DFD与实际系统行为的一致性。随着时间推移,偏差会逐渐出现。
🔍 详细的技术一致性检查
除了通用规则外,还必须遵守特定的技术约束,以确保图表具备实施条件。
1. 数据存储完整性
数据存储代表持久化存储。它们不应是临时的。
- 读/写访问: 验证每个向存储写入数据的流程,若有必要,也应从该存储读取数据。若涉及数据修改,确保没有流程在无读取需求的情况下向存储写入数据。
- 开放/封闭边界: 数据存储不应具有开放边界。每个数据存储必须至少连接一个流程。
- 存储命名: 命名应反映内容,例如“员工文件”而非“文件1”。
2. 流程逻辑完整性
流程代表转换逻辑。
- 转换: 确保流程确实改变了数据。仅简单传递数据的流程属于数据流,而非流程。
- 决策点: 尽管DFD不会像流程图那样明确展示决策逻辑,但必要时流标签应暗示条件(例如“有效订单”与“无效订单”)。
- 外部依赖: 如果一个流程依赖外部系统,应将其表示为外部实体或子流程,而非“魔法盒子”。
3. 流向方向性
箭头表示数据的移动方向。
- 单向性: 箭头必须从源指向目标。除非数据流在同一步骤中真正双向流动,否则不得使用双头箭头。
- 标签清晰性: 每个箭头都必须有标签。未标注的流是模糊的。
- 无交叉: 尽量减少线条交叉。如果线条交叉,应使用交叉符号或重新调整布局以提高可读性。
🧠 认知负荷降低
一个有效的数据流图不仅在技术上要正确;它还必须在认知上易于理解。如果图表过于复杂,它就失去了其主要目的:沟通。
- 模块化:将复杂的过程分解为子过程。如果一个过程有超过7个输入或输出,则应对其进行分解。
- 视觉层次:为过程使用一致的形状,数据存储使用菱形(取决于记法),实体使用矩形。一致性可以降低认知负担。
- 留白:在元素之间留出空间。杂乱的图表会掩盖错误。
- 颜色编码:如果工具允许,可使用颜色区分不同类型的流(例如输入与输出),但要确保黑白打印后仍可读。
📝 最终考虑事项
验证是一个迭代过程。它很少能在第一次就成功。目标是构建一个稳健、清晰且与现实一致的模型。
- 迭代优化:预期需要多次修改图表。每次修订都应提高清晰度。
- 文档整洁性:保持图表与文档同步。如果文字说明与图表内容不一致,系统将失败。
- 培训:确保团队理解记法。如果评审人员不理解符号,检查清单就毫无用处。
- 工具使用:使用能强制执行语法规则的建模工具。尽管检查清单是手动的,但工具可以自动化一些基本检查,如平衡性检查。
通过遵循这份全面的检查清单,可以确保数据流图成为系统可靠的基石。它们将变成一份动态文档,指导开发并验证业务逻辑。这种严谨性可以降低风险,改善沟通,并确保最终产品满足预期需求。
请记住,图表是一种思考工具,而不仅仅是一个交付成果。验证图表的过程迫使分析人员面对可能在测试开始前一直隐藏的逻辑漏洞。请花时间进行彻底的验证。











