ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据流图画法全解:从上下文图到分层细化与平衡规则

数据流图画法全解:从上下文图到分层细化与平衡规则 从一张图画到一套图说说数据流图到底怎么画数据流图Data Flow DiagramDFD可能是你在软件工程课、系统分析师考试、或者产品需求评审会上听得最多的词之一。但真到了自己要动手画的时候很多人就卡住了不知道从哪开始分解、不知道边界划在哪、画完也不知道对不对。我在做系统分析、写需求文档、甚至帮团队梳理业务流程的过程中前前后后画过几十套数据流图踩过不少坑也总结出一些能直接上手的套路。这篇文章我就把这套方法完整捋一遍从最基础的四个符号讲到多层分解再到实际案例和排查技巧争取让你看完就能照着画。本文会覆盖数据流图的完整画法流程包括基本元素、分层策略、上下文图的设计、子图的分解规则以及“查询修改”这类典型加工在图中怎么表达。适合正在学软件工程的学生、准备系统分析师考试的人以及工作中需要梳理业务流程的产品经理和研发人员。1. 画数据流图之前先把四个基本符号刻进脑子里1.1 四大元素外部实体、加工、数据流、数据存储任何一种数据流图不管它分了多少层、画得有多复杂归根到底都只有四样东西外部实体、加工、数据流、数据存储。这四个概念是整套分析语言的基石先彻底理解它们后边的分层和分解才有意义。外部实体用矩形或方框表示它是系统之外的人和事物是数据的来源或去向。比如银行系统里的“客户”、电商系统里的“供应商”、教务系统里的“教师”这些都是外部实体。它们有一个鲜明特征不在系统内部不受系统控制但和系统之间有数据的交换。加工也叫处理、过程用圆角矩形或圆圈表示是系统对数据做的操作比如“验证密码”“计算运费”“生成订单”。每个加工都有一个编号后边我会详细讲编号规则。加工意味着数据的变换进去的数据和出来的数据在语义上发生了变化。数据流用箭头表示是数据在系统内流动的通道。这里特别强调一点数据流里流的是数据不是控制信号也不是实物。有些新手经常把“点击按钮”这种操作画成数据流这就混淆了控制流和数据流的界限。数据流就是实实在在的数据包比如“用户信息”“订单记录”“查询条件”。数据存储用开口矩形或两根平行线表示是数据静止停留的地方比如数据库表、文件、缓存。数据存储一定是有名字的而且名字通常是一个名词比如“学生档案”“库存台账”。这四类元素之间的连接关系也有讲究外部实体只能与加工相连不能直接连到数据存储数据流必须一端连着加工数据存储也必须通过数据流和加工打交道。这套约束保证了图的结构合法也逼着你在建模时想清楚每一个数据的流向。1.2 符号规范不同流派怎么选数据流图的符号体系在市面上有好几个版本最经典的有两套一套是Yourdon/DeMarco标记法加工用圆圈数据存储用开口矩形另一套是Gane/Sarson标记法加工用圆角矩形数据存储用矩形。国内高校教材和软考系统分析师考试通常采用Yourdon/DeMarco风格也就是加工画圆圈、数据流画箭头、数据存储画双杠线或开口矩形。我的建议是如果你是要应对考试严格按教材或考纲给的符号来如果你是工作中自用选择团队统一约定的一套即可关键是一致性。符号本身不复杂真正考验人的是后边的分层思维。顺便说一句现在很多人用Visio、draw.io或ProcessOn画图这些工具里内置了DFD模板。但模板只是省了你画图形的功夫布局和逻辑还得自己想清楚。2. 数据流图的分层策略从上下文图到底层图2.1 为什么必须分层我最早画数据流图的时候犯过一个典型错误想把整个系统的所有细节塞进一张图里。结果画到一半自己都看不下去了箭头交叉、文字重叠连检查对错都无从下手。后来才明白数据流图的精髓不是“一张图画全”而是“一套图讲清”。分层的基本思路是自顶向下逐层细化。第一层叫上下文图也叫顶层图它把整个系统看成一个加工只画外部实体和它们与系统之间的数据流。这一层回答的问题是系统跟外界之间到底交换了什么数据第二层叫0层图把顶层图中那个大加工拆成若干主要加工画出它们之间的数据流和数据存储。第三层及以下叫子图对0层图中的某个加工继续细分直到每个加工的逻辑足够简单、不再需要拆分为止。这套分层结构最大的好处是不同角色可以只看自己关心的层次。项目干系人看上下文图就够了知道系统边界在哪里分析师和开发人员看0层图和子图理解具体的加工逻辑。每一层各有侧重互不干扰。2.2 上下文图画系统边界的第一步上下文图是整个数据流图体系的入口也经常被称作“系统上下文图”。它只有一个加工这个加工就是你要描述的那个系统整体。图上的内容就是系统与外部实体之间的所有数据流。画上下文图的时候最重要的事情是定义系统边界。边界划在哪里决定了哪些东西算“系统内部”哪些算“外部实体”。举个例子如果我们要画一个图书借阅查询系统的数据流图系统边界之内包括查询处理、借阅记录维护这些功能那么“读者”和“图书管理员”就是外部实体。而如果系统范围扩大到包含图书采购、库存盘点那供应商也可能成为外部实体。边界划错了后边全盘皆错。一个实用的判断方法是凡是系统能直接控制和处理的对象都算系统内部凡是系统之外、但需要交互的人或组织都算外部实体。把系统看成一个“黑盒”只关注它和外界的数据往来这就是上下文图的全部内容。2.3 0层图和子图的分解规则有了上下文图下一步就是把它细化成0层图。操作方法是把上下文图中那个唯一的加工拆成多个主要加工这些加工对应系统的主要功能模块。然后逐个分析每个功能模块需要哪些输入数据、产生哪些输出数据、需要访问哪些数据存储。0层图拆完之后如果某个加工仍然很复杂就继续往下拆出子图。子图的分解方法和0层图一样只是范围缩小到单个加工。这里有一个重要的原则每个子图都必须严格对应父图中某一个加工不能凭空多出来也不能缺少。以我们图书系统为例上下文图里的“图书借阅查询系统”可以拆成“借阅登记”“归还处理”“图书查询”“读者信息管理”等几个加工。如果你觉得“图书查询”还包含“按书名查”“按作者查”“按分类查”等细节就可以针对“图书查询”单独画一张子图。分解到哪一层算完没有一个绝对的标准但有一个经验法则当某个加工的描述只需一两句话就能说清楚、不需要再拆分时就到叶子层了。比如“打印借阅清单”这种加工一般不需要再往下拆。2.4 平衡规则父图与子图的守恒原则分层图的正确性有一条核心规则叫“平衡规则”也可以叫“守恒规则”父图中某个加工的所有输入数据流和输出数据流必须在它对应的子图中原封不动地出现。简单说子图是父图加工的放大镜边界上的数据流必须一一对应。我见过很多人在这一步出问题。加工在父图中有三根输入数据流和两根输出数据流到了子图里一不小心少画了一根或者把某根数据流的名字改了。这种错误非常隐蔽因为孤立地看某一张子图局部逻辑可能是通顺的。但如果把整套图连起来检查就会发现数据源头对不上系统的数据流向就断了。平衡规则的检查是数据流图质量把关里最机械但也最重要的一步。每次画完一套图我都建议逐对检查父子图的数据流拿一张草稿纸左边列父图数据流右边列子图数据流逐个打勾对比。这个过程枯燥但非常值得。3. 完整实操示范以“图书借阅查询系统”为例3.1 第一步划定范围画出上下文图理论知识说了一堆我们来走一遍真实案例。假设要为“图书借阅查询系统”画一套数据流图先确定系统边界。这个系统的核心职责包括受理读者的查询请求、维护图书信息和借阅记录。基于此外部实体至少有两个读者和图书管理员可能还有一个“图书采购员”为了保持示例简洁我们先不引入过多实体。上下文图画出来是这样的中间一个圆圈标明“图书借阅查询系统”读者和图书管理员分别画在两侧读者和系统之间有“查询条件”“查询结果”两条数据流管理员和系统之间有“图书信息更新”“借阅记录维护”两条数据流。整个上下文图一共一个加工、两个外部实体、四条数据流信息量不大但系统边界一目了然。画这一步时我习惯顺手写一个实体词典和数据流词典。实体词典记录每个外部实体的含义、与系统的交互方式数据流词典记录每条数据流包含的数据项。这些词典在后续分解时是重要的参考依据能避免画着画着忘了某条数据流存在的初衷。3.2 第二步分解成0层图确定主要加工上下文图画好后继续把它放大成0层图。我们把这个“图书借阅查询系统”拆成三个主要加工图书信息管理、借阅登记处理、读者查询服务。三个加工各有分工又互相依赖。图书信息管理负责接收管理员录入的新书信息、修改图书状态并把数据写入“图书信息表”这个数据存储。借阅登记处理负责在读者借书时读取图书信息表校验可借状态再写入“借阅记录表”。读者查询服务负责接收读者的查询条件从图书信息表和借阅记录表中检索数据生成查询结果返回给读者。0层图里除了三个加工和两个外部实体还出现了两个数据存储图书信息表、借阅记录表。数据存储的出现说明系统内部需要持久化数据这也让图真正从“黑盒”走向了“灰盒”。下一步如果某个加工还需要继续拆分就针对它单独画子图。3.3 第三步细化子图处理“查询修改”数据流0层图里“读者查询服务”这个加工表面上看起来简单但如果查询逻辑复杂比如支持组合条件、支持模糊匹配、需要和借阅记录联动就值得单独画一张子图来细化。这就是热词里提到的“查询修改数据流图”的典型应用场景。子图里“读者查询服务”被细化成三个加工接收查询条件、检索图书信息、生成查询结果。读者发来的“查询条件”数据流进入到“接收查询条件”加工经过格式校验后变成“标准查询参数”然后“检索图书信息”读取图书信息表和借阅记录表执行匹配最后“生成查询结果”把命中的图书列表加上可借状态一起返回给读者。你可能注意到这张子图里“接收查询条件”这个加工实际上也承担了“修改”的一部分职责比如读者可以修改自己的查询条件重新发起查询。这在图中表现为一条从外部实体读者出发、不断更新的查询条件数据流而不是多个混乱命名的数据流。数据流图对“修改”的处理原则是修改也是数据输入的一种不单独发明符号来表示。画这张子图时还有一个容易忽略的点数据流上的名字要具体不能笼统地叫“数据”。读者发来的是“查询条件”返回的是“查询结果”这些名字本身就是对数据内容和语义的说明。我在实际项目中要求团队给每条数据流起名时至少要能回答“这条流里装的是什么”这个方法很笨但很有效。3.4 第四步检查命名、编号和平衡整套图画完之后进入检查环节。我一般按三个层次过一遍命名检查、编号检查、平衡检查。命名检查看的是每条数据流、每个加工、每个数据存储的名字是否清晰。加工的名称通常是一个动宾短语比如“检索图书信息”数据存储的名称是名词比如“借阅记录表”。如果一张图里出现了“数据1”“数据2”这种名字基本可以判断命名没过关。编号检查看的是加工的编号体系。上下文图里的加工不编号或者编号为00层图的加工编号为1、2、31层子图的加工编号为1.1、1.2、2.1、2.2以此类推。这套编号规则让每一张图都能定位到它在整套图中的位置也方便不同图之间跳转检查。平衡检查这块我已经在上文详细讲过了这里再给一个操作清单找一张草稿纸左侧写父图加工的所有输入数据流右侧写对应子图的所有输入数据流逐条对比输出数据流同样操作确认子图中出现的数据存储是否在父图中已有体现或者属于该加工的局部存储。这一步花不了多少时间但能帮你拦下大量低级错误。4. 常见错误与排查技巧实录4.1 数据流永远要有名字而且名字要具体画数据流图最常见的问题之一是数据流没有命名。很多人随手画个箭头就完事箭头旁边不写任何文字。这个错误看起来很小实际上影响很大数据流名字是连接图的逻辑和现实需求的关键没有名字读图的人只能靠猜。我建议每个数据流都用名词短语来命名而且要让名字能说明“这条流里有什么数据”。比如“图书信息”就比“数据”好“已审核的订单”就比“订单”更精确。如果一条数据流包含多个数据项可以在数据词典里展开但图上至少要有一个概括性的名字。命名还有个隐藏好处强制你思考这条数据流是否存在合理的语义。如果起不出名字大概率这条数据流根本不应该存在。4.2 控制流不是数据流别混着画另一个高频错误是分不清数据流和控制流。数据流图只描述数据的流动和处理不描述操作顺序、按钮点击、页面跳转这些控制行为。比如“用户点击查询按钮”是控制流不应该出现在数据流图里而“查询条件”作为数据、被传送到“查询加工”处理这才是数据流。判断数据流和控制流有一个简单方法看流上的内容能不能被保存、传递和处理。能被加工、存储、计算的是数据流只是触发一个操作的信号是控制流。把控制流混进数据流图会让图变得又脏又乱而且会给后边的需求分析和设计带来误导。如果你发现一张图里出现“开始”“结束”“点击”“跳转”这种词大概率已经混进了控制流的成分需要及时清理。4.3 子图缺失、加工编号混乱的排查方法分层图最常见的问题就是子图不完整和编号混乱。子图不完整的典型表现是父图的某个加工明显很复杂但你没有为它画子图导致整套图的细化程度参差不齐。编号混乱的典型表现是0层图的加工编号出现1、3、4缺了2或者子图的编号是1.1、1.3缺了1.2。排查方法其实很机械。先整理出一张“图目录”里面列出整套图包含哪些图、每张图的名称和层级。然后从上下文图开始逐个加工核对是否都有子图除非它已经是叶子加工。最后再检查编号连续性。这个方法不需要灵感只需要耐心但能把绝大多数结构性问题暴露出来。4.4 父图与子图数据流不一致的典型案例我亲历过一个案例一位同事画的订单处理子图里多了一条从“库存系统”读取数据的输入流但父图“订单处理”加工的输入数据流里根本没有这条流。表面上看子图内部逻辑挺合理订单处理确实需要扣减库存。但正是这个“看似合理”的多余数据流暴露了需求描述和系统边界的不一致。后来我们对照需求文档复盘发现实际上是父图画漏了订单处理确实应该依赖库存信息。于是我们修正了父图在父图的“订单处理”加工上加了一条输入数据流同时在上下文图的顶层数据流中也做了相应调整。这轮排查给整个团队上了一课平衡规则不仅是为了形式正确更是为了倒逼分析人员把需求想完整。5. 画数据流图时的几条实操心得5.1 先写数据词典再画图很多人的习惯是直接开画画到哪想到哪。我自己的经验是画图之前先花20分钟列出数据词典效果会好得多。数据词典记录每条数据流的名称、组成、来源和去向。比如“查询条件”这条数据流包含“书名”“作者”“分类号”三个数据项“查询结果”包含“图书编号”“书名”“可借状态”等多个数据项。为什么先写数据词典这么有用因为数据流图本质上是一个网络结构而数据词典规定了网络上每条边的载荷。先把载荷定义清楚图的走向自然就清晰了。相反如果图先画了再来补数据词典很容易发现某条数据流根本说不清里面是什么数据最后只能返工改图。先词典后图形顺序对了效率翻倍。5.2 一图一意别贪多数据流图的表达力很强但也很容易被人为塞入过多信息。我在评审中见过有人把数据库表结构、接口调用关系、业务规则备注全部堆在一张数据流图里结果图变成了一个大杂烩。数据流图的职责是描述数据流向和处理逻辑不是画ER图也不是画系统架构图。好的数据流图应该做到每个加工都只做一件明确的事每条数据流的语义都清楚整张图在一个层级上尽量简洁。如果你觉得某个加工内部细节很多正确的做法是再画一张子图而不是在原来的图上继续堆元素。分层、分图、分主题这是数据流图的核心美学。5.3 工具选择建议画数据流图的工具我尝试过不少从Visio、draw.io到ProcessOn、亿图各有优劣。Visio功能全面但价格较高、绘图体验略重draw.io免费开源、支持网页版和本地部署是我目前的主力工具ProcessOn在线协作方便适合团队评审场景。不管用哪个工具我都建议把图层结构建清楚。把上下文图放一页0层图放一页每个子图单独一页命名统一带上图名和层级编号。这样导出的PDF或图片集合就是一套完整的数据流图文档直接可以放进需求规格说明书里。绘图过程要多久以我经验一套中等规模的系统从上下文图到最底层子图大约需要半天到一天时间。第一次画会慢一些多用几次就能形成肌肉记忆。数据流图的画法看起来简单真正掌握它需要几次完整的实操。希望这篇文章能帮你理清思路少踩我之前踩过的坑。
返回列表