资讯动态

数据流图(DFD)实战指南:让系统分析从混沌到清晰

发布时间:2026/10/16 12:30:10 来源:尧图企业网站定制
数据流图DFD在我做系统分析第二年时才真正体会到它的分量。当时我负责一个内部业务系统的需求调研交出的文档里画满了流程图和用例说明结果评审会上开发负责人只问了一句“你给我讲讲从用户提交申请到最终收到结果这中间的数据到底是怎么流转的每一步谁加工、落到哪里”我当场就没接住。也就是从那次开始我老老实实回去补了数据流图的功课。数据流图DFD之所以被看作系统分析阶段的核心建模工具就是因为它用一套极简的图形语言把系统中数据的流动路径讲得清清楚楚。你不需要看几百页需求文档一张分层DFD就能让业务人员、分析师、开发、测试坐在一起用同一种视角讨论系统到底要做什么。这篇文章不打算讲教科书式的理论而是把我自己在项目里用数据流图建模的全过程、踩过的坑、以及多人协作时怎么靠它把需求变成可落地的逻辑模型一次性讲透。内容适合系统分析师、产品经理、需求工程师也适合刚入行想搞明白“DFD到底怎么用”的读者。1. 从一个被问住的评审会说起DFD到底在解决什么问题先回到那个让我尴尬的评审会。我当时为了说明业务流程画了一张类似泳道图的跨部门流程图把“申请人填写表单”“主管审批”“财务复核”“系统归档”这些步骤按时间顺序铺开。流程图本身没有错但它回答的是“事情按什么顺序发生”回答不了“每一条数据记录从哪里来、经过谁的加工、存到哪里去、最终输出成什么”。而后者恰恰是系统分析阶段最需要锁死的东西。数据流图DFD做的就是这件事它把系统看作一个数据加工场外部实体把数据送进来系统内部一层层加工中间会写入数据存储最后再把结果输出给外部实体。它不关心按钮长什么样不关心界面跳转不关心你用的是MySQL还是Oracle它只关心数据的流动路径和加工逻辑。1.1 DFD与其他图的根本区别逻辑模型优先我后来总结过一个判断方法一张建模图到底算不算系统分析阶段的产物就看它是否刻意回避了“物理实现”。流程图、时序图、状态图天然偏向过程和控制画着画着就容易考虑“先查库还是先调接口”。ER图关注数据结构本身但它不表达加工过程。用例图站在用户视角描述目标和交互但对系统内部的数据流转基本无能为力。DFD从诞生起就刻意保持“逻辑性”。它用“加工”表示一组数据转换动作但不规定由哪个类、哪个函数来实现它用“数据存储”表示数据停留的场所但不规定是数据库表还是缓存文件。这种特性让它非常适合作为需求分析阶段与用户确认范围的工具也适合作为后续设计阶段的输入基线。1.2 建模的四个核心产物思维上的“四件套”在一个正规的需求分析流程里围绕DFD通常要产出四样东西分层DFD图从顶层情境图开始逐层分解加工直到原子级加工。数据字典对图中每个数据流、数据存储、加工做精确解释。加工说明用结构化文字或判定表描述每个加工的业务规则。平衡检查记录保证父子图数据流、存储编号一致没有丢失。我见过很多团队只画图不写数据字典结果图挂在墙上很漂亮一评审细节就露馅——因为大家对着“患者信息”四个字理解各不相同。DFD的完整价值必须靠“图字典说明”三者配合才能发挥。2. 先把DFD的基本语法吃透四种符号和一套命名规矩DFD的语法极其精简核心就四种符号外部实体、加工、数据存储、数据流。很多初学者觉得简单但真到画图时又容易画得不像样问题往往出在“符号语义”没有吃透。2.1 四种基本符号的含义与规范下面这张表是我自己在项目里经常贴在工位前的速查表团队新人我都会发一份符号图形表示语义命名要求常见错误外部实体矩形或直角矩形位于系统边界之外与系统交换数据的角色或系统名词如“患者”“支付平台”“第三方短信服务”把系统内部模块画成外部实体加工圆角矩形或圆形记法不同对输入数据进行加工产生输出数据的处理过程动词宾语如“预约处理”“校验号源”只写“处理1”“信息加工”数据存储开口矩形两条横线数据静止停留的地方逻辑上的数据集合名词如“预约记录”“号源表”直接写成“Oracle库表”数据流箭头线代表一条数据的流动画出的是一条数据而不是控制信号名词或名词性短语如“预约请求”“支付结果”把“点击按钮”“发送指令”画成数据流我第一次带队评审时就见过有人把“数据库更新成功提示”画成数据流那条线从加工指向外部实体名字叫“成功提示”。严格来说这属于控制消息不是数据内容。你可以理解成数据流是“货物”沿传送带在移动而不是“传送带启动的信号”。把控制流混进数据流是DFD最常见的滥用方式之一。2.2 加工编号给每一层贴地址分层DFD里加工必须编号。这就像给每个加工一个逻辑地址否则图一多就乱套。顶层图只有一个加工编号可以省略。0层图加工编号为1、2、3、4。如果加工2继续分解其子图里的加工编号要带父加工编号前缀比如2.1、2.2、2.3。再下一层就在父编号基础上继续追加比如2.1.1、2.1.2。我见过不少团队编号到第三层就开始放弃直接用A、B、C最后在文档里根本说不清某个加工属于哪个父级。编号其实是在为可追溯性服务一旦需求变更你能快速定位到具体加工和对应子图。2.3 一张图放多少加工才合适没有硬性标准但我个人的经验值供参考单张DFD里加工数量控制在3到7个之间。少于3个说明本层分解意义不大可能该层就不需要单独拆开。多于7个信息量过大评审时没人能一眼看明白而且容易破坏平衡检查的严谨性。这其实是认知负荷问题。一张图上超过七个节点读者的注意力就会开始发散评审质量明显下降。宁可用“多分一层”的方式也不要在一张图上堆二十个方块。3. 一套完整建模过程以某医院门诊预约系统为例理论说多了没用我拿一个实际做过的案例类型——某医院门诊预约系统的需求分析——来完整走一遍。这个例子非常典型因为它涉及外部系统交互、核心业务加工、多种数据存储足够看清DFD的分层思路。3.1 第一步先画顶层情境图把系统边界锁死顶层情境图也叫上下文图它只有一个加工也就是整个系统本体外围挂上所有外部实体以及它们与系统之间的数据流。这个例子里外部实体大概有这些外部实体与系统的核心交互患者提交预约请求、接收预约确认、支付费用、接收通知医生查询预约列表、录入排班、填写诊疗结果支付平台返回支付结果、发送对账单药房系统接收处方、返回库存信息我只画了一个加工“门诊预约与诊疗处理系统”数据流包括“预约请求”“预约确认”“排班信息”“支付请求”“支付结果”“处方信息”等。这一步最核心的价值是确认系统边界。评审时我一般先问业务方“哪些东西是系统内部的哪些是外部系统或角色直接控制的”边界一旦含糊后续所有分解都会跟着歪。比如“医生查询预约列表”这个动作到底是医生通过本系统操作还是医生从另一个系统接数据两种处理方式完全不同前者医生是外部实体后者可能有外部系统接口。画顶层图逼着你把这类问题先暴露出来。3.2 第二步画0层图把主加工分解成业务模块顶层图确认后把中间那个加工摊开拆成几个主要加工就得到0层图。对门诊预约系统我当时拆成了五个加工预约处理接诊处理缴费处理处方与取药处理与外部药房系统联动通知处理每个主要加工配套相应的数据存储号源表、患者档案、预约记录、缴费记录、处方记录、通知记录。数据流在加工、外部实体、数据存储之间按业务逻辑连线。这一层的关键是分解依据。不是按部门来拆而是按“数据加工的高内聚程度”来拆。现实中一个业务操作可能跨多个加工比如“预约处理”里既要查询排班又要校验号源还要写预约记录这三件事在数据上是一串连续的变换适合放进同一个加工内部继续分解。我复盘过很多次0层图拆得好不好直接决定后面需求评审顺不顺。拆得太碎图面复杂评审的人抓不住主线拆得太粗下一层又得大动干戈。建议是回到顶层图的数据流去推演每条数据进来后依次要和哪些加工发生关系把这些“关系链”找出来自然就能切成几个稳定的加工模块。3.3 第三步继续分解1层图处理到“动作级”0层图里的每一个加工还可以继续细化。以预约处理为例我把它拆成1.1 接收与校验患者预约请求1.2 查询科室排班与号源1.3 校验预约规则限号、号源冲突、黑名单1.4 生成预约记录并更新号源1.5 发送预约确认通知这个阶段的加工基本就是一个可以被开发直接理解和估算的任务单元了。注意句子里的结构每个加工都是“动词数据对象”比如“查询科室排班与号源”“生成预约记录并更新号源”指向非常明确。在1层图绘制时要关注数据流命名的精确度。比如“排班信息”会出现在1.2的输入输出里但在加工1.1到1.4之间流转的可能是“已校验预约请求”“标准化患者信息”“可预约时段列表”这些名称必须能准确描述数据内容而不是笼统写“信息”。3.4 分层图的一致性检查“对账”是画图价值链上最关键的一环分层画完之后必须做一致性检查这是DFD实践中价值最高也最容易被漏掉的步骤。直白点说父图加工有几条输入输出数据流子图就必须能对应上。比如父图的“预约处理”从“患者”接收“预约请求”并向“预约记录”写入数据那么在1层子图里就必须能找到从哪里接收这条“预约请求”以及最终往哪个存储写预约记录。我习惯把每条数据流当成一个物理凭证来对账有没有输入没输出的加工如果有说明数据凭空消失这个加工要么不必要要么遗漏了输出。有没有输出没输入的加工如果有说明这个加工无中生有业务上通常站不住脚。有没有数据存储只被写入却从不被读取如果有说明这个存储是“死库”要么删除要么还有未识别出的读取方。这个习惯帮我挡掉了很多次需求变更。有一次对方坚持要在系统里加一个“临时保存”功能结果对账后发现问题不是存储缺失而是加工粒度不够原有的“处方处理”没有暴露暂存动作。搞清楚根因后我们只是在原加工里增加了分支说明根本不需要新增一个存储和一堆数据流。4. 画DFD最常见的五个坑每个坑都有现场案例画DFD和写代码一样经验和教训往往比教程更值钱。下面这五个坑我在真实项目里都见过有的自己踩过有的是评审时从别的团队文档里挑出来的。4.1 坑一把控制消息当成数据流这是新手最容易犯的问题。有人会把“点击提交按钮”画成一条数据流有人会把“校验通过”画成一条从加工到外部的数据流。严格说这两者都不是“数据”。“点击提交按钮”是用户在界面上的操作事件属于控制流。“校验通过”是一个状态结果可以被当成加工后输出给另一加工的数据但如果你把它直接画给外部实体语义就歪了——外部实体要的不是“校验通过”这条消息而是“预约确认单”这份数据。实践里我的判断标准很简单这条线上流动的内容放进一个信封里寄给对方内容会不会让人当事说事“预约请求”可以“支付结果回调”可以“点击了按钮”不行“进入了下一步”也不行。4.2 坑二生产出黑洞、灰洞和奇迹这是教科书里常常提到的三种病态图但实战里检查时依然经常看到黑洞加工有输入却没有输出。相当于原料送进去成品不知所踪。奇迹加工没有输入却产生了输出。相当于凭空变出数据。灰洞加工的输入不足以决定输出。相当于输入和输出之间缺少必要的信息来源。举例来说一个加工叫“生成预约确认单”输入只有“预约请求”但要输出包含“医生姓名、就诊地址”的确认单那它就是个灰洞因为“医生姓名”和“就诊地址”根本不在输入数据里。你必须在图中补充从“医生排班”存储到该加工的数据流或者明确说明加工内部需要查询的数据来源。4.3 坑三数据流命名随手写“信息”“数据文件”数据流的命名质量基本可以反映一个分析师对业务的理解深度。如果一个项目里数据流名字大面积是“患者信息”“订单信息”“数据信息”那这个DFD基本只能用来挂墙。为什么这么说“患者信息”四个字表达不了范围是患者基本信息还是患者挂号历史还是患者费用明细开发看到这条数据流之后根本不知道传输内容的边界是什么。我自己的做法参考给数据流命名时试着在名字后面补一个“包含XX、XX”的括号说明必须能说出一两个具体字段。比如“预约请求含患者ID、科室编码、期望日期、时段编号”。括号内容不一定要写进图里但命名阶段必须想清楚才能在数据字典里写得更精确。4.4 坑四同一张图里加工粒度忽粗忽细有的图里一个加工写“处理订单”旁边另一个加工写“解析用户上传的Excel文件并逐行校验身份证格式”。这两个加工出现在同一层就会让读者极度分裂前者一个人干一大包活后者已经细到了具体动作。这种粒度混乱会直接影响后续的工作量评估。开发看到“处理订单”会下意识认为这是一个完整模块看到“解析Excel文件”又觉得这是单点功能两者的估算方式根本不同。解决办法是定一个“同一层最小粒度原则”在一张DFD图里所有加工应该处于相同的抽象级别。如果“处理订单”真的很大就把它继续拆成0层之下的子层而不是和细分动作平级摆放。4.5 坑五把数据存储直接画成物理数据库表DFD里的数据存储是“逻辑数据集合”不是具体的表结构。有人习惯把存储画成“user_table”“order_records”还标上主键外键这就把DFD的层次拉到了物理设计反而混淆了分析阶段的目标。比如“预约记录”这个存储在逻辑层它是一个集合里面包含预约相关的数据。到了物理设计阶段可能是三张表由ER图负责建模。分析阶段过早讨论主键、索引、分表会把业务评审拖进技术细节让双方都无法聚焦在“数据该怎么加工”上。提示如果评审时有人不断纠结某存储的字段结构先别急着改图。把诉求记下来标记到数据字典和ER图的规划里不要打乱DFD的分析节奏。5. 多人协作时DFD怎么管才不变成“一次性文档”现实项目很少有一个人独立画完所有DFD。中型系统的DFD往往是多个分析师分工绘制的这时候最怕的就是每个人画风不同、口径不一合图时一地鸡毛。5.1 按加工模块拆分任务包而不是按业务部门拆我参与过的项目里最高效的做法是按0层图加工为边界把每个加工及其子图分给不同的分析师。这样做的原因是加工是数据变换的单元子图内部数据内聚性高分包后跨包的数据流最少。如果有人按“门诊部需求”“财务部需求”来拆最后一定出问题。因为业务部门之间的数据交互非常多拆出去以后两边的图都要跨到对方领域合图时会产生大量重复和遗漏。每个分析师一般只承担一到两个加工包同时承诺该包的输入输出数据流与父图一致。包与包之间只通过已约定的数据流和共享数据存储发生关系。5.2 用“接口清单”做包间契约分包之后包与包之间的数据流就是双方之间的交付契约。我会让每个分析师维护一份包级接口清单上面写清楚包名对外数据流方向内容说明依赖存储预约处理包预约占号结果输出给接诊处理包含预约记录ID、号源占用状态、科室、医生、日期时段号源表、预约记录表缴费处理包支付回调结果输入自支付平台含交易号、金额、支付状态、时间戳缴费记录表这份清单的效果是哪怕两个分析师的图画风不同只要接口定义一致合并时就能对得上。反过来如果接口对不上就说明两边的需求理解存在分歧需要尽早拉通而不是等到最终评审。5.3 建立数据字典让每个名字只有一种解释DFD的图是骨架数据字典就是血肉。我在项目里会建一个简单的共享数据字典长期维护。对每个数据流、数据存储、加工至少登记这些字段名称与别名定义说明数据组成结构来源与去向业务量级如高峰笔数、峰值频率备注与关联需求条目我通常在Wiki或在线文档里建一张大表用“数据流名称”作为主键这样任何人补图时都必须先去字典里查名字是否已存在。以“预约请求”为例数据字典条目长这样{ 名称: 预约请求, 别名: 挂号申请, 来源: 患者外部实体, 去向: 预约处理加工1.1, 组成结构: 患者ID 科室编码 医生工号 就诊日期 时段编号, 流通量: 高峰约300笔/小时, 说明: 患者在移动端或自助机提交的预约申请必须校验号源, }有了这个开发设计接口时可以直接把“组成结构”段落映射为接口字段清单几乎无缝衔接。5.4 工具选型从白板到协作建模工具DFD对工具要求不高关键看团队何时需要协作。我依次用过白板手机拍照适合需求访谈现场快速捕捉脉络。专业绘图软件画工整的汇报图没问题但是多人实时协作弱适合定稿。在线协作绘图工具适合跨角色评审、实时批注我目前的主力选择。专业建模工具适合大型项目做数据库联动、代码生成但对大部分需求分析阶段的工作来说偏重学习成本高。我的建议是团队先用在线协作工具把DFD跑起来等到团队形成了统一的符号规范和评审流程后再评估是否需要引入更重的建模平台。工具本身不会让你学会拆分解道理是一样的。5.5 版本管理与变更影响分析DFD一旦进入基线后续每次变更都要走影响分析。我在实际操作中遇到需求变更时会先问三个问题这个变更影响哪条数据流是新增还是修改哪个加工的内部逻辑要响应变化哪个数据存储的结构需要更新连带哪些数据字典条目要改把这三个问题映射到DFD图上就能把变更影响范围可视化而不是只靠“感觉好像影响不大”来判断。有一次需求方说要增加一个“候补预约”功能。刚听到时大家都觉得很小但我在图上一查“预约处理”下面所有数据流都连到“号源表”候补的逻辑本质是新增一种号源占用状态牵涉到的子图和存储远比想象多。用图做影响分析这点是最直观的收益。6. 从DFD到开发落地的“最后一公里”它和用例图、ER图、流程图怎么配合DFD很少单独使用。一个完整的系统分析成果需要DFD与用例图、ER图、流程图互相校准。如果你只画DFD就交差开发那边大概率还会来追问一堆设计细节如果你完全不画DFD用例图和流程图又没有足够的数据流转信息。几种模型各有侧重配合起来才是完整的。6.1 DFD与用例图外看目标内看加工用例图回答的是“用户在这个系统里能达成什么目标”它停留在系统边界的外侧视角。DFD则把系统边界内部打开告诉你达成这个目标时数据是怎么被一步步加工的。业务分析过程中我通常先用用例图建立功能全貌再按核心用例去查对应的DFD子图。如果发现某个用例在DFD里找不到对应的数据流那要么用例多余要么分析漏了一条业务路径需要回头补查。6.2 DFD与ER图存储只画名词结构交给ER图DFD里数据存储的作用是标记“这里有数据停留”但它不负责讲清楚里面到底是什么结构。这就是ER图的职责。举个例子DFD里只画一个“预约记录”存储旁边连几条数据流就够了ER图则要定义预约记录里有预约号、患者ID、号源ID、状态、创建时间等字段以及它们与患者、号源之间的外键关系。注意一个常见问题有人画DFD时习惯把ER图的结构带入给每个存储都画上属性字段。这样做会严重拖慢分析节奏让业务方陷入字段级讨论。分层是不同视角做的事不该混在一张图里。6.3 DFD与流程图数据视角与控制视角的差异流程图描述控制流强调“先做什么、后做什么、条件分支怎么走”DFD描述数据流强调“什么数据在流动、谁加工、存在哪、输出给谁”。两者各有价值。但很多需求团队容易只画流程图而且画得越细越觉得业务清晰。实际上流程图无法解答一个关键问题加工处理所需的所有数据是否齐备。这可能只有DFD能帮你发现。好的实践是业务流程图用来确认业务顺序和分支规则DFD用来确认数据供给链路。流程上发现新的数据需求就回头补DFDDFD里发现某个加工的条件分支很复杂就补充判定表或流程图说明。6.4 一套推荐的分析顺序供实际项目参考如果让我搭建一个新项目的分析流程我会按这个顺序推访谈业务画顶层情境图明确系统边界和外部实体。用用例图整理功能性需求和顶层图的外部交互相互印证。画0层DFD把主要加工拆分出来对应核心业务域。对每个核心用例场景细化到1层DFD确认数据流、存储、加工逻辑。同步维护数据字典用加工说明文档写清楚每种输入输出。最后才根据需要补充ER图、状态图等设计层面模型。这一整套顺序的核心思路是从宏观边界到内部逻辑一层一层向下钻取。每个阶段都有明确的交付物和检查动作不会出现画到一半发现边界变了、加工拆不下去的尴尬。我自己经历过的典型反面案例是新同事接到需求后直接新建一个在线协作画板开始画数据表结构还配了很完整的字段约束结果被业务方连续质疑两轮后发现最底层的业务目标还没对齐。先把DFD做到位再向下延伸浪费的时间反而最少。写在最后的一点使用习惯关于DFD我一贯的看法是它不需要被人为拔高但也不该被边缘化。相比那些花哨的项目管理平台或炫酷的原型工具数据流图最大的价值是它足够简单简单到能让所有角色在十分钟内读懂系统骨架。也恰恰因为简单人们容易低估它画两笔就丢到一边最后在需求评审和开发排期时吞下苦果。我个人的习惯是每次启动新项目的系统分析第一周一定会强制自己先画一版顶层情境图哪怕需求还很模糊。这张图不需要完美它的作用是逼我先回答“这个系统的边界到底在哪里”。有了边界后面的加工分解、数据字典、接口设计才有立足点。如果你也正在为某个说不清道不明的系统做分析不妨从一张只有系统圈和外部实体的图开始你会发现很多之前纠缠不清的模糊地带在画图的过程中自动就显形了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑