1. 数据流图简介
数据流图(DFD)是信息系统中数据流动情况的图形化表示。它展示了:
- 数据的来源和去向
- 数据如何被处理
- 数据存储的位置
- 与系统交互的人员或实体

2. 核心概念
核心元素
| 元素 | 符号 | 用途 |
|---|---|---|
| 外部实体 | 矩形 | 发送或接收数据的人员、组织或系统 |
| 处理 | 圆形/椭圆形 | 将输入数据转换为输出数据 |
| 数据存储 | 开口矩形 | 持久数据存储库 |
| 数据流 | 箭头 | 显示数据移动的方向 |
DFD层级
- 上下文图(第0层): 最高层,显示系统边界和主要外部实体
- 第1层: 将主要过程分解为主要子过程
- 第2层及以上: 进一步分解,展示详细过程
3. 逻辑DFD与物理DFD
逻辑DFD

一个逻辑DFD(也称为“基本模型”)关注:
- 做什么系统所执行的功能
- 业务活动和信息需求
- 与实现技术无关
特点:
- 展示业务操作和流程
- 不包含特定技术细节
- 更抽象且以用户为中心
- 有助于理解业务需求
物理数据流图

A 物理数据流图(也称为“实现模型”)关注:
- 如何系统将如何实现
- 技术细节和约束
- 特定的技术和系统
特点:
- 展示实际的硬件、软件和人员
- 包含实现细节
- 更具体且以开发者为中心
- 有助于系统设计和部署
对比表
| 方面 | 逻辑数据流图 | 物理数据流图 |
|---|---|---|
| 关注点 | 业务需求 | 实现 |
| 谁 | 业务分析师、用户 | 系统设计人员、开发人员 |
| 层级 | 高层次、抽象 | 详细、具体 |
| 组件 | 业务流程 | 技术流程 |
| 数据存储 | 概念实体 | 物理文件/数据库 |
| 实体 | 业务角色 | 实际系统/设备 |
4. 数据流图组件

外部实体
- 数据的来源和去向
- 系统边界之外
- 用名词命名
处理过程
- 将输入数据转换为输出数据
- 用动词+名词命名
- 编号以供识别
数据存储
- 持久化数据存储库
- 用名词命名
- D1、D2、D3……编号
数据流
- 显示数据的流动
- 用描述性标签命名
- 方向表示数据流动方向
5. 使用Graphviz的实例演示
示例1:酒店管理系统(逻辑数据流图)

Graphviz
Edit Graphviz in VPasCode
digraph HotelMIS_DFD_Logical {
// --- 图形样式 ---
graph [
rankdir = LR
splines = true
overlap = false
nodesep = 0.6
ranksep = 1.0
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
]
// --- 节点样式 ---
node [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 11
penwidth = 1.5
]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
客人;
员工;
// --- 系统边界 ---
subgraph cluster_SystemBoundary {
label = "酒店MIS系统边界";
fontname = "Helvetica,Arial,sans-serif";
fontcolor = "#757575";
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库存"];
// 数据存储
node [shape = record, style = "filled", fillcolor = "#FFF9C4", color = "#FBC02D", fixedsize = false]
ReservationsDS [label="{ <id> D1 | 预订n数据库 }"];
RoomsDS [label="{ <id> D2 | 房间状态n数据库 }"];
InventoryDS [label="{ <id> D3 | 库存n数据库 }"];
}
// --- 边缘样式 ---
edge [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 9
color = "#555555"
arrowsize = 0.8
]
// --- 数据流 ---
// 客人交互
客人 -> P1 [label="预订请求"];
P1 -> 客人 [label="确认"];
客人 -> P2 [label="到达"];
P2 -> 客人 [label="房卡/收据"];
// 员工交互
员工 -> P3 [label="更新库存"];
P3 -> 员工 [label="警报/报告"];
// 处理过程到数据存储
P1 -> ReservationsDS [label="新预订"];
ReservationsDS -> P1 [label="检查可用性"];
P1 -> RoomsDS [label="房间详情请求"];
RoomsDS -> P1 [label="可用房间"];
P2 -> RoomsDS [label="房间状态更新"];
RoomsDS -> P2 [label="房间信息"];
P2 -> P3 [label="住宿详情"];
P3 -> InventoryDS [label="库存更新"];
InventoryDS -> P3 [label="库存水平"];
}
示例2:逻辑DFD – 图书馆管理系统

Graphviz
Edit Graphviz in VPasCode
digraph LibrarySystem_Logical {
// --- 图形样式 ---
graph [
rankdir = TB
splines = true
nodesep = 0.5
ranksep = 0.8
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
]
// --- 节点样式 ---
node [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 11
penwidth = 1.5
]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
成员;
图书馆员;
// --- 系统边界 ---
subgraph cluster_LibrarySystem {
label = "图书馆系统(逻辑)";
style = "dashed,rounded";
color = "#757575";
bgcolor = "#FAFAFA";
margin = 20;
// 处理过程
node [shape = circle, style = "filled", fillcolor = "#E8F5E9", color = "#388E3C", width = 1.4]
P1 [label="1.0n管理n目录"];
P2 [label="2.0n处理n借阅"];
P3 [label="3.0n处理n归还"];
// 数据存储
node [shape = record, style = "filled", fillcolor = "#FFF9C4", color = "#FBC02D"]
CatalogDS [label="{ <id> D1 | 图书n目录 }"];
TransactionsDS [label="{ <id> D2 | 借阅n记录 }"];
MemberDS [label="{ <id> D3 | 成员n数据库 }"];
}
// --- 边缘样式 ---
edge [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 9
color = "#555555"
arrowsize = 0.8
]
// --- 数据流 ---
// 成员交互
成员 -> P1 [label="搜索图书"];
P1 -> 成员 [label="搜索结果"];
成员 -> P2 [label="借阅请求"];
P2 -> 成员 [label="借阅确认"];
成员 -> P3 [label="归还图书"];
P3 -> 成员 [label="归还收据"];
// 图书馆员交互
图书馆员 -> P1 [label="添加/更新图书"];
P1 -> 图书馆员 [label="目录更新确认"];
图书馆员 -> P3 [label="处理逾期"];
P3 -> 图书馆员 [label="逾期报告"];
// 数据流
P1 -> CatalogDS [label="图书更新"];
CatalogDS -> P1 [label="目录数据"];
P2 -> CatalogDS [label="检查可用性"];
CatalogDS -> P2 [label="图书状态"];
P2 -> MemberDS [label="检查成员状态"];
MemberDS -> P2 [label="成员信息"];
P2 -> TransactionsDS [label="创建借阅记录"];
TransactionsDS -> P2 [label="借阅历史"];
P3 -> TransactionsDS [label="更新归还"];
TransactionsDS -> P3 [label="借阅记录"];
P3 -> MemberDS [label="更新成员状态"];
MemberDS -> P3 [label="成员信息"];
}
示例3:物理DFD – 图书馆管理系统

Graphviz
Edit Graphviz in VPasCode
digraph LibrarySystem_Physical {
// --- 图形样式 ---
graph [
rankdir = TB
splines = true
nodesep = 0.5
ranksep = 0.8
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
]
// --- 节点样式 ---
node [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 11
penwidth = 1.5
]
// 外部实体(物理)
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
"图书馆成员" [label="图书馆n成员"];
"图书馆员" [label="图书馆n工作人员"];
"邮件系统" [label="邮件n系统"];
"支付网关" [label="支付n网关"];
// --- 系统边界 ---
subgraph cluster_LibrarySystem_Physical {
label = "图书馆管理系统(物理实现)";
style = "dashed,rounded";
color = "#757575";
bgcolor = "#FAFAFA";
margin = 20;
// 物理处理过程(含技术细节)
node [shape = circle, style = "filled", fillcolor = "#E8F5E9", color = "#388E3C", width = 1.4]
P1 [label="1.0n网络目录n(HTML, JS)"];
P2 [label="2.0n借阅nAPIn(Python/REST)"];
P3 [label="3.0n归还n处理器n(Java)"];
// 物理数据存储(含技术细节)
node [shape = record, style = "filled", fillcolor = "#FFF9C4", color = "#FBC02D"]
CatalogDS [label="{ <id> D1 | PostgreSQLn图书目录 }"];
TransactionsDS [label="{ <id> D2 | MongoDBn借阅记录 }"];
MemberDS [label="{ <id> D3 | Oraclen成员数据库 }"];
// 额外的物理组件
node [shape = box, style = "filled", fillcolor = "#F3E5F5", color = "#8E24AA"]
"缓存服务器" [label="Redisn缓存"];
"消息队列" [label="RabbitMQn队列"];
}
// --- 边缘样式 ---
edge [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 9
color = "#555555"
arrowsize = 0.8
]
// --- 数据流(物理)---
// 物理成员交互
"图书馆成员" -> P1 [label="HTTP GETn图书搜索"];
P1 -> "图书馆成员" [label="HTML/JSONn结果"];
"图书馆成员" -> P2 [label="REST APIn借阅请求"];
P2 -> "图书馆成员" [label="JSONn确认"];
"图书馆成员" -> P3 [label="REST APIn归还"];
P3 -> "图书馆成员" [label="JSONn收据"];
// 物理图书馆员交互
"图书馆员" -> P1 [label="HTTPSn目录管理"];
P1 -> "图书馆员" [label="HTMLn确认"];
"图书馆员" -> P3 [label="REST APIn逾期处理"];
P3 -> "图书馆员" [label="PDF报告"];
// 外部系统交互
P2 -> "邮件系统" [label="SMTPn通知"];
P3 -> "支付网关" [label="HTTPSn罚款支付"];
// 数据流(物理)
P1 -> CatalogDS [label="SQL UPDATE"];
CatalogDS -> P1 [label="SQL SELECT"];
P1 -> "缓存服务器" [label="缓存更新"];
"缓存服务器" -> P1 [label="缓存命中"];
P2 -> CatalogDS [label="SQL SELECT"];
CatalogDS -> P2 [label="SQL结果"];
P2 -> MemberDS [label="SQL SELECT"];
MemberDS -> P2 [label="SQL结果"];
P2 -> TransactionsDS [label="INSERT"];
TransactionsDS -> P2 [label="SELECT"];
P2 -> "消息队列" [label="发布n借阅事件"];
P3 -> TransactionsDS [label="UPDATE"];
TransactionsDS -> P3 [label="SELECT"];
P3 -> MemberDS [label="UPDATE"];
MemberDS -> P3 [label="SELECT"];
P3 -> "消息队列" [label="发布n归还事件"];
}
示例4:电子商务订单处理(逻辑DFD)

Graphviz
Edit Graphviz in VPasCode
digraph ECommerce_Logical {
// --- 图形样式 ---
graph [
rankdir = LR
splines = true
nodesep = 0.5
ranksep = 0.8
fontname = "Helvetica,Arial,sans-serif"
fontsize = 12
]
// --- 节点样式 ---
node [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 11
penwidth = 1.5
]
// 外部实体
node [shape = box, style = "filled", fillcolor = "#E1F5FE", color = "#0288D1"]
Customer;
Supplier;
"Payment Processor" [label="PaymentnProcessor"];
// --- 系统边界 ---
subgraph cluster_ECommerce {
label = "电子商务系统(逻辑)";
style = "dashed,rounded";
color = "#757575";
bgcolor = "#FAFAFA";
margin = 20;
// 处理过程
node [shape = circle, style = "filled", fillcolor = "#E8F5E9", color = "#388E3C", width = 1.4]
P1 [label="1.0n处理n订单"];
P2 [label="2.0n管理n库存"];
P3 [label="3.0n处理n发货"];
// 数据存储
node [shape = record, style = "filled", fillcolor = "#FFF9C4", color = "#FBC02D"]
OrderDS [label="{ <id> D1 | 订单 }"];
InventoryDS [label="{ <id> D2 | 库存 }"];
ShipmentDS [label="{ <id> D3 | 发货 }"];
}
// --- 边缘样式 ---
edge [
fontname = "Helvetica,Arial,sans-serif"
fontsize = 9
color = "#555555"
arrowsize = 0.8
]
// --- 数据流 ---
// 客户交互
Customer -> P1 [label="订单详情"];
P1 -> Customer [label="订单确认"];
Customer -> P3 [label="追踪订单"];
P3 -> Customer [label="追踪信息"];
// 支付处理器
"Payment Processor" -> P1 [label="支付响应"];
P1 -> "Payment Processor" [label="支付请求"];
// 供应商
Supplier -> P2 [label="库存更新"];
P2 -> Supplier [label="补货请求"];
// 处理过程数据流
P1 -> OrderDS [label="保存订单"];
OrderDS -> P1 [label="订单历史"];
P1 -> InventoryDS [label="检查库存"];
InventoryDS -> P1 [label="可用性"];
P1 -> P3 [label="发货详情"];
P2 -> InventoryDS [label="更新库存"];
InventoryDS -> P2 [label="当前库存"];
P3 -> OrderDS [label="更新状态"];
OrderDS -> P3 [label="订单信息"];
P3 -> ShipmentDS [label="创建发货"];
ShipmentDS -> P3 [label="发货详情"];
}
6. 最佳实践
针对逻辑DFD
- 关注业务流程,而非技术
- 使用业务术语利益相关者能够理解的
- 保持流程在一致的抽象层次上
- 与业务用户共同验证以确保准确性
- 展示所有主要数据流组件之间
用于物理数据流图
- 包含与技术相关的详细信息
- 考虑性能和可扩展性
- 记录系统接口清晰地
- 包含错误处理以及恢复流程
- 与实际系统架构保持一致
通用最佳实践
- 从上下文图开始
- 分层编号流程
- 使用有意义的名称适用于所有组件
- 避免数据流交叉
- 定期与利益相关者验证
7. 常见陷阱

陷阱1:逻辑与物理混用
❌ 错误:在逻辑数据流图中添加数据库技术名称
✅ 正确:保持逻辑数据流图与技术无关
陷阱2:遗漏数据流
❌ 错误:仅显示实体之间的单向流动
✅ 正确:在适当情况下包含双向流动
陷阱3:过于复杂
❌ 错误:在一个图中包含20多个处理过程
✅ 正确:分解为多个专注的图表
陷阱4:数据流标签错误
❌ 错误: 以“数据”作为标签
✅ 正确: 如“客户订单详情”之类的描述性标签
陷阱5:错误的处理边界
❌ 错误: 一个处理执行多个无关的功能
✅ 正确: 为不同的功能设置独立的处理
结论
数据流图是系统分析与设计的重要工具。理解逻辑数据流图与物理数据流图之间的区别,有助于你在软件开发生命周期的不同阶段,与不同的利益相关者进行有效沟通。
- 逻辑数据流图 连接业务需求与技术解决方案
- 物理数据流图 指导实施和部署决策
使用所提供的示例作为您自己数据流图的模板,在遵循上述最佳实践的同时,根据您的具体系统需求进行调整。
额外资源
- 由Visual Paradigm提供的AI Gane和Sarson DFD生成器: 解释了Visual Paradigm的AI工具如何从文本描述生成Gane-Sarson DFD。
- 使用Visual Paradigm创建数据流图的逐步指南: 提供了使用Visual Paradigm在线工具创建DFD的教程,涵盖从注册到共享的全过程。
- 如何创建数据流图(DFD)?: 一份指南,涵盖DFD的定义、用途以及主要类型(物理型和逻辑型)。
- 使用Visual Paradigm Online创建SSADM DFD图的入门指南: 一份入门指南,介绍如何使用Visual Paradigm Online创建SSADM风格的数据流图。
- 数据流图(DFD)综合指南:解析信息流: DFD的概览,详细说明其组成部分,以及为何Visual Paradigm是创建它们的合适工具。
- 掌握使用Visual Paradigm的数据流图:逐步指南: 一份实用指南,通过示例和模板教授DFD的创建,包含在线购物系统等案例研究。
- 理解逻辑DFD与物理DFD:何时以及为何我们需要它们: 解释了逻辑与物理数据流图之间的差异、用途以及适用场景。
- 使用Visual Paradigm Online创建数据流图(DFD)的入门指南: 一份面向初学者的教程,逐步演示如何使用Visual Paradigm Online创建DFD。
- DFD档案 – Visual Paradigm指南: 关于DFD主题的文章合集,包括AI生成器、验证、平衡和层级等内容。
- 使用Visual Paradigm Online开始使用数据流图(DFD)的指南: 详细说明创建DFD的逐步过程,包括其关键组成部分以及如何使用模板。
- 使用最佳DFD工具绘制DFD: 讨论数据流的图形表示,详细说明逻辑DFD与物理DFD的区别,并探讨每种类型的优点。
-
使用Visual Paradigm Online的DFD入门指南: 一份印尼语的DFD入门指南,概述了组件以及在Visual Paradigm Online中逐步创建的过程。
本指南为创建有效的DFD提供了基础。请记住,优秀的图表是通过迭代和利益相关者的反馈不断演进的。









