
项目文档里最容易被追问、也最容易被糊弄的三张图就是流程图、ER图和用例图。我见过不少项目方案写得头头是道一打开图就露馅流程图判断框出去不带Y/NER图主键没标用例图和系统边界外的参与者对不上。做毕业设计的同学被评审老师追问到脸红软考备考的人在用例图真题上反复丢分实际开发团队则经常因为图与代码不一致而返工。这篇文章就是我这些年画项目图的一点总结。不打算从教科书定义讲起直接说怎么把三张图画对、画好、画完能落地。内容包括每一张图到底解决什么问题、图和图之间怎么配合、从零到一的具体步骤、现有工具怎么选怎么用以及评审和考试里最常见的坑。适合正在写课程设计/毕业设计文档的学生、准备软考程序员/软件设计师的考生以及要在项目里补文档的开发者。1. 项目文档里这三张图本质是写给谁看的很多人画图之前先打开工具这是顺序错了。画图之前应该先回答一个问题这张图给谁看看的人要从中得到什么结论。1.1 流程图、ER图、用例图各管一摊别混用三张图解决问题的维度完全不同。流程图管的是“过程”。它回答的是在什么条件下系统按什么顺序做了哪些动作最后到达什么状态。读者盯着流程图是想知道业务怎么流转哪个环节会出分支哪个地方可能卡住。比如图书管理系统里的借书流程读者关注的是“验证身份失败怎么办”还是“登记完直接给书”这是流程图要说的。ER图管的是“数据”。它回答的是系统里有哪些实体每个实体有哪些关键属性实体之间是几对几的关系。读者盯着ER图是想知道表结构合不合理外键该建在哪哪些字段适合做主键。简单说流程图讲的是动作的先后ER图讲的是数据的关系。用例图管的是“边界”。它回答的是谁在使用系统系统对外提供了哪些能力哪些功能在系统边界之内哪些在系统之外。读者盯着用例图是想确认需求范围有没有漏角色权限划分是不是清楚。它不关心内部实现细节只关心外部看到的系统长什么样。这三张图各看各的混着画就会出现一个经典问题把流程图里的判断框画到用例图里或者在ER图里画了借书先后顺序。图一多信息就乱了评审时反而说不清楚。1.2 评审时“合格”的标准是什么我参加过不少项目文档评审和答辩也帮人改过不少图。综合下来“合格”的图基本就四条标准第一自解释。图拿出去不靠旁边人解释读者自己就能看懂。这意味着每个符号都要规范每条线都要说明条件每个实体都要标主键。第二图文一致。图和需求描述、数据库表结构对得上。很多图单看不错一核对代码就发现表结构早就改了ER图还停留在两周前的版本。第三分清详略。流程图到“业务动作”这一层就够别画到函数调用用例图到“用户目标”这一层就够别画到页面按钮ER图到“需要存储的关键属性”就够别把所有字段都堆上去。第四有明确的图注和编号。文档里的图要有“图1-1 借书业务流程图”这样的命名正文要引用它。评审时老师不会逐个去找图你提到哪张图就能定位到哪张这是最基本的态度。快速自检时我会用一个很小的检查清单图类型必查项流程图判断框出线是否有条件标注、是否有开始/结束节点、是否存在无出口的死路ER图每个实体是否有主键、关系是否标注了1对1/1对多/多对多、外键来源于哪张表是否清晰用例图参与者是否在系统边界外、用例命名是否为动词短语、include/extend方向是否正确这四条看着基础但实际文档里能做到的并不多。接下来每张图单独拆开讲。2. 流程图把业务动作翻译成符号语言流程图是项目文档里出现频率最高的一张图也是最容易被画得随心所欲的一张。很多人画流程图就像在画便签草稿想用什么框用什么框这样的图在自己电脑里没问题一进文档就经不起推敲。2.1 符号表先把“各种框的含义”记牢画流程图之前先把符号规范吃透。下面这张表是我平时画图时最常用到的覆盖了绝大多数场景符号形状含义使用场景开始/结束圆角矩形或跑道形流程的起点和终点每个流程只有一个开始一个或多个结束处理矩形执行某个操作或计算“验证读者信息”“更新库存数量”判断菱形条件分支必须有两条以上出线“读者是否在借阅黑名单”文档/报告底部为波浪线的矩形输出或阅读文档“打印借书凭条”“生成日报表”数据平行四边形输入或输出数据“读取读者条码”“显示库存信息”预定义过程上下双边矩形调用已定义好的子流程“调用支付接口”延迟六边形或时钟形状等待一段时间“等待系统响应”连接符圆形跨页或跨区域连接图太长时跳转到另一区域最核心的其实是前三类开始/结束、处理、判断。一个流程能够成立本质上就是把这三个符号按照业务顺序串起来。数据、文档这些符号是锦上添花画上更精确不画也不会导致流程读不懂但如果画了就得画对。BPMN那一套规范更复杂一些面向的是业务流程建模里面事件用圆圈表示、活动用圆角矩形表示、网关用菱形表示。如果是做流程引擎相关的系统BPMN里的网关概念一定要懂这个我在后面单独说。2.2 画流程图的固定套路步骤清单到正式图我不太建议大家打开工具就开画尤其是业务比较复杂的时候。我的习惯是先写在纸上或者文档里把步骤列表列出来再翻译成图形。以图书管理系统里“借书”这个经典场景为例步骤清单大概是这样的读者出示借书卡管理员扫描读者条码系统查询读者信息判断读者是否有效是否存在、是否挂失、是否超期未还若无效提示原因并结束流程若有效扫描图书条码系统查询图书信息判断图书是否在馆若不在馆提示“图书已借出”并结束流程若在馆登记借阅记录更新库存数量打印借书凭条流程结束这组步骤写清楚之后画图就有章法了。先把开始节点放上去然后把顺序执行的动作“查询读者→判断有效性→扫描图书→查询图书→判断在馆→登记借阅→更新库存”用矩形和菱形串起来最后在开头和结尾补上开始/结束节点。判断框的写法有一个很容易被忽略的细节菱形里面写的是一个“命题式问题”出线的条件要明确标注“是”和“否”不要写“成功”和“失败”这种模糊词。是/否这种二值判断最直观如果分支超过两个可以考虑拆成多个判断框而不是一个菱形拉出五六条线。箭头方向也很重要。默认流程从上到下、从左到右回退的箭头要绕行或者标注清晰避免和主流程线交叉。一页放不下的时候用连接符圆圈代替长长的连线这是很多培训教材不会特意讲、但实际画长流程时非常好用的技巧。2.3 三类经典流程图实例业务流程、算法流程、BPMN网关图书借书流程是典型的业务流程。再补充两类我在学习交流中常被问到的类型。第一类是算法流程图数学建模和单片机类项目里最常用。它的画法和业务流程一样只是步骤变成了程序处理的逻辑。以“单片机广告灯左移右移控制程序”为例先初始化P1口为低电平然后循环将点亮位置左移每移一位延时一段时间再判断是否收到按键切换指令。这个流程里最核心的循环体现在流程图上就是一条回边判断框“是否完成一轮移位”为否时箭头回到移位处理框之前形成循环回路。画算法流程图要特别注意循环条件的出口。很多初学者会把循环画成绕不出来的死循环正式图里一定要有一条跳出循环的出口哪怕最后要回到“开机初始化”也不能让箭头悬空。第二类是BPMN流程图里的网关。排他网关和并行网关是两个最常见的概念排他网关对应流程里的单选分支比如支付方式判断微信还是支付宝还是银行卡只会走其中一条。图形上是菱形里面画一个“叉”或“X”。并行网关对应的是多个任务可以同时执行全部完成才继续。比如订单支付后系统同时给仓库发拣货单、给财务开发票、给用户发通知。图形上是菱形里面画一个“加号”或“”。BPMN比传统流程图更严格也更能描述复杂协作流程。如果项目文档里用的是传统流程图把并行关系硬画成串行后面做流程引擎的人会很痛苦。所以该用并行网关表达的时候不要省。2.4 判断框与出线标注最容易翻车的地方我评审别人的流程图时最先看的就是判断框。判断框最容易出的问题有三个第一个出线没有条件标签。菱形出去两条线一条叫是一条叫否这没问题。但有的图画两三个判断框层层嵌套出去的条件只写“是”和不写读者根本不知道另一条线代表什么。第二个判断条件写成了执行动作。比如“验证读者信息”放进了菱形框这是不对的。菱形框里应该是一个可以被回答“是/否”的问题比如“读者信息是否有效”。验证这个动作本身应该放在矩形框里。第三个路径没合并。一个判断分为是和否两个分支两个分支最终应该汇合到同一个后续处理节点。有的图分支之后各走各的流程断了。这在业务上可能是有意为之但图上要能体现出来。另外还有一个小技巧判断框的“是”分支尽量往主流程下方延续“否”分支往旁边绕回或者结束。这样读图的视线最顺畅。反向画会让人以为主流程走的是“否”这是常见阅读错觉。3. ER图让数据关系可视化ER图是项目文档里的另一个重头戏。不管你做的是课程设计还是企业系统数据库设计几乎都离不开ER图。很多人在画ER图时一头雾水主要是没搞明白实体、属性、关系三件事分别对应数据库里的什么东西。3.1 实体、属性、主键怎么表示传统ER图Chen方法用矩形表示实体椭圆表示属性菱形表示关系。主键属性在椭圆下方画一条下划线这是最经典也最通用的标记方式。后来很多工具采用crows foot鸟爪记法实体用矩形属性列在实体内部关系直接用连接线和“1”“N”等标记表示。两种记法都行但一个文档里不要混用。我的建议是如果使用PowerDesigner、MySQL Workbench这类工具用crows foot记法最方便工具直接生成如果用手绘或Visio用Chen方法的完整符号更规范尤其是课程设计和毕业设计评审老师更吃这一套。以“图书管理系统”为例实体至少包括读者、图书、借阅记录。读者实体的属性有读者编号、姓名、联系方式图书实体的属性有图书编号、书名、作者、出版社借阅记录实体的属性有借阅编号、借书日期、应还日期。主键分别是读者编号、图书编号、借阅编号。画ER图时属性不要全列只画关键属性。把所有字段都画成椭圆图会乱到根本没法看。详细字段留给数据字典ER图负责结构关系。3.2 一对多与多对多关系拆分的实战判断关系判断是ER图的灵魂也是最容易出错的地方。有一个很实用的判断方法站在一个实体的一条记录角度问自己“它对应另一个实体的几条记录”。读者和借阅记录一个读者可以有多条借阅记录一条借阅记录只属于一个读者所以是一对多1:N。图书和借阅记录一本图书同一时间点通常只对应一条“在馆借出”记录但从历史角度讲一本图书可以被借多次所以从完整建模来看图书和借阅记录之间是一对多。真正需要小心的是多对多关系。比如“读者”和“图书”一个读者可以借多本书一本书可以借给多个读者直接看是典型的多对多。但在关系型数据库里多对多必须拆成两个一对多中间加一个连接实体。这个连接实体就是“借阅记录”它自身带有借书日期、应还日期这些属于“这次借阅行为”的属性。这在ER图上表现为读者1——N借阅记录N——1图书。两个一对多关系中间实体承载关系本身的属性。很多人的ER图里直接画读者和图书之间的菱形多对多关系不能算全错但在建表时一定会卡住因为你要在读者表里加一个“已借图书ID”吗还是在图书表里加一个“当前借阅人ID”都不合理。多对多拆解成中间表是ER图走向物理表结构的关键一步。3.3 从数据库表反推ER图SQL转ER图的工具体验“sql转er图”是搜索特别频繁的关键词实际工作中也经常遇到项目代码里已经有表结构但文档里的ER图缺失或者过期了最省力的办法就是让工具反向生成。我试过几条路线按好用程度排一下第一条路线MySQL Workbench自带的反向工程。连接数据库后菜单Database - Reverse Engineer按向导选择要导出的库工具会自动分析外键关系并生成ER图。生成的模型可以手动调整布局也可以直接导出图片或者SQL脚本。优点是完全免费和MySQL配合度最高缺点是只有MySQL系数据库用着舒服其他数据库要额外配驱动。第二条路线Navicat的模型功能。打开Navicat顶部菜单里有“模型”点击新建模型然后选择“逆向数据库”或者“导入数据库结构”工具会按已有的外键关系生成ER图。Navicat生成的图对中文支持更好调整布局也比较顺手缺点是模型功能是付费版本的一部分如果你正好有授权那就很划算。第三条路线部分在线工具提供SQL转ER图的免费入口。用法一般是粘贴建表SQL语句工具解析出实体和关系并渲染成图。我体验过几个处理简单的几张表还行但表一多、字段带注释、关系复杂时自动布局基本都会乱。还有一个容易忽略的点把SQL粘贴到第三方网站等于把表结构传到别人服务器上项目数据够敏感就别这么干。为了测试这些工具我常用下面这段SQL做素材CREATE TABLE reader ( reader_id INT PRIMARY KEY, name VARCHAR(50), phone VARCHAR(20) ); CREATE TABLE book ( book_id INT PRIMARY KEY, title VARCHAR(100), author VARCHAR(50) ); CREATE TABLE borrow_record ( borrow_id INT PRIMARY KEY, reader_id INT, book_id INT, borrow_date DATE, due_date DATE, FOREIGN KEY (reader_id) REFERENCES reader(reader_id), FOREIGN KEY (book_id) REFERENCES book(book_id) );工具解析出来的效果基本一致三个实体框borrow_record作为连接表出现在中间两条外键连线分别指向reader和book。你如果自己画也应该是这个结构。3.4 案例银行储蓄系统ER图的设计过程热搜里“银行储蓄系统er图”也是高频词就拿它当例子走一遍完整设计过程。第一步找实体。储蓄系统里肯定有客户、账户、储蓄卡、交易流水。有些设计会把“柜员”“网点”也放进去看需求范围如果是课程设计做到客户-账户-储蓄卡-流水就够撑起结构。第二步定属性。客户客户编号主键、姓名、证件类型、证件号码。账户账号主键、账户类型、余额、开户日期。储蓄卡卡号主键、关联账户、卡状态。交易流水流水号主键、账户、交易类型、交易金额、交易时间。第三步定关系。一个客户可以开多个账户客户与账户是1:N一张储蓄卡通常绑定一个账户账户与储蓄卡是1:1一个账户有很多笔交易账户与交易流水是1:N。画图时关系上标好“1”和“N”每个实体标出主键下划线这张ER图基本就合格了。这里有一个很典型的建模考量账户和储蓄卡到底是一对一还是一对多在实际银行系统里一个账户可以关联多张卡包括主卡和附卡但在课程设计里为了简化通常做成一对一。你需要在文档里说明为什么这样设计——当需求允许一个账户有多张卡时这个“1:1”就成了错误。ER图设计不是凭空画而是对需求的翻译。4. 用例图先定角色边界再谈功能用例图在软考中级软件设计师考试里几乎是必考内容在实际项目文档里也常作为需求分析的开篇图。它看起来简单一个椭圆一个人形但恰恰是这种简单图最容易画错。4.1 参与者、用例、关系用例图的三种基础元素用例图的基础元素只有三组参与者、用例、关系。参与者画成小人或火柴人放在系统边界矩形框的外面。参与者的本质是一个“角色”而不是一个具体的人。一个读者可以是参与者“读者”管理员也是参与者“管理员”。同一个系统里可能有多个参与者每个参与者代表一类与系统交互的外部角色。用例画成椭圆放在系统边界矩形框的里面。用例名字必须是一个动词短语比如“查询图书”“借阅图书”“管理用户”而不是名词“图书查询信息”。关系在用例图里有三种关联关系参与者与用例之间用一条实线连接表示这个角色使用了这个用例。包含关系《include》虚线箭头从基础用例指向被包含用例。它的意思是基础用例执行时一定会执行被包含用例。典型例子是“借书”用例包含“验证读者身份”。扩展关系《extend》虚线箭头从扩展用例指向基础用例。它的意思是基础用例执行到某一步时在特定条件下可能执行扩展用例。典型例子是“还书”用例在超期时扩展出“计算罚款”。include和extend的方向经常被搞反。记住一句话include箭头指向被复用的那一个extend箭头指向被增强的那一个。软考真题里经常给一张关系图问你哪个画对了认准箭头方向就能解决一大半。4.2 从用户目标去找用例而不是从菜单栏找画用例图最大的错误是照着系统菜单画。菜单里“用户管理”“图书管理”“系统设置”一个个对应成用例画出来像菜单导览不是用例图。正确方法是从参与者的目标出发。问一句读者使用这个系统想完成什么目标答案是查书、借书、还书、续借、预约。管理员使用系统想完成什么目标答案是管理图书信息、处理借还书、管理读者信息、查看统计报表。一个用户目标对应一个用例这是用例划分的基本粒度。过粗的用例会把“借书”“还书”“续借”打包成一个“图书流通管理”信息丢失过细的用例会把页面上每个按钮都画成一个用例图爆炸。“用户管理模块”是常见的需求。它的用例划分可以这样看管理员作为参与者“新增用户”“修改用户信息”“停用用户”“查询用户”是四个独立用例“修改用户信息”和“停用用户”都可以包含“验证用户是否存在”这个公共步骤于是后者可以作为被包含的用例两个用例通过include指向它。这样既精简了连线也体现了用例之间的复用关系。4.3 图书管理系统用例图一个毕业设计级别的完整拆解拿搜索热词里的“图书管理系统用例图”做一个完整拆解。这个图的参与者通常有三个读者、图书管理员、系统管理员。如果系统有自助借还机还可以加一个“自助终端”参与者看你的项目范围。先处理读者侧用例注册/登录、检索图书、查看图书详情、预约图书、借阅图书、归还图书、续借图书、查看个人借阅记录。“预约图书”和“借阅图书”有什么公共步骤都需要“验证读者资格”所以可以引入一个“验证读者资格”用例被借阅和预约两个用例用include包含。续借图书在特定规则下可能触发“超期校验”这个可以做成extend关系但是优先级低画图时可以选择不画复杂扩展。图书管理员侧用例还书登记、借书登记、处理预约、逾期罚款处理、图书上架、图书下架、读者管理。这里“借书登记”和“还书登记”都包含“扫描图书条码”这个动作也可以抽出来放include。系统管理员侧用例用户权限管理、系统配置、日志查看、数据备份。如果项目文档是课程设计级别到这里已经足够。这张图画出来后系统边界、外部角色、功能范围清清楚楚评委会凭这张图快速建立对你项目的整体印象。用例图的好坏不在于画得多花哨而在于参与者是否找全、用例粒度是否一致、关系表达是否克制。4.4 软考用例图真题的通用解法软考中级软件设计师的用例图题目年年都有考察形式基本左右不离这几种给需求描述让你补全用例图、判断include/extend方向、识别参与者。我对备考同学的通用建议是一个“三步法”。第一步圈参与者。把需求文字里所有“系统为谁服务”的词圈出来。需求里出现“读者向系统提交……”读者就是参与者。注意参与者不一定是人外部系统也可以成为参与者比如“第三方支付系统”可以作为一个参与者出现在用例图里。第二步圈动词短语。需求描述里的动作往往直接对应用例。比如“管理员可以添加图书、修改图书信息、删除图书”这三个动词短语就有三个潜在用例。但要注意动词短语的层级需要统一不要一会儿“管理图书”级别一会儿“修改图书名称”级别。第三步套关系模板。看到“A用例在执行时需要B用例”就是include箭头从A指向B看到“当满足条件时A用例会运行B用例”就是extend箭头从B指向A。真题做错的人大部分不是不认识用例图而是读题太快。题目会给一段需求文字和一个半成品图你把参与者和用例先标出来再把文字描述里的“必定执行”“当……时”这些关键措辞翻译成include或extend正确率会明显上升。5. 工具与文档落地的实战经验图画得再专业落不进文档、传不到同事手里价值就大打折扣。工具选择和最终导出格式对项目文档的最终呈现影响非常大。5.1 主流的画图工具怎么选我把常用的几类工具按使用场景整理成一张表工具擅长场景上手成本备注draw.iodiagrams.net流程图、ER图、用例图、思维导图低免费支持本地文件可集成VS CodeProcessOn在线协作、模板库丰富低免费版有文件数量限制模板质量高Visio全场景制图尤其适合Windows Office环境中收费企业使用多专业度高Xmind思维导图为主简单流程图也能画极低适合脑暴正式项目流程图不推荐PowerDesigner数据建模、ER图、数据库逆向工程高老牌建模工具适合企业级数据架构MySQL WorkbenchMySQL数据库的ER模型设计、逆向工程中免费做MySQL项目很顺手StarUMLUML建模用例图、类图、序列图中免费开源适合课程设计画UML全套Enterprise Architect大型项目UML建模与代码生成高收费工具重一般项目不需要我的建议分人群学生和课程设计用户draw.io加StarUML基本全覆盖个人开发者补文档draw.io完全够用企业里已经装了Office全家桶又不想折腾直接用Visio也不差纯做数据库建模PowerDesigner或MySQL Workbench更合适。5.2 用 draw.io 画标准ER图与用例图的操作要点draw.io是我日常最常用的图工具免费跨平台文件直接存成本地xml或嵌入Git仓库。很多人不知道draw.io里其实自带UML和ER图模板不用从零画。新建文件后左边图形面板搜“Entity Relation”可以找到ER图专用图形里面有实体框可以双击直接添加字段列表和关系连线可以选择crows foot样式1端和N端会显示成鸟爪。搜“UML”可以找到用例图图形参与者小人、用例椭圆、系统边界框都在里面。连接线是关键。draw.io默认的连线是正交折线适合流程图画ER图时右键连接线可以选择“关联”或“实体关系”类型会带出关系基数标识。画用例图的include/extend时选择带箭头的虚线线上标注《include》或《extend》文本注意文本里书名号不要省略这是UML规范明确要求的。导出时建议文档要打印或提交PDF导出为SVG矢量图或高DPI PNG要在Wiki或GitLab里预览SVG最稳要拷贝进Word可以直接粘贴draw.io里的图形区域得到的是可编辑的矢量图形稍微调整一下画布大小就不会糊。5.3 图的版本管理与模型一致性这是实际项目里我踩过坑、也有很多团队忽略的一块。ER图和数据库表结构往往不是一回事开发过程中手改过表字段加过索引删过几个外键但文档里的ER图还是最初版本。等到项目收尾补文档时那叫一个酸爽。我的习惯是所有图的源文件跟着代码仓库走。draw.io的文件存在docs/diagrams目录下每次改完图和代码一起提PR。ER图尽量从数据库逆向生成而不是手动画完就不管。表结构变更时顺手在工具里更新模型并导出新图。这个习惯养成之后文档过期问题能解决七八成。用例图和流程图属于需求层一旦需求评审通过大头就定了。后续变更通常是增补用例而不是推倒重画。所以这两类图不需要频繁同步代码但要有版本记录方便回溯“当初这个需求是怎么定的”。6. 画图之外的几件事图本身只是项目文档的一部分。真正让这些图发挥作用的是画图前的思考方式和画完后的落地维护。最后分享几个我个人的习惯和一些拿得上台面的小技巧。6.1 图注命名和全文引用课程设计和毕业设计里图的命名和引用经常被忽略。规范做法是每张图有“图编号图名”编号与章节挂钩例如“图2-1 借书业务流程图”“图4-1 图书管理系统用例图”。正文段落里必须提到这张图比如“读者借书的具体流程如图2-1所示”。不要出现正文没提、图却孤零零挂在文末的情况评审老师会认为这是凑页数。上面这些图都围绕“项目文档的流程图、ER图和用例图”展开。写到这里回看整篇文章你会发现三张图之间其实形成了一个完整闭环用例图定义功能边界流程图描述功能怎么流转ER图支撑流转过程中涉及的数据结构。一张图回答一个问题三张图合在一起项目文档的核心骨架就立住了。6.2 我的几个实际体会我见过画了五页流程图最后全部推翻重来的项目也见过一张ER图直接把数据库表结构定下来、开发期几乎没返工的项目。区别就在于画图的人有没有先想清楚这张图到底是在表达业务还是在应付文档。不要为了画图而画图。如果某一段流程大家都懂、没有任何分支和异常处理它可以不画如果某张ER图只有两个实体一个关系那它也不值得单独占一页。图的数量不是文档质量的指标图的准确性和一致性才是。工具层面我最后再补两个小技巧。第一个draw.io里画完的图如果要在毕业设计论文里用导出SVG后放到Word里Word会自动把SVG转成可缩放图形比PNG清晰很多。第二个Xmind确实可以做简单流程图但如果你要用在正式项目文档里我劝你还是把它当作思维导图草稿把正经图画到draw.io或Visio里。思维导图重“发散”流程图重“严谨”两者的表达逻辑不一样。画图是给未来的自己和别人省时间的。带着这个心态去画哪怕一开始慢一点图纸经得起半年后回看就已经比大多数项目文档强了。