ARTICLE DETAIL

资讯详情

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

图书馆管理系统业务流程图、数据流程图与ER图绘制指南

图书馆管理系统业务流程图、数据流程图与ER图绘制指南 简介一份图书馆管理系统开发设计文档面向正在进行软件工程课程设计、数据库系统实践或毕业设计的计算机相关专业学生。文档以业务流程图、数据流图和ER图为核心系统梳理了当前传统人工管理存在的检索慢、借还工作量大、统计难等问题并明确系统目标与三类管理员的功能需求。内容涵盖用户管理、书籍管理、借阅管理、读者管理等六大模块逐步展开从需求分析、功能结构图到分层数据流图、总体ER图的完整设计过程同时给出借书、还书、图书查询等业务流程细节。资源包含1个doc文档约1024KB现有3099人浏览学习。除核心图表外还整理了分类借阅天数、过期罚金等业务规则以及书籍表、借阅表、书籍类型表等数据字典字段说明可帮助读者快速理解后台数据表结构、模块调用关系和具体业务流程便于直接作为课程设计报告和系统图纸绘制的参考模板。1. 图书馆管理系统业务流程图不只画给答辩看拿到“图书馆管理系统业务流程图 数据流程图 ER图.doc”这个标题我的第一反应是又要画图了。这不是一句抱怨而是这类文档太容易翻车。图书馆管理系统是课设、毕业设计和软件工程文档里出现频率最高的题目而一个标题里恰好压着三种最容易互相矛盾的图。业务流程图回答“谁在什么条件下做什么”数据流程图回答“数据从哪个外部实体来、经过什么处理、落到哪个存储”ER图回答“系统里有哪些实体、属性和关系”。这三张图画不到一起去后面写代码、建表、写测试用例都会跟着乱。这篇笔记把从零画这三张图的顺序、参数、交付细节以及常见翻车点一次说清。正在做系统设计文档、数据库课设或者需要给客户交付设计说明的开发同学可以直接照着用。2. 业务流程图先定角色和边界再画动线2.1 先把系统边界和业务活动列清楚图书馆管理系统的业务范围非常宽从办证、借还、续借、预约到图书采购、编目、上架、盘点甚至包括座位预约和违规处罚。但在一份课程设计或中小型系统的交付文档里把所有流程都画全既没必要图也会密到没人愿意看。常见做法是只覆盖核心借还闭环读者管理、图书管理、借书、还书、续借、逾期归还。如果想做得完整一点再加预约和催还。我拿到需求后会先在一页纸上列出业务活动再标出哪些在系统边界内、哪些在边界外。“图书采购”在图书馆实体业务里真实存在但如果开发的系统不做采购入库只有“图书基本信息维护”就不要画采购流程。边界外的东西一旦画进去后面数据流程图一定对不上。列完活动后再给每个活动标上参与角色。图书馆管理系统最常见的角色是读者、图书管理员、系统管理员。预约、催还这类带时间触发的流程则是把“系统定时任务”也当成一个角色来看待。角色定清楚后续画泳道图时就不用返工。2.2 借书业务流程的最小实现借书是图书馆管理系统最核心的业务业务流程图先把它画对还书、续借、预约都能套用同一套结构。借书流程至少要包含这些节点读者出示借书卡管理员验证读者身份检查读者可借数量扫描图书检查图书状态登记借阅记录修改图书在馆状态。下面用 Mermaid 先把逻辑跑通。Mermaid 的好处是文本即图形改节点不用拖线非常适合在画正式文档图之前做草稿。最终交付 Word 时一般用 Visio 或 draw.io 重画一版并导出高清图但逻辑以这份草稿为准。flowchart TD A[读者出示借书卡] -- B{读者身份有效?} B --|否| C[提示办卡或挂失处理] B --|是| D[读取读者可借数量] D -- E{可借数量未满?} E --|否| F[提示已达借阅上限] E --|是| G[扫描图书条码] G -- H{图书状态为在馆?} H --|否| I[提示图书不可借] H --|是| J[创建借阅记录] J -- K[修改图书状态为已借出] K -- L[更新读者可借数量] L -- M[图书完成借出]这段图里 B、E、H 三个判断条件对应三条业务规则读者身份有效、未超最大借书数量、图书没有被借出或预约保留。这三条规则在后边设计表结构时会直接影响字段设计。读者表里要有“状态”字段图书表里要有“状态”字段借阅记录表里要有“状态”字段来区分当前是否有效。如果这些字段没设计业务流程图里的判断节点就是空中楼阁。补充一个容易漏掉的细节判断节点里写条件不要只写“是否通过”。比如 B 节点写“读者身份有效”不要写成“通过”。因为“通过”没有字段支撑别人看到后无法判断依据是什么。条件写得越具体ER 图里的字段设计就越容易倒推出来。2.3 泳道图怎么组织角色才不混乱上面的 Mermaid 图把所有动作画在一条线上角色混在一起。正式交付文档时一般建议换成泳道图。泳道图的做法是纵向三列读者、图书管理员、系统。每个节点放在对应角色的列里节点之间的连线代表动作的交接。这里有一个非常关键的规则不要把“系统自动判断”和“管理员人工判断”混在同一个泳道里。否则评审人分不清哪些操作是系统完成的哪些是人工完成的。逻辑上管理员只做“核验证件、扫描条码、收取费用”这些物理动作判断动作交给系统读者只做“出示借书卡、领取图书”这两个动作。绘制时可以考虑按这个布局安排读者列出示借书卡、确认借阅、领取图书管理员列核验证件、扫描条码、处理异常系统列校验读者有效性、校验可借数量、生成借阅记录、更新图书状态泳道图对读图人非常友好因为一条动线从上到下扫过去就能看出动作在哪几个角色之间交接。不过泳道图也有个缺点如果流程分支太多线会交叉得很厉害。这时建议把主流程画在中间主泳道让分支向两侧展开而不是让分支再形成闭环。约束条件是“线尽量少穿越泳道”一旦穿越超过两次就该拆图。2.4 还书、续借、预约流程的差异点还书流程与借书流程相比少了“可借数量”判断多了“是否逾期、是否产生滞纳金”判断。还书时先扫描图书条码系统找到对应的未还借阅记录计算应还日期与实际还书日期之间的差值如果逾期生成滞纳金记录并提示管理员收款最后修改图书状态为在馆恢复读者可借数量。续借流程则要判断两件事是否已经续借过图书是否被预约。已经续借过或已经被预约的图书不能续借。续借成功后借阅记录的应还日期自动延后通常按原借阅周期加 30 天计算续借次数加 1。预约流程是借书流程的前置条件读者发起预约后图书状态变为“预约保留”当前借阅人还书时系统不执行普通入库动作而是直接通知预约读者来取书。如果预约读者超过保留期未取再转为在馆状态。这三条分支流程不一定要各自画成一张大图可以在文档里用一张主流程图加说明文字表达但借书、还书这两张主流程图必须单独画。答辩时最常被问到的就是这两个场景借书时读者已借满怎么办还书时逾期费用怎么算。图里只要有答案人就不会慌。3. 数据流程图不是业务流程图的翻版3.1 DFD 和业务流程图的区别在哪里数据流程图在答辩中最容易暴露问题因为它看起来和业务流程图很像但本质完全不同。业务流程图画的是角色动作的时间顺序DFD 画的是数据的流动、加工与存储。一张图里关注“谁做了哪一步”另一张图里关注“什么数据在什么节点上被检查、写入、修改”。可以从这几个维度对比维度业务流程图数据流程图DFD核心关注点角色动作顺序数据流动与加工主要元素活动节点、判断分支外部实体、处理、数据存储、数据流是否出现角色是且用泳道区分只出现在外部实体上“扫条码”这个动作画成人工动作不出现只出现“读取图书条码数据”这一数据流“管理员扫描条码”这个动作在业务流程图中画出来没问题但在 DFD 里不能直接画。DFD 里对应的表达是一条从外部实体“读者”出发的数据流“读者证号图书条码”流入处理“借书登记”处理内部读取数据存储“读者表”和“图书表”校验后写入数据存储“借阅记录表”。动作变成了数据流这就是 DFD 的精髓。DFD 常用来标记的符号体系有 Yourdon 和 Gane-Sarson 两套。Yourdon 用圆圈表示处理Gane-Sarson 用圆角矩形表示处理数据存储在 Gane-Sarson 里是开口矩形。不要在两套符号之间混用画到一半换符号会导致整张图前后不一致。3.2 顶层图与第一层图的拆分方式DFD 一定要分层最上面是顶层图也叫上下文图。上下文图里只有一个处理框就是整个系统外面画外部实体和它们之间的数据流。图书馆管理系统上下文图的外部实体通常只有两个读者和管理员。读者与系统之间流动的是借书请求、还书请求、续借请求、查询条件、预约请求管理员与系统之间流动的是读者管理操作、图书管理操作、逾期处理操作和对应的结果反馈。第一层图把系统这个大处理框拆成几个逻辑处理单元。图书馆管理系统一般拆成四块读者管理、图书管理、借还书处理、查询统计。每一块连接到对应的数据存储。比如借还书处理需要读“读者表”“图书表”写“借阅记录表”查询统计只读不写图书管理处理维护“图书表”“出版社表”“分类表”。特别提醒一个分层原则父图中的数据流必须与子图中的输入输出数据流一致。比如父图里“借书请求”从外部实体流向系统那么第一层图里一定要有一个处理单元接收“借书请求”。如果拆完子图后发现这个数据流进不去说明拆分有遗漏。3.3 用 draw.io 画第一层图的操作顺序我画 DFD 常用的工具是 draw.io。它支持 Gane-Sarson 符号库打开方式是在新建图表时搜索“DFD”或者从“软件”分类里找“Gane-Sarson”。不要在自带 UML 图库里硬画符号不对的话后面调整非常痛苦。绘制步骤可以按这个顺序做先放外部实体读者在左侧管理员在右侧用矩形表示再放处理借还书处理、读者管理、图书管理、查询统计用圆角矩形表示再放数据存储读者表、图书表、借阅记录表、出版社表、分类表用开口矩形表示最后连线每条连线标注数据流名称例如“读者证号”“图书条码”“借阅记录”检查每个处理有没有输入输出没有数据流连线的外部实体不要画以借书为例第一层图里“借还书处理”这个圆角矩形的数据流是这样组织的读者发出“读者证号图书条码”借还书处理读取“读者表”中的读者状态读取“图书表”中的图书状态校验后写入“借阅记录表”并回写“图书表”的状态。整个过程可能还要穿过一个“逾期判断”但它通常放在处理内部描述不需要画到图上。记住一个参数习惯数据流名称尽量写字段级描述例如“读者证号”而不是“读者信息”。因为评审人看到一个宽泛的“读者信息”会追问到底是哪些信息。字段级描述可以从第一层图一直对到 ER 图属性这是天然的一致性检查。3.4 数据守恒检查表DFD 画完后需要做一轮数据守恒检查。数据守恒是 DFD 最核心的验证逻辑每次做复查时按这个列表一项项打勾每个处理至少有一个输入数据流和一个输出数据流没有输入的叫“凭空产生”没有输出的叫“黑洞处理”每个数据存储至少被一个处理读取或写入否则这个存储根本不存在或只被画来凑数外部实体不能直接连接另一个外部实体两者之间必须经过处理每条数据流上有明确名称不能出现不带标签的箭头数据流不能直接从存储到存储必须经过处理这套检查规则是手工的但很有效。只要出现“数据直接从一个实体画到另一个实体”的情况八成是画图的人把动作当成了数据流。把这条记在心里DFD 的质量能超过大多数课设文档。还有一条命名规范值得养成数据存储的名字用“表”后缀处理名用动词开头。比如“借还书处理”“读者信息查询”这样的命名在子图拆分时不会乱。如果需要进一步细化第二层图处理名会变成“校验读者资格”“登记借阅记录”“修改图书状态”。4. ER 图实体、属性和关系一次想清楚4.1 实体识别不要照着界面画ER 图最容易犯的毛病是照着界面输入框画实体。界面上有一个“书名”输入框就以为图书实体只有书名界面没有展示出版社就不设计出版社表。这种画法会在后期建表时发现大量遗漏。从借书这个业务动作出发可以倒推出以下实体实体核心属性读者读者ID、姓名、读者类型、学院、专业、联系电话、状态图书图书ID、书名、ISBN、作者、出版社ID、分类ID、馆藏地点、价格、状态出版社出版社ID、出版社名称、地址、联系电话分类分类ID、分类名称、父分类ID借阅记录记录ID、读者ID、图书ID、借书日期、应还日期、实际还书日期、续借次数、状态管理员管理员ID、账号、密码、姓名、角色、状态这里有一个容易忽视的设计点图书和书目是否需要分开。更规范的图书馆系统会有“书目表”和“复本表”两层书目记录《深入理解计算机系统》这一本书的元信息复本记录图书馆里实际购买的多本实体书。借阅记录关联到复本而不是书目。但对于课程设计场景如果不涉及多复本问题直接把图书表当成每一本实体书来处理是可以接受的。只要在文档中说明这个化简决策即可。4.2 关系的基数与多对多处理实体之间的关系也需要从业务流程里推导。读者和图书之间是借阅关系一个读者可以借多本图书一本图书可以被多个读者在不同时间借阅所以是典型的多对多关系。如果直接把读者和图书用一条 M:N 的线连起来建表时会发现无处落外键。解决方式是在中间增加“借阅记录”实体把多对多拆成两个一对多关系。借阅记录本身带有借书日期、应还日期、续借次数这些属性这使它成为一条关联实体而不是一张单纯的关系二维表。这也是 ER 图设计里最有含金量的一步。下面是 Mermaid 中 ER 图的表达方式适合在文档迭代时快速确认关系erDiagram READER ||--o{ BORROW_RECORD : 借阅 BOOK ||--o{ BORROW_RECORD : 被借 CATEGORY ||--o{ BOOK : 分类 PUBLISHER ||--o{ BOOK : 出版这里||--o{表示 1 对 0..n 的关系一个读者对应多条借阅记录一本书对应多条借阅记录一个分类对应多本图书。借阅记录实体本身在这个关系中承担连接作用。Mermaid 里写这个描述不需要额外安装工具只要在支持的编辑器里就能渲染。它的优点是改关系基数非常快缺点是复杂属性标注不如专用建模工具方便适合草稿阶段使用。4.3 从 ER 图到物理表结构关系模式确定后下一步是转成物理建表脚本。借阅记录表是整体设计的关键它的结构直接决定了业务流程图里的判断条件能否落地。CREATE TABLE borrow_record ( id INT PRIMARY KEY AUTO_INCREMENT, reader_id INT NOT NULL, book_id INT NOT NULL, borrow_date DATE NOT NULL, due_date DATE NOT NULL, actual_return_date DATE NULL, renew_count TINYINT DEFAULT 0, status TINYINT DEFAULT 1 COMMENT 1-借出中 2-已还 3-逾期未还 4-已续借, INDEX idx_reader_status (reader_id, status), INDEX idx_book_status (book_id, status), CONSTRAINT uk_reading UNIQUE (reader_id, book_id, status) ) COMMENT借阅记录表;借阅记录表的状态字段是整套设计的核心业务流程图里“可借数量未满”的判断对应的 SQL 实际上是统计该读者当前 status1 或 status3 的记录数。如果不设计 status 字段这个判断就会非常难写。另一个反范式考虑是冗余字段。借阅记录表是否需要冗余“书名”常见做法是加一个 book_title 冗余字段用于打印借阅历史时无需频繁关联图书表。但冗余要克制读者姓名不建议冗余因为读者信息变更频繁而且借阅历史属于敏感操作数据保留字段越少审计越容易。4.4 从 MySQL 表逆向导出 ER 图如果项目已经先把表建好了画 ER 图其实可以走逆向工程。MySQL Workbench 里选择 Database 菜单中的 Reverse Engineer连接数据库后会读取所有表、字段和索引自动生成可视化关系图。Navicat 里的模型功能也可以做到类似效果。这种做法适合表结构已经稳定的场景不适合设计早期。因为逆向出来的 ER 图通常只展示外键关系不会帮你判断“多对多为什么被拆成三张表”。但老项目要补文档时逆向了总比手绘快。需要注意调整生成图时可能出现的混乱连线手动重新排列实体位置让图尽量保持左侧实体、右侧关联实体的布局。5. 画图避坑指南三张图对不上的根源5.1 业务流程图和数据流程图混着画现象借书流程的业务流程图里画了“管理员扫描条码”数据流程图里也画了一个叫“管理员扫描条码”的处理节点。两张图看起来像但评审一追问就答不上来。原因没有区分物理动作和数据逻辑。扫描条码是人的动作读入条码才是数据流。解决业务流程图保留“管理员扫描条码”数据流程图改为“读者证号图书条码”的数据流直接进入“借书登记”处理。遇到动作类描述先问一句这一步产生了什么数据还是做了什么物理动作物理动作留给业务流程图数据流留给 DFD。5.2 实体命名在不同图中不一致现象ER 图里用 reader_id数据流程图里叫“读者编号”业务流程图里叫“借书卡号”。同一字段三个名字。原因文档没有形成数据字典各图画各的。解决先定一个命名规范。实体名和属性名以 ER 图为准例如读者实体的主键统一叫 reader_id业务流程图和数据流程图中的判断条件、数据流名称全部引用这套命名。我通常在建文档前先写一句话规范所有中文描述在第一次出现时后接英文标识比如“读者编号reader_id”。这样每张图里出现的名字都能相互印证。5.3 多对多关系直接画一根线没有中间实体现象ER 图里读者和图书之间直接连一条 M:N 的线看起来清晰但转表结构时找不到地方放借阅日期、应还日期、续借次数这些属性。原因借阅本身是带属性的关系不能只靠一根连线表达。解决增加借阅记录实体把 M:N 拆成 READER 1:N BORROW_RECORD N:1 BOOK。同时把借阅日期、应还日期、实际还书日期、续借次数挂到借阅记录上。在 ER 图例中这个实体用菱形或关联实体符号突出标识让对方一眼看出这是“关系实体化”的结果。5.4 借阅记录表缺少状态字段现象借书业务流程图里有“可借数量未满”的判断但建表后发现查不出“读者当前借了几本有效图书”。查询条件只能用借书日期是否为空的模糊条件。原因设计表结构时漏掉了借阅记录的状态字段导致业务规则无法落地。解决在借阅记录表中加入 status 字段值定义为借出中、已还、逾期未还、已续借。查询需求里需要做唯一约束时要用基于状态的过滤条件去统计。可以在 reader 表中设计一个冗余字段 current_borrow_count每次借还成功时同步更新减少统计大表次数。同步更新的动作要通过事务保证不能出现读完数量与真实数量不一致的情况。5.5 图上标着外键建表脚本却一个外键都不加现象ER 图里“借阅记录”到“图书”明明连着一根线交付的 MySQL 建表脚本却没有任何 FOREIGN KEY 语法。原因不少团队禁用数据库外键约束用应用层代码处理引用关系但文档没有同步说明最终图与库不一致。解决ER 图保留外键关系这是设计层面的表达建表脚本可以不加物理外键但必须在建表脚本的注释或数据字典中写清楚“外键约束由应用层保证”。这样别人看图和看库时不会因为“有连线但没约束”而产生误解。答辩时被问到这也算一个加分点说明你清楚外键约束在性能与一致性之间的取舍。6. 用 SQL 反向验证三张图是否走通设计稿画得再漂亮也要经得起一次推演。我的收尾习惯是把 ER 图里的每个关系转成 SQL然后模拟一次借书操作看业务流程图里的判断条件是否都能被表结构承接。先创建借阅记录再更新图书状态这两个操作必须放在一个事务里START TRANSACTION; INSERT INTO borrow_record (reader_id, book_id, borrow_date, due_date, status) VALUES (1, 10, CURDATE(), DATE_ADD(CURDATE(), INTERVAL 30 DAY), 1); UPDATE book SET status 2 WHERE id 10; COMMIT;接着验证“可借数量未满”这一判断是否能从表里查出来SELECT COUNT(*) AS borrowing_count FROM borrow_record WHERE reader_id 1 AND status IN (1, 3);如果这个查询结果大于读者表的可借数量上限借书业务流程就必须走“提示已达借阅上限”分支。用这种方式把三张图的关键节点跑一遍比单纯对着图看要有效得多。具体做法是拿每条业务规则反查表结构。比如“图书被预约后不能借出”这条规则要么靠图书表 status 字段加一个枚举值“预约保留”要么靠预约表在借出前做一次存在性检查。如果两种方案都没有实现说明业务流程图和 ER 图之间存在一个没被接上的断点。用事务包住关键写操作能同时验证索引是否合理、字段类型是否够用。还有两个文档输出参数需要注意。draw.io 导出图片时要选“PNG 300 dpi”Word 里插入图片后设置宽度约 15 厘米并保持纵横比Visio 则导出 PDF 后再转成图片尽量避免直接截图。所有图的名字要与图内标题一致业务流程图就叫“借书业务流程图”不要图名叫“借阅流程”而文件名叫“BorrowProcess”。人脑会对不一致的命名下意识产生不信任感。我自己的项目习惯是先画 ER 图再画业务流程图最后画数据流程图。ER 图把实体和字段定下来业务流程图里的判断条件才有依据业务流程图完成后DFD 只要沿着动作去提取数据流即可相当于一次平移而不是重新发明。这个顺序能省掉大量改图时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表