
简介这是一份《图书馆管理系统数据流图》PDF文档面向系统分析与设计课程设计、软考或毕业设计人群可用于学习数据流图DFD的分层绘制与配套文档编写。内容以典型的图书馆管理系统LMS为实例依次介绍系统目标、组织结构与业务流程重点展开0层、1层、2层数据流图覆盖图书采编、图书借阅、图书查询、图书预订、读者留言、图书维护、读者管理及电子图书等子系统并给出各层数据流与数据存储的对应关系。此外文档还详细列出了数据流描述与数据字典包含数据流编号、名称、来源、去向、组成及流量等要素可作为课程报告或考试复习的参考模板。压缩包内共有1个PDF文件大小1.1MB无多余附件便于直接阅读、打印或归档。目前已有8276人学习下载适合需要快速理解图书馆管理系统数据流程、掌握DFD规范表达与数据字典编写要点的读者。1. 数据流图不是画出来的而是问出来的接手任何一个图书馆管理系统的文档任务第一件事往往不是打开画图工具而是先回答四个问题数据从哪来、经过谁处理、存在哪里、最终到哪去。数据流图Data Flow DiagramDFD解决的就是这个问题——它不关心系统用什么语言实现、数据库是 MySQL 还是 PostgreSQL它只描述数据在系统中的流动路径和处理逻辑。相比用例图强调“谁能用系统做什么”DFD 强调的是“一条数据从进入系统到离开系统中间经历了哪些加工和存储”。这套表达方式在需求分析阶段特别有用因为业务人员能看懂开发人员能对着它建模测试人员能从中提取出可验证的输入输出路径。对刚接触系统设计的初中级工程师来说画好一张图书馆管理系统的 DFD基本等同于把整个系统的业务边界、模块划分和数据流转摸了一遍对五年以上的从业者价值则体现在评审文档时能快速识别出“数据流断头”“加工无输入”这类隐蔽缺陷。2. 图书馆管理系统数据流图的四个要素为什么不能省2.1 外部实体、加工、数据存储与数据流的边界画图书馆管理系统数据流图前先要把四个基本要素的符号和语义钉死否则后面分层时一定会乱。常见做法是用 Yourdon/DeMarco 标记法外部实体用矩形框加工用圆角矩形或圆圈数据存储用开口矩形或两条平行线数据流用带箭头的直线。四者的关系是数据流只能由外部实体发出或接收加工可以同时收数据流和发数据流数据存储只能被动地被加工读写不能直接和外部实体打交道。要素符号在图书馆管理系统中的例子外部实体矩形框读者、图书管理员、图书供应商、逾期通知系统加工圆角矩形/圆圈图书借出处理、归还校验、书目查询、逾期罚款计算数据存储开口矩形读者信息表、图书库存表、借阅记录表、罚款记录表数据流带箭头实线借书请求、图书状态变更、罚款金额、逾期天数这里有一个经常被忽略的细节数据流上标注的名称必须是名词性的业务数据不能是动词或命令。比如“借书”就不是合格的数据流名因为它描述的是动作正确写法是“借书请求”或“借阅单”因为流动的是一个业务对象。同理加工名称必须是“动词宾语”结构比如“校验读者权限”“更新图书库存”这样读图的人才能从加工名直接看出这段处理完成什么职责。2.2 命名为什么决定了整张图的水平命名不只是为了整洁它直接决定 DFD 能不能用于后续的数据库设计和接口定义。我见过很多图书馆管理系统 DFD 里出现“数据”“信息”“内容”这类无法落地的泛化名称这种图的最终归宿只能是评审会上被业务方反复追问然后推倒重画。正确做法是让数据流名和数据字典一一对应如果数据流叫“读者借阅记录”那么数据字典里就必须有同名字段集合定义包含读者编号、图书编号、借出日期、应还日期、实还日期这五个字段。会画图的人图上的每个名字都能在数据字典里找到定义不会画的人名字只是为了把线连起来。2.3 先定边界再画图边界错误是最大的返工来源图书馆管理系统的边界在哪里决定了外部实体画谁、不画谁。常见的错误是把“图书供应商”画进了系统内部或者反过来把“自助借还机”当成系统的一部分。判断标准只有一个这个对象是否由本系统控制其内部行为。自助借还机如果只是读写借阅记录的终端设备它就是外部实体如果它的嵌入式控制逻辑也需要一并开发那它内部的“条码识别”“读者证校验”才需要被分解成加工。画系统边界时我一般会先用一句话描述系统职责“本系统负责处理读者借阅、归还、续借、预约以及图书库存管理业务不负责图书采购审批和财务结算。”这句话里没提到的角色全部列为外部实体。3. 从上下文图开始逐层分解图书馆数据流3.1 上下文数据流图一个加工代表整个系统上下文数据流图的分解是整套 DFD 方法的入口它的规则极其简单整张图里只有一个加工代表整个图书馆管理系统外部实体画在加工四周数据流标注清楚系统与外界交换的每一个业务数据。经验不足的人画到这里往往觉得“太简单了没什么用”但实际上这张图定的是项目范围——凡是图上没出现的数据流都不在本系统处理范围内。图书馆管理系统的上下文图通常有四个外部实体读者、图书管理员、图书供应商和财务系统。读者发来的数据流有“借书请求”“还书请求”“续借请求”“预约请求”系统返回的有“借阅结果”“逾期通知”“预约到书通知”图书管理员发来的有“图书入库单”“读者信息维护请求”系统返回“操作结果”。3.1.1 上下文图的数据流是后续所有分解的根这里要特别强调上下文图上的每条数据流在下一层分解时必须被完整地承接不能凭空消失。“借书请求”到了 0 层图里要么由“借书处理”这个加工直接接收要么先经过“读者身份验证”再流转到“借书处理”但无论如何它必须出现在某个加工或存储的输入输出中。这是 DFD 分层一致性检查的基本要求。3.2 第 0 层图按业务拆成借阅、还书、查询修改、图书维护四个加工第 0 层图把上下文图中那个唯一的加工拆成 4-7 个主要业务加工每个加工对应系统的一项核心业务能力。图书馆管理系统拆成四个最合适图书借出处理、图书归还处理、书目查询与修改、图书与读者信息维护。需要注意这层图上的数据存储开始出现比如“读者信息”“图书目录”“借阅记录”“罚款记录”。数据流箭头不仅要连接外部实体和加工还要连接加工和存储比如“图书借出处理”会向“借阅记录”这个存储写入一条新记录通过带箭头的线指向存储即可。3.2.1 第 0 层图的数据流守恒检查上一层上下文图有“逾期通知”这条从系统到读者的数据流在第 0 层图里就必须至少有一个加工能产生这条数据流。通常做法是在“图书归还处理”中拆出“逾期判断”加工完成后输出“逾期天数和罚款金额”再转换为“逾期通知”发给读者。这是最常见的分解遗漏点——上层图有一对数据流下层图只画了进来的没画出出去的。3.3 第 1 层图继续拆直到每个加工只做一件事第 1 层图开始是真正考验功力的地方因为拆分到这个深度时每个加工都需要明确它接受哪些输入、产出哪些输出、访问哪些存储、涉及哪些规则。以“图书借出处理”为例可以继续拆成“读者身份校验”“借阅额度检查”“图书状态检查”“生成借阅记录”四个加工。“读者身份校验”读取“读者信息”存储如果读者证状态是挂失或注销直接输出“借阅失败”“借阅额度检查”读取“借阅记录”存储统计当前未还图书数量是否达到上限。拆到这里单个加工的逻辑已经足够清晰可以直接对着写代码了。3.3.1 分解到什么程度该停一个判断标准当这个加工只需要一个简单的决策就能描述它的逻辑时就不用再拆了。比如“生成借阅记录”只做插入操作不需要条件分支它就是叶子加工。如果一个加工既要做校验又要做计算还要做通知说明它还不够小继续拆。上下文数据流图的分解有一个经验法则同一张图上加工数量不超过 7 个超过就考虑拆成两层子图。这个原则最早来源于 Miller 的 7±2 记忆理论放在现在依然有效因为人眼在追踪一条数据流路径时过多的节点会显著增加认知负载。4. 图书馆管理系统的查询修改与借阅流一步步画出核心 DFD4.1 查询修改数据流图读者查询与管理员修改“查询修改”在数据流图中是一组典型的双向数据流也是图书馆管理系统里频率最高的操作。读者查询业务流程如下读者作为外部实体发出“查询请求”数据流交给“检索图书”加工“检索图书”加工从“图书目录”存储读取书目信息执行匹配逻辑然后输出“图书列表”数据流返回给读者读者选中某一本后发出“图书详情请求”经“查询图书详情”加工读取“图书状态”存储返回“馆藏信息”其中包含可借数量、馆藏位置和当前状态。这条路径上要特别注意两个数据流“图书列表”和“馆藏信息”的区别前者是书目级数据后者是副本级数据。管理员修改操作则走另一条链路管理员发出“新增图书请求”或“修改图书信息请求”数据流进入“图书信息维护”加工该加工先读取“图书目录”存储验证 ISBN 是否存在再执行新增或更新操作最后返回“操作结果”和管理员确认。修改操作的 DFD 里经常忽略一条“操作日志”数据流实际系统要求每次修改都要记录操作者、时间、修改前后值所以在“图书信息维护”加工和“日志记录”存储之间要画出“写入日志”数据流。4.2 借书与还书的数据流转借书流程是图书馆系统 DFD 中最能体现分层价值的环节。读者发出“借书请求”后数据流进入“借书处理”加工这个加工同时读取“读者信息”存储判断状态是否正常、“借阅记录”存储判断是否超量和“图书目录”存储判断图书状态是否为在架。三个存储的数据汇入加工后加工执行校验逻辑若全部通过则同时向“借阅记录”写入新增记录、向“图书目录”更新图书状态为已借出。同一条数据流路径上需要一进一出两个箭头这在 DFD 里是合法的因为加工既读取又更新存储。还书流程是一条同样复杂但方向相反的链路。读者发出“还书请求”进入“还书处理”加工加工读取“借阅记录”核对是否确实由该读者借出再对比系统当前日期和应还日期判断是否逾期。若逾期则计算罚款金额生成“罚款单”数据流传给读者同时向“罚款记录”存储写入一条欠款记录。这里需要注意一个 DFD 陷阱一个加工只能有一组输入输出逻辑逾期判断和普通还书应该画成两个加工还是合并成一个正确做法是合并成一个“还书处理”因为它们在真实业务中共享同一条借阅记录数据流拆开会出现“借阅记录”被两个加工同时读取的情况反而让图更乱。4.3 用 Python Graphviz 把 DFD 的 dot 代码写出来画好 DFD 之后我一般会用 Python 的 graphviz 库把图落成代码这样既能保证分层版本的一致性也方便放进 Git 里做版本管理。下面这段代码实现了第 0 层图中“读者查询”这条链路的示例对应“图书馆管理系统 python”这个搜索需求里最常被问到用法。from graphviz import Digraph dfd Digraph(library_query, formatpdf) dfd.attr(rankdirLR) # 从左到右布局符合数据流阅读习惯 # 外部实体矩形框 dfd.node(reader, 读者, shaperectangle) dfd.node(admin, 图书管理员, shaperectangle) # 加工圆角矩形 dfd.node(p1, 1. 检索图书, shapecircle) dfd.node(p2, 2. 查询图书详情, shapecircle) dfd.node(p3, 3. 图书信息维护, shapecircle) # 数据存储圆柱形 dfd.node(d1, 图书目录, shapecylinder) dfd.node(d2, 图书状态, shapecylinder) # 数据流 dfd.edge(reader, p1, 查询请求) dfd.edge(p1, d1, 检索条件) dfd.edge(d1, p1, 匹配结果) dfd.edge(p1, reader, 图书列表) dfd.edge(reader, p2, 图书详情请求) dfd.edge(p2, d2, 读取馆藏状态) dfd.edge(d2, p2, 馆藏信息) dfd.edge(p2, reader, 详细信息) dfd.edge(admin, p3, 新增/修改请求) dfd.edge(p3, d1, 写入书目) dfd.edge(d1, p3, 校验ISBN) dfd.edge(p3, admin, 操作结果) dfd.render(library_query, cleanupTrue)这段代码里的每个 edge 对应 DFD 里的一条数据流源节点和目的节点必须能和你手工画的图一一对上。render 方法会调用系统里的 dot 命令生成 PDF 文件cleanupTrue 表示只保留最终产物不保留中间文件。如果机器上没有安装 graphviz需要提前执行sudo apt install graphviz或通过 Homebrew 安装pip 安装的 graphviz 只是 Python 封装底层引擎是独立的二进制程序。4.4 数据流清单画完图之后必须补的表格图画完不等于工作结束数据流清单才是评审时用来逐条核对依据的文档。每一条数据流都要有编号、名称、来源、去向、携带的数据字段、触发条件六列否则图上有歧义时没法定位。编号数据流名称来源去向携带字段触发条件F001借书请求读者借书处理读者证号、图书条形码读者提交借书申请F009馆藏信息图书状态存储查询图书详情加工ISBN、馆藏位置、副本数、在架数读者查看图书详情F014罚款单还书处理读者借阅记录ID、逾期天数、金额还书时检测到逾期5. 把图书馆系统 DFD 导出为 PDF工具链与输出参数5.1 用 dot 命令生成 PDF 文件数据流图画完后的交付物绝大多数情况下要落到 PDF。直接拿 drawing.io 导出 PDF 当然可以但问题在于自动布局和版本管理不容易做。用 Graphviz 的方案核心命令是 dot 布局引擎它按层级排列节点适合 DFD 这类有向图。假设你的代码文件保存为library_dfd.gv在终端里执行dot -Tpdf library_dfd.gv -o library_dfd.pdf dot -Tpng -Gdpi300 library_dfd.gv -o library_dfd.png dot -Tsvg library_dfd.gv -o library_dfd.svg第一条命令生成 PDF 矢量文件适合打印和存档第二条加了-Gdpi300参数生成高分辨率位图适合放到 Word 或 PPT 里第三条生成 SVG适合后续用脚本做二次编辑。需要注意-Gdpi只对位图格式生效对 PDF 和 SVG 没有意义因为矢量格式不依赖分辨率。如果 PDF 里的中文乱码请在代码里指定中文字体dfd.node(reader, 读者, fontnameSimHei)或dfd.attr(fontnameMicrosoft YaHei)默认字体通常不支持中文。5.2 大图分页把分层 DFD 分开导出图书馆管理系统的完整 DFD 分上下文图、0 层图、1 层图三层全部画在一张图里会密到没法看。常见做法是每个层单独一个.gv文件文件名以编号开头比如01-context.gv、02-level0.gv、03-level1-borrow.gv。导出时写一个 shell 脚本批量处理同时生成 PDF 和 PNG 两种格式for f in *.gv; do dot -Tpdf $f -o ${f%.gv}.pdf done这样每个文件对应一层图评审时先看上下文图再点开 0 层图需要深挖某条链路再看对应的 1 层图。还有一个参数值得记-Granksep1.5可以调节层间距让数据流箭头不那么挤-Gnodesep0.5调节同层节点间距。如果图里节点太多导致 PDF 横向溢出可在 .gv 文件开头加一行rankdirLR强制横向排布或者用-Gsize20,15 -Gpage20,15将大图分页输出到多页 PDF打印时再拼起来。5.3 输出前的校验把 PDF 当代码审PDF 导出完成后我会做一个简单的自动化校验用 Python 把 .gv 文件解析成文本统计每个加工的输入边数和输出边数筛选出没有输入或没有输出的问题节点。对应到 DFD 原理上没有输入的加工是“奇迹加工”数据凭空产生没有输出的加工是“黑洞加工”数据被吞掉。把它们单独列成警告清单逐项人工确认是画漏了还是真冗余。这个过程大概二十行代码比肉眼盯图高效得多。6. 用数据守恒检查完整 DFD 的 3 个实战技巧6.1 数据流守恒检查每条边都必须是“接上”的把上下文图当成一棵树的根节点0 层图是它的子节点1 层图是更细的子节点那每一层的所有输入输出集合必须和上一层的对应加工完全一致。具体操作方式是把上下文图中“借书请求”这条数据流标红然后到 0 层图里找到承接它的加工再沿着加工往下找到承接它的 1 层子图检查 1 层子图的边界上是否仍然有“借书请求”。三层都通过才算守恒。任何一层丢失都会导致该层以下的实现阶段漏掉需求。这个检查不能靠眼力我通常会把每层图的数据流全部列到表格里用 Excel 的 VLOOKUP 做匹配。6.2 命名与编号一致性图和数据字典对照抽检DFD 图上的每个加工号、每条数据流名都应该出现在数据字典里且定义完全一致。以图书馆系统的“读者”外部实体为例数据字典里必须写清楚读者证号是定长 8 位数字状态字段枚举值为“正常/挂失/注销”没有歧义。抽检方法随机选 3 个加工逐个核对输入数据流的来源是否与数据字典中的“去向”字段匹配输出数据流的目标是否与数据字典里的“来源”字段匹配。如果一张图抽查 3 个加工就发现 2 处不匹配那这张图的整体质量就有问题趁早修订到评审会上再发现问题就晚了。6.3 用“反向走读”回查整张图的完整性正向阅读 DFD 是从外部实体出发顺着箭头走到存储和出口反向走读则相反从每个数据存储出发往前追确认存储里的每条记录都有写入来源。在图书馆系统里“借阅记录”存储的输出端要能追到“图书借出处理”和“图书归还处理”输入端也一样。反向走读最容易暴露的问题是存储被某个加工读取了但没有任何写入加工说明这个存储实际上应该放在外部系统。最后一步是把所有外部实体和加工之间的交互路径理清对照上下文图确认没有越界的数据流这套检查完成之后再导 PDF交付物才是可信的。把上下文图打出来贴在工位上是所有评审技巧里最朴素也最管用的一条。本文还有配套的精品资源点击获取