1. 数据流图(DFD)简介
一个数据流图(DFD)是一种以图形方式表示数据如何在系统中的流动——展示数据的来源、转换方式、存储位置以及最终去向。与流程图(侧重于控制流和顺序)不同,数据流图强调数据的移动与转换而无需考虑执行时机或顺序。

为何使用数据流图?
- 分析 分析现有系统或 设计 一个新系统
- 尽早识别数据输入、输出和存储
- 向利益相关者传达系统边界和数据需求
- 从鸟瞰视角将复杂性分解至实现细节
2. 数据流图的四个核心组件
任何层级的数据流图均由以下 四个 基本元素构成(Gane-Sarson 符号):
| 组件 | 符号 | 角色 | 示例 |
|---|---|---|---|
| 外部实体 | 矩形 | 数据的来源或目的地外部系统边界之外 | 客户、支付网关 |
| 处理过程 | 圆形 | 将输入数据转换为输出数据 | “下订单”、“授权支付” |
| 数据存储 | 记录 / 开放矩形 | 用于后续使用的数据存储位置 | 订单、产品库存 |
| 数据流 | 箭头(带标签) | 上述内容之间的数据流动 | “订单详情”、“支付状态” |
💡 关键规则:一个过程必须同时具有输入流和输出流。仅具有输入或仅具有输出的过程属于建模错误——每个转换都会产生结果。
3. 数据流图层级——自顶向下金字塔
自顶向下分解的精髓在于你从抽象开始 并添加 细节 迭代进行。每个级别都遵循标准的编号约定:
| 级别 | 名称 | 内容 |
|---|---|---|
| 0 级 | 上下文图 | 单个过程(整个系统)、所有外部实体及其数据流——无数据存储,无内部细节 |
| 1 级 | 系统数据流图 | 系统分解为主要过程(1.0、2.0、3.0…)、内部数据存储和数据流 |
| 2 级 | 子图 | 单个 1 级过程分解为更细粒度的过程(2.1、2.2、2.3…) |
| 第 3 层 | 子子图 | 单个第 2 层过程进一步分解(2.2.1、2.2.2、2.2.3…) |
编号精确地告诉你在层次结构中的位置——2.2.4 属于 2.2,该属于 2.0。这种树形结构使大型系统易于导航。
4. 公司风格(颜色图例)
本指南中的每张图表均遵循统一的视觉规范。在 Graphviz 中,方法是:先设置样式,再声明元素,最后进行连接。
| 元素 | 形状 | 填充 | 边框 | 目的 |
|---|---|---|---|---|
| 外部实体 | 框 |
#E1F5FE |
#0288D1 |
谁在外部 |
| 过程 | 圆形 |
#E8F5E9 |
#388E3C |
什么转换数据 |
| 数据存储 | 记录 |
#FFF9C4 |
#FBC02D |
数据所在之处 |
| 父进程(引用) | 圆形 |
#FCE4EC |
#C2185B |
当前层级之外的上下文 |
| 系统边界 | 虚线,圆角集群 |
#FAFAFA / #757575 |
灰色 | 当前图表的边界 |
| 数据流 | 箭头 |
— | #555555 |
数据移动 |
⚠️ 重要提示——样式模板不是图表
一个仅定义节点/边样式但从不声明任何节点或边的 Graphviz 文件将渲染为空白画布。数据流图(DFD)需要三个要素:
- 为图表设置样式 —
graph [...],节点 [...],边 [...]属性。 - 声明元素——外部实体(方框)、处理过程(圆圈)、数据存储(记录),包裹在虚线
簇边界。 - 绘制流程——显式
A -> B [label="..."]边,使用dir=both用于双向交换。
比较这两项 — 两者 验证通过,但只有第二项能生成图片:
❌ 仅样式(无法渲染):
digraph DFD {
graph [rankdir = LR]
node [shape = box, style = "filled", fillcolor = "#E1F5FE"]
edge [color = "#555555", arrowsize = 0.8]
}
✅ 完整(可渲染):
digraph DFD {
graph [rankdir = LR]
node [style = "filled", fillcolor = "#E1F5FE", shape = box]
Customer;
// ...加上处理过程、数据存储、边界和边
}
5. 该自顶向下分解过程(逐步进行)
该在线订单处理系统展示了该方法论。在每一层级,您都将获得完整且可运行的 Graphviz 代码。
步骤 1 — 构建上下文图(第 0 层)
将整个系统视为一个单一的处理过程并识别与外部世界的所有交互。不包含数据存储,也不包含内部细节。

digraph DFD {
// --- 图形样式与图表标题 ---
graph [
rankdir = LR
splines = true
overlap = false
nodesep = 0.6
ranksep = 0.9
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
label = "在线订单处理系统 - 上下文(第 0 层)"
]
node [ fontname = "Helvetica,Arial,sans-serif", fontsize = 11, penwidth = 1.5 ]
edge [ fontname = "Helvetica,Arial,sans-serif", fontsize = 9,
color = "#555555", arrowsize = 0.8 ]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
Customer; PaymentGateway; Warehouse; Courier;
// 单一系统处理过程
node [shape = circle, style = "filled", fillcolor = "#E8F5E9",
color = "#388E3C", fixedsize = true, width = 1.6]
System [label="0.0n在线订单n处理系统"];
// 数据流(双向交换数据时使用双向箭头)
Customer -> System [label="订单与n账户"];
System -> Customer [label="确认与n收据"];
System -> PaymentGateway [label="支付n请求"];
PaymentGateway -> System [label="支付n状态"];
Warehouse -> System [label="库存n可用"];
System -> Courier [label="配送n请求", dir=both];
} 解读:上下文图回答了“该系统的边界是什么,它与谁交互?”——它展示了外部实体及其数据流,但隐藏了所有内部结构。我们看到系统从客户接收订单,并通过支付网关,将库存与仓库,并将履约任务移交至快递员.
步骤 2 — 分解为一级(主要流程)

将单一上下文流程分解为关键功能,并添加共享数据存储。将流程与存储用虚线圆角系统边界.
digraph DFD {
// --- 图形样式与图表标题 ---
graph [
rankdir = LR
splines = true
overlap = false
nodesep = 0.5
ranksep = 0.8
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
label = "在线订单处理系统 - 一级"
]
node [ fontname = "Helvetica,Arial,sans-serif", fontsize = 11, penwidth = 1.5 ]
edge [ fontname = "Helvetica,Arial,sans-serif", fontsize = 9,
color = "#555555", arrowsize = 0.8 ]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
Customer; PaymentGateway; Warehouse; Courier;
// --- 系统边界容器 ---
subgraph cluster_SystemBoundary {
label = "在线订单处理系统";
fontname = "Helvetica,Arial,sans-serif"
fontsize = 14
color = "#757575"
style = "dashed,rounded"
bgcolor = "#FAFAFA"
margin = 20
// 处理过程(绿色圆形)
node [shape = circle, style = "filled", fillcolor = "#E8F5E9",
color = "#388E3C", fixedsize = true, width = 1.3]
P1 [label="1.0n下n订单"];
P2 [label="2.0n处理n支付"];
P3 [label="3.0n确认n库存"];
P4 [label="4.0n发n货"];
// 数据存储(黄色记录)
node [shape = record, style = "filled", fillcolor = "#FFF9C4",
color = "#FBC02D", fixedsize = false]
OrderDS [label="{ D1 | 订单 }"];
ProductDS [label="{ D2 | 产品n库存 }"];
ShippingDS [label="{ D3 | 发货 }"];
}
// --- 数据流:外部实体 ---
Customer -> P1 [label="订单及n账户详情"];
P1 -> Customer [label="订单n确认"];
P2 -> PaymentGateway [label="支付n请求"];
PaymentGateway -> P2 [label="支付n状态"];
Warehouse -> P3 [label="库存n可用"];
Courier -> P4 [label="配送n状态", dir=both];
// --- 处理过程间流水线 ---
P1 -> P2 [label="订单n总额"];
P2 -> P3 [label="已支付n订单"];
P3 -> P4 [label="已验证n订单"];
// --- 处理过程与数据存储之间 ---
P1 -> OrderDS [label="创建n订单"]; // 仅写
P3 -> ProductDS [label="更新n库存", dir=both]; // 读与写
P4 -> ShippingDS [label="创建n发货"]; // 仅写
OrderDS -> P3 [label="订单n详情"]; // 仅读
ShippingDS -> P4 [label="发货n标签"]; // 仅读
}
解释:
- 线性链
P1 → P2 → P3 → P4表示一个有序流水线:订单在下达后才会进行支付,支付完成后才会检查库存,库存确认后才发货。 - 该支付网关 交互使用两个单向箭头(
支付请求向外,支付状态向内)。 - 数据存储充当状态:
P1写入订单,P3读取并更新库存(dir=both),P4写入发货单。 P3 → ProductDS使用dir=both— 一条边,而非两条 — 因为该流程既读取又更新库存。
步骤 3 — 下钻:二级(专注于一个流程)

选择一个一级流程并进行分解仅该流程。显示父流程在边界处(粉色),以便保留上下文,同时显示子流程、子存储和流程。
digraph DFD {
// --- 图形样式与图表标题 ---
graph [
rankdir = LR
splines = true
overlap = false
nodesep = 0.5
ranksep = 0.8
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
label = "支付流程(第 2 层)- 在线订单处理系统"
]
node [ fontname = "Helvetica,Arial,sans-serif", fontsize = 11, penwidth = 1.5 ]
edge [ fontname = "Helvetica,Arial,sans-serif", fontsize = 9,
color = "#555555", arrowsize = 0.8 ]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
Customer; PaymentGateway;
// --- 系统边界(此子流程)---
subgraph cluster_SystemBoundary {
label = "2.0 支付流程";
fontname = "Helvetica,Arial,sans-serif"
fontsize = 14
color = "#757575"
style = "dashed,rounded"
bgcolor = "#FAFAFA"
margin = 20
// 子流程(绿色圆形)
node [shape = circle, style = "filled", fillcolor = "#E8F5E9",
color = "#388E3C", fixedsize = true, width = 1.3]
P21 [label="2.1n计算n总额"];
P22 [label="2.2n验证n支付"];
P23 [label="2.3n授权n支付"];
P24 [label="2.4n确认n订单"];
// 子数据存储(黄色记录)
node [shape = record, style = "filled", fillcolor = "#FFF9C4",
color = "#FBC02D", fixedsize = false]
CartDS [label="{ D1 | 购物车/n订单项 }"];
PromoDS [label="{ D2 | 促销活动 }"];
PaymentDS [label="{ D3 | 支付n交易 }"];
OrderDS [label="{ D4 | 订单 }"];
// 父流程(粉色)- 来自更高层级的上下文
node [shape = circle, style = "filled", fillcolor = "#FCE4EC",
color = "#C2185B", fixedsize = true, width = 1.4]
P1 [label="1.0n下订单n(父级)"];
P3 [label="3.0n确认库存n(父级)"];
}
// 来自父级/客户流向子流程
P1 -> P21 [label="订单项"];
P1 -> P22 [label="支付方式"];
Customer -> P22 [label="支付详情"];
// 子流程链
P21 -> P22 [label="总额与n折扣"];
P22 -> P23 [label="已验证n支付"];
P23 -> P24 [label="支付n已授权"];
// 与外部网关的交互
P23 -> PaymentGateway [label="授权n请求"];
PaymentGateway -> P23 [label="批准/n拒绝"];
// 输出至父级/客户
P24 -> P3 [label="已支付n订单"];
P24 -> Customer [label="支付n收据"];
// 数据存储访问
P21 -> CartDS [label="读取n项", dir=both];
P22 -> PromoDS [label="验证n促销"];
P23 -> PaymentDS [label="记录n交易", dir=both];
P24 -> OrderDS [label="更新n状态"];
}
解释(与“第 1 层):
- 2.1 计算总额是一个纯计算——读取购物车项,生成数值,除存储外无外部输入/输出。
- 2.3 授权支付是唯一步骤,与外部支付网关——资金流动被清晰地隔离。
- 该
订单存储再次出现,因为2.4更新订单状态(最初由1.0在一级。) - 该链
2.1 → 2.2 → 2.3 → 2.4是顺序验证管道在移交给3.0(粉色父级)。 - 父进程 1.0 和 3.0 被绘制为粉红色 外部 边界以锚定流程的起点和终点。
步骤 4 — 再次下钻:第三级(递归重复)

对任何仍然过于复杂的子进程重复完全相同的技术。我们放大到2.2 验证支付.
digraph DFD {
// --- 图形样式与图表标题 ---
graph [
rankdir = LR
splines = true
overlap = false
nodesep = 0.5
ranksep = 0.8
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
label = "验证支付(第三级)- 在线订单处理系统"
]
node [ fontname = "Helvetica,Arial,sans-serif", fontsize = 11, penwidth = 1.5 ]
edge [ fontname = "Helvetica,Arial,sans-serif", fontsize = 9,
color = "#555555", arrowsize = 0.8 ]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
Customer;
// --- 系统边界(此叶级子进程)---
subgraph cluster_SystemBoundary {
label = "2.2 验证支付";
fontname = "Helvetica,Arial,sans-serif"
fontsize = 14
color = "#757575"
style = "dashed,rounded"
bgcolor = "#FAFAFA"
margin = 20
// 叶级进程(绿色圆圈)
node [shape = circle, style = "filled", fillcolor = "#E8F5E9",
color = "#388E3C", fixedsize = true, width = 1.3]
P221 [label="2.2.1n验证n卡/支付n详情"];
P222 [label="2.2.2n检查n欺诈"];
P223 [label="2.2.3n验证n促销n代码"];
P224 [label="2.2.4n计算n最终n金额"];
// 叶级数据存储(黄色记录)
node [shape = record, style = "filled", fillcolor = "#FFF9C4",
color = "#FBC02D", fixedsize = false]
CardDS [label="{ D1 | 卡n注册表 }"];
FraudDS [label="{ D2 | 欺诈n规则 }"];
PromoDS [label="{ D3 | 促销活动 }"];
CartDS [label="{ D4 | 购物车/n订单项 }"];
// 父进程(粉红色)
node [shape = circle, style = "filled", fillcolor = "#FCE4EC",
color = "#C2185B", fixedsize = true, width = 1.4]
P21 [label="2.1n计算n总计n(父进程)"];
P23 [label="2.3n授权n支付n(父进程)"];
}
// 输入
P21 -> P221 [label="总计 &n日期"];
Customer -> P221 [label="支付n详情"];
// 顺序验证,含并行分支
P221 -> P222 [label="已验证n详情"];
P222 -> P223 [label="无欺诈n标志n(并行)"];
// 为最终计算提供输入
P21 -> P223 [label="促销n代码"];
P221 -> P224 [label="支付n总计"];
P223 -> P224 [label="已应用n折扣"];
// 输出至父进程
P224 -> P23 [label="已验证且n已折扣n总计"];
// 数据存储访问
P221 -> CardDS [label="验证n卡"];
P222 -> FraudDS [label="检查n规则"];
P223 -> PromoDS [label="查找n& 应用"];
P224 -> CartDS [label="读取n项", dir=both];
}
解释:
- 2.2.1 验证卡片是关卡——它必须在欺诈检查开始前成功。
- 2.2.2(欺诈)和2.2.3(促销)在并行:两者都读取规则并都参与最终计算。“(并行)”标签即表示此情况。
- 2.2.4 计算最终金额是扇入点 — 它连接
支付总额+折扣合并为一个验证后的输出并传递给父级2.3. - 卡注册表和欺诈规则是细节级存储,在第二层不可见——随着分解的进行,新的存储会自然出现。
步骤 5 — 当流程为“基本”时停止
继续分解,直到每个流程描述一个单一、明确、可执行的操作. 没有固定的深度;当流程能清晰地映射到一个功能或一个决策时即停止。上述 2.2.1 至 2.2.4 层级已经是基本层级。
6. 最佳实践与常见陷阱
✅ 最佳实践
- 对流程进行分层编号 (
2.2.4) 以便任何图表都能在树结构中自我定位。 - 在边界处绘制父级流程(粉色)以便流程保留上下文——切勿使输入/输出成为孤立项。
- 使用一条双向边 (
dir=both) 用于双向交换,而非两条独立的箭头。可减少杂乱。 - 保持标签描述性强但简短(“授权支付”,而非”AP”)。
- 一次分解一个过程— 每一层级都是独立的图表;切勿将多个层级塞入同一张图中。
- 平衡图表— 父级层的输入/输出必须等于其子级层输入/输出的总和(平衡规则)。
- 始终声明元素— 仅包含样式声明而未定义任何节点或边的模板将渲染出空白画布。每张数据流图(DFD)都必须先设置样式,再声明元素,最后进行连接.
- 唯一命名数据存储— 在子图中使用,但需重新进行本地编号(如 D1、D2…)以实现自包含。
❌ 常见陷阱
- 孤立过程— 指没有输入或输出的过程。每个过程都必须对某些内容进行转换。
- 缺失平衡— 在一级图中出现了数据流,但其二级子图中没有任何节点产生或消耗该流。
- 过早细化— 在零级上下文图中暴露数据存储(它们仅应出现在更低层级)。
- 控制流思维— 将循环或决策符号放入数据流图;此类内容应保留给流程图。数据流图展示的是数据,而非顺序。
- 两条平行箭头 本应是一条
dir=both边——造成重复线条的杂乱。 - 数据存储访问方向错误— 将数据存储标记为只读 而实际上它被写入(或反之)。
- 将样式模板误认为图表— 忘记声明节点和边会导致生成空白图。
7. 自上而下验证检查清单
在展示图表之前,请检查:
- ✅ 每个过程至少有一个输入和一个输出。
- ✅ 每个数据流标签都是名词(如“订单详情”),而不是动词。
- ✅ 每个数据存储都曾被读取和写入过(除非是明确的外部参考数据)。
- ✅ 层级边界平衡:子层级消耗和产生的内容必须与其父层级交换的内容完全一致。
- ✅ 外部实体仅出现在边界边缘,绝不出现在边界内部。
- ✅
dir=both用于双向交换;否则使用单向箭头。 - ✅ 粉色父进程引用正确显示了正在分解的层级。
- ✅ 该代码声明了真实的节点、边和边界——它不仅仅是一条样式规则。
8. 自顶向下分解过程总结
自顶向下 DFD 分解是从抽象到细节的旅程:
- 上下文(L0)——一个框,包含所有边界和外部实体。
- 系统(L1)——主要进程、存储和数据流水线。
- 子图(L2、L3…)——递归地一次聚焦一个进程,同时保持父上下文可见,并对本地存储进行编号。
每一层级回答不同的问题:L0 询问“系统的范围是什么?”,L1 询问“主要的数据流是什么?”,L2+ 询问“这些数据究竟是如何被转换的?”
该在线订单流程示例展示了完整的链条,包含完整且可运行的 Graphviz 代码——从包含 4 个实体的上下文图,直至一个包含 4 个步骤的验证例程 (2.2.1 → 2.2.4)。通过归并数字, 平衡流程,并遵循一致的颜色图例(蓝色方框、绿色圆圈、黄色记录、粉色父级引用、灰色虚线边界),并且始终显式声明每个节点/边,任何大型系统都保持可导航且无歧义——并且每个图表都能实际渲染。
9. 工具:使用 Visual Paradigm AI 构建 DFD 自顶向下分解
Visual Paradigm AI将AI 聊天机器人直接集成到建模工具中。无需手动绘制每一层,你可以通过对话驱动整个分解过程,然后微调结果。以下是如何在本指南所述方法中具体使用它。
9.1 DFD 工作的核心功能
该VP AI 聊天机器人是一个文本与代码助手,通过对话与你协作。对于 DFD 自顶向下分解,它可以:
| 能力 | 它为您做什么 |
|---|---|
| 生成图表代码 | 为给定的过程描述生成 Graphviz (DOT) 代码——逐层生成 |
| 分析附加图像 | 读取您上传的手绘或现有 DFD 图像,并将其转换为结构化模型 |
| 迭代优化 | 根据您的反馈(例如“放大到 2.2″、“添加下降分支”)重新生成图表” |
| 解释含义 | 逐一说明每个实体、过程、存储和流程的含义 |
| 验证语法 | 在渲染之前检查 DOT 代码的结构是否健全 |
| 生成策略/图表输出 | 生成与 DFD 配套的辅助图表或框架(例如泳道图或组织上下文图) |
📌 注意:Visual Paradigm 支持多种绘图符号。建议优先使用BPMN进行需要开始/结束事件、网关和泳道的业务流程建模;使用基于 Graphviz 的数据流图(DFD)进行本指南中所示的严格数据流建模。
9.2 实战对话 —— 分解在线订单流程
以下是一个真实的聊天会话,它复现了我们逐步讲解的步骤。请注意,每个提示都会深入一个层级——这正是自顶向下的方法论。
提示 1 —— 启动上下文图:
“为在线订单处理系统创建一个上下文图(0 级)。外部实体:客户、支付网关、仓库、快递员。”
VP AI 响应生成一个 0 级数据流图(DFD)——包含一个中心处理过程、四个外部实体及其数据流——您将其绘制在图中。
提示 2 —— 增加详细层级:
“现在将其分解为 1 级数据流图,包含以下处理过程:1.0 下订单、2.0 处理支付、3.0 确认库存、4.0 发货。添加订单、产品库存和发货的数据存储。”
VP AI 返回带有按顺序链接的流程、附加的存储以及保留的外部实体流程的 1 级图——即您在指南第 2 步中看到的流水线。
提示 3——聚焦到一个流程:
“聚焦到 2.0 支付流程。创建一个 2 级子图,包含 2.1 计算总额、2.2 验证支付、2.3 授权支付、2.4 确认订单。保留 1.0 和 3.0 作为父级引用。”
VP AI 生成2 级子图:子流程、本地存储(D1–D4)、支付网关交互,以及 1.0 和 3.0 的粉色父级引用——与第 3 步一致。
提示 4——再次下钻:
“将 2.2 验证支付下钻为 3 级图:2.2.1 验证卡片、2.2.2 检查欺诈、2.2.3 验证促销、2.2.4 计算最终金额。添加卡片注册、欺诈规则、促销和购物车项的存储。”
VP AI 生成3 级叶图,包含扇入计算(2.2.4)以及并行的欺诈/促销分支——完全符合第 4 步。
提示 5——添加异常处理:
“添加失败路径:如果 2.2.2 检查欺诈标记了该交易,则路由到取消通知流程并返回给顾客。”
VP AI 优化该图,添加拒绝分支并自动重新平衡流程。
9.3 有效的提示模式
使用这些模式以获得可靠且符合方法论的结果:
| 目标 | 示例提示 |
|---|---|
| 向下一层分解 | “放大至3.0 确认库存作为二级子图。” |
| 指定编号 | “使用带编号的流程2.1, 2.2, 2.3.” |
| 保留父级上下文 | “保留 1.0 和 3.0 作为边界处的父引用。” |
| 添加数据存储 | “包含存储: D1 购物车项, D2 促销活动.” |
| 显示双向流 | “使用 dir=both 用于进程与存储之间的读写操作。” |
| 平衡层级 | “确保输入和输出与父层级相匹配。” |
| 添加失败路径 | “当支付被拒绝时.” |
| 限制深度 | “停留在基本过程——即单一、可执行的操作。” |
9.4 上传图片进行分析
如果您已有手绘或遗留的数据流图(DFD)并希望将其数字化:
- 附加图像到聊天中(现有 DFD 的截图、照片或导出文件)。
- 提问:“分析此 DFD 图像,并将其转换为我可编辑的结构化模型。”
- VP AI 检查图像(读取形状、标签和箭头)并将实体、流程、存储和流重构为可编辑的图表。
📌 AI 读取图像的内容——矩形、圆形、记录及其标签——并以正确的符号表示法重现它们。这是从粗略草图到清晰分层模型的快速路径,随后可进一步分解该模型。
9.5 通过工件工作流进行迭代
VP AI将每个生成的图表存储为工件,供您在细化过程中引用:
- “细化 Level-2 工件,以添加欺诈拒绝分支。”——针对特定已生成的图表,而非从头重新生成。
- “重新生成上下文图,但移除仓库实体。”——当范围发生变化时替换工件。
- “比较 Level-2 和 Level-3 工件以实现平衡。”——交叉检查父级/子级流程的一致性。
由于工件保留了对话状态,您可以在不丢失先前决策的情况下逐层进行细化——这正是自上而下分解的精髓。
9.6 推荐工作流程检查清单
| 阶段 | 操作 |
|---|---|
| 1. 脚手架 | 首先提示生成上下文图(Level 0)。 |
| 2. 建立 Level 1 | 请求包含数据存储和边界的重大过程分解。 |
| 3. 向下钻取 | 一次聚焦一个过程;保留父级引用。 |
| 4. 优化 | 请求异常路径、平衡修复方案并存储修正内容。 |
| 5. 验证 | 让 AI 检查 DOT 语法;并查阅第 7 节中的检查清单。 |
| 6. 文档化 | 请求为每个层级附上解释性叙述。 |
9.7 示例输出 — 请求 VP AI 生成第 1 级代码
聊天机器人针对“第 2 步分解”的典型响应将是“您之前看到的完整且可运行的 DOT 代码”:

digraph DFD {
graph [
rankdir = LR, splines = true, overlap = false,
nodesep = 0.5, ranksep = 0.8,
fontname = "Helvetica,Arial,sans-serif", fontsize = 12,
label = "在线订单处理系统 - 一级"
]
node [ fontname = "Helvetica,Arial,sans-serif", fontsize = 11, penwidth = 1.5 ]
edge [ fontname = "Helvetica,Arial,sans-serif", fontsize = 9,
color = "#555555", arrowsize = 0.8 ]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
Customer; PaymentGateway; Warehouse; Courier;
subgraph cluster_SystemBoundary {
label = "在线订单处理系统";
fontname = "Helvetica,Arial,sans-serif"
fontsize = 14
color = "#757575"
style = "dashed,rounded"
bgcolor = "#FAFAFA"
margin = 20
node [shape = circle, style = "filled", fillcolor = "#E8F5E9",
color = "#388E3C", fixedsize = true, width = 1.3]
P1 [label="1.0n下n单"];
P2 [label="2.0n处理n支付"];
P3 [label="3.0n确认n库存"];
P4 [label="4.0n发n货"];
node [shape = record, style = "filled", fillcolor = "#FFF9C4",
color = "#FBC02D", fixedsize = false]
OrderDS [label="{ D1 | 订单 }"];
ProductDS [label="{ D2 | 产品n库存 }"];
ShippingDS [label="{ D3 | 发货 }"];
}
// 数据流
Customer -> P1 [label="订单 &n账户详情"];
P1 -> Customer [label="订单n确认"];
P2 -> PaymentGateway [label="支付n请求"];
PaymentGateway -> P2 [label="支付n状态"];
Warehouse -> P3 [label="库存n可用"];
Courier -> P4 [label="配送n状态", dir=both];
P1 -> P2 [label="订单n总额"];
P2 -> P3 [label="已付n订单"];
P3 -> P4 [label="已验证n订单"];
P1 -> OrderDS [label="创建n订单"];
P3 -> ProductDS [label="更新n库存", dir=both];
P4 -> ShippingDS [label="创建n发货"];
OrderDS -> P3 [label="订单n详情"];
ShippingDS -> P4 [label="发货n标签"];
}
将其粘贴到 VP 图中,即可得到结构完整的一级模型——准备好在下一个提示中进行进一步分解。
10. 总结
自顶向下的 DFD 分解是一个从抽象到细节的旅程:
- 上下文(L0)——一个框,包含所有边界和外部实体。
- 系统(L1) — 主要流程、存储和数据管道。
- 子图(L2、L3…) — 递归地一次聚焦一个流程,同时保持父级上下文可见,并对本地存储进行编号。
每一层级回答不同的问题:L0 询问“系统的范围是什么?”,L1 询问“主要的数据流有哪些?”,L2+ 询问“这些数据是如何具体转换的?”
借助Visual Paradigm AI,整个层级结构支持对话式交互:提示生成 L0 层级,要求对其进行分解,一次聚焦一个流程,请求异常分支,并上传图片以将现有图表数字化。结合严格的编号, 流量平衡、一致的颜色图例以及完整的先声明后连接代码,任何大型系统都能保持可导航、无歧义——并且每个图表都能实际渲染。🚀












