拓冰建站拓冰建站
首页 / 资讯中心 / 正文

三款开源Web端ER图设计工具,让数据库建模告别桌面客户端

做数据库课程设计或者维护老项目的时候有一件事永远绕不开那就是数据库ER图。期末要交文档了得画图面试官要考你ER图怎么转关系模型接手老系统得先搞清楚几十张表之间的关系。很多人第一反应是下载一个桌面客户端装上JDK、配好数据库驱动折腾一上午图没画出两张。其实现在有不少开源方案可以直接跑在浏览器里打开网页就能完成数据库ER图设计、反向导入和SQL导出真正做到了“Web端可用 开源免费”。这篇文章我整理了3款实际用过、靠谱好上手的开源数据库ER图设计工具会从选型思路、核心用法、落地流程和避坑技巧几个角度讲清楚适合正在做数据库课程设计的学生、准备Java后端面试的开发者以及整天在老系统里理表结构的运维和前后端同工。1. 为什么我建议你把ER图工具换到Web端1.1 学生、求职者和老系统维护者的共同痛点先说学生场景。数据库课程设计和毕业设计有一个固定动作画ER图、写数据库设计说明书、把ER图转成关系模型。看起来不难但很多人在工具选择上就卡住了。桌面端工具不是不好而是安装和学习成本偏高有的还要激活码、要配置Java环境、要下载数据库驱动等你把环境弄好一个下午就没了。更麻烦的是在机房或者换个电脑干活时环境还得重新配一遍。Web端工具天然没有这个问题只要浏览器能用就行。再说求职者。Java后端面试特别喜欢问ER图相关的问题什么“一张订单表和多张明细表怎么设计”“用户和角色是多对多怎么建模”“ER图转关系模型的步骤是什么”。光说不练很难讲清楚如果你在面试前用工具把常见业务场景的ER图都画过一遍思路会顺很多。Web端工具还可以直接生成SQL建表语句比纯背理论强太多。最后是老系统维护。接手一个几十张表的项目最常见的情况是数据库里压根没有像样的ER图文档你得自己看外键、看索引、猜表关系。这时候如果有一个能“反向导入”的Web端工具把线上表结构拉出来自动生成ER图省下的时间非常可观。这三类需求本质上都在找同一类东西轻量、免费、能快速出图、能导入导出、最好还能多人协作或放进Git管理。Web端开源工具恰好能把这些要求一网打尽。1.2 我把候选工具分成了三派各挑了一款市面上的ER图工具其实不少但真正满足“开源 Web端可用 专门或非常适合画数据库ER图”这三个条件的我筛下来主要是三款正好代表了三种完全不同的使用习惯。写代码派dbdiagram.io。用类似代码的DSL语法描述表结构自动生成ER图反手就能导出各种数据库的DDL建表语句。适合习惯写代码、不想用鼠标拖来拖去的开发者。画图派draw.io也就是diagrams.net。它是一个通用开源绘图工具但内置了非常完善的数据库ER图模板和SQL导入能力画出来的图排版自由、颜值高特别适合放进课程设计报告、毕业设计论文或者技术文档。管理派phpMyAdmin。很多人不知道phpMyAdmin自带一个“设计器”功能可以连上MySQL直接在浏览器里拖动表、查看和编辑外键关系。它本质是数据库管理工具但做ER图可视化足够用最适合直接在真实库上边看边改关系。为什么不推荐Navicat、PowerDesigner、DBeaver这些常见工具因为Navicat和PowerDesigner不是开源软件DBeaver虽然是开源的老牌数据库客户端但主力是桌面端Web体验并不是它的强项。既然标题写的是Web端可用、开源那这三款就是目前最值得下手的组合。2. 第一款dbdiagram.io用写代码的姿势把ER图画明白2.1 DSL语法比拖拽更快上手只需十分钟第一次用dbdiagram.io的人最容易被它的“文本框画ER图”惊到。它不需要你把一个个矩形拖到画布上只要在左侧写一种叫DSL的简单语法右侧就会实时渲染出完整的ER图。这种交互方式对程序员来说非常友好因为表结构本身就可以用文本描述写完即所见。我以最常见的用户表、角色表、用户角色关联表为例写一个最小可用的DSLTable users { id bigint [pk, increment] username varchar(50) [unique, not null] email varchar(100) [unique] password_hash varchar(255) created_at timestamp } Table roles { id bigint [pk, increment] name varchar(50) [not null] } Table user_roles { user_id bigint [ref: users.id] role_id bigint [ref: roles.id] } Ref: users.id user_roles.user_id Ref: roles.id user_roles.role_id语法核心就三个东西Table关键字用来声明表名方括号里写字段属性Ref用来定义表之间的关系。字段属性里比较常用的有pk主键、increment自增、not null非空、unique唯一以及default: xxx这种默认值写法。关系符号也讲究表示一对多表示多对一-表示一对一。实际用下来我习惯把关系统一写成Ref: roles.id user_roles.role_id意思是“一个角色对应多个用户角色记录”语义清晰渲染出来的连线方向也符合阅读直觉。这里要特别说一下关系语法为什么重要。很多同学画ER图时把“实体和实体之间的关系”画出来了但到写 SQL 的时候就蒙圈。dbdiagram.io 的好处是你在DSL里把关系写清楚它最后导出的SQL DDL里就会自动把外键约束生成好。相当于你在文本层面把ER图转关系模型这件事提前做完了这一步对课程设计、面试讲项目帮助都很大。2.2 从已有数据库反向生成ER图一个字省事如果是全新项目从零写DSL没问题。但更多时候我们遇到的是“数据库已经跑起来了需要补一份ER图文档”这时候dbdiagram.io的反向导入功能就非常有价值。操作路径是这样打开dbdiagram.io首页点击右上角的“Create New”然后在弹出的界面里选择“From Database”接着填数据库连接信息。工具支持常见数据库我用得最多的是MySQL和PostgreSQL线上老系统如果是SQL Server也可以导入。填完连接串点一下同步它会把当前库里的表、字段、主键、外键全部拉取出来自动生成对应的DSL右侧立即出现一张现成的ER图。不过要提醒一句dbdiagram.io的在线服务本质是SaaS免费版对单个工作区的Diagram数量有限制如果你想把公司的生产库结构同步上去数据安全上要多留个心眼。我的建议是优先用它的开源版本自部署到内网或者只在本地用Docker跑起来这样导入导出都在自己的环境里安全可控。自部署也简单项目仓库里写了Docker镜像拉下来跑一个容器浏览器访问相应端口就能用体验和官网一致。2.3 导出DDL、版本管理以及我踩过的坑dbdiagram.io最吸引我的地方是它“文本即源文件”的设计。DSL写好之后整张ER图就是一串纯文本你可以直接丢进Git仓库老项目里表结构有变更时改DSL、提PR、做code review完全走代码流程。这一点是拖拽式绘图工具很难做到的也是它在开发团队里口碑好的核心原因。导出SQL方面点击右上角的“Export”选择“SQL”会弹出数据库类型选项MySQL、PostgreSQL、SQLite等。选好之后它会根据DSL里的表定义和外键关系生成完整的建表语句。我实测过MySQL 8.0下生成的DDL基本可以直接执行注意两点就行一是字段类型需要你在DSL里写清楚比如decimal(10,2)、varchar(50)这种别偷懒只写string二是导出的默认表引擎是InnoDB、字符集通常使用库默认值外键约束会自动加上生产环境导入前还是要过一眼。再说一个我踩过的坑如果DSL里某张表名跟数据库保留字冲突比如表名叫order或user导出SQL时可能报语法错误。解决办法是在DSL里用反引号把表名和字段名包起来例如Table order,对应字段也照此处理导出后才不会翻车。另一个坑是关系定义容易出现“反向”错误比如我本来想表达“用户拥有多个订单”结果写成了Ref: order.user_id users.idER图上显示的连线就会指向反。排查方式很简单看连线箭头指向箭头永远从“一”的那端指向“多”的那端如果反了就对调的方向。3. 第二款draw.io交付论文和文档的ER图它最靠谱3.1 用模板把ER图先搭起来如果说dbdiagram.io是为写代码的人准备的那draw.io就是为“要把图拿出来见人”的场景准备的。diagrams.net是一个老牌开源绘图工具浏览器打开即用也可以下载桌面版离线用它本身不限定数据库领域但内置的模板里有一套很完整的“实体关系图”形状库足以应付数据库ER图建模。我一般这样开始打开diagrams.net选择“新建空白图”然后在左侧形状库中点“软件架构”分类再勾选“ER”或“数据库”相关形状。画布上拖出“Entity”形状双击就能编辑实体名行上写字段名和类型类型右侧还可以勾选主键、外键、必填等标记。如果需要区分强弱实体、派生属性也可以手动调整形状样式比如把弱实体边框加粗、把派生属性画成虚线椭圆这些语义表达工具都支持。用模板起步的好处是形状库已经帮我们设计好了字段行的视觉结构不需要自己拼矩形和文本出来的图比较整齐。而且draw.io支持“表格”这一特殊形状双击后里会出现一个带行列的表结构直接在格子里敲字段视觉上非常接近数据库设计工具里的表控件。对于课程设计报告来说这种整齐划一的效果最讨老师喜欢。3.2 直接从SQL DDL反向生成表结构draw.io能画图不稀奇真正实用的是它可以直接把建表SQL转成ER图。这个功能藏得有点深但会了之后特别好用。菜单路径是顶部菜单栏“Extras” - “Database” - “Reverse Engineer”。它会弹出一个小窗口让你选择数据库类型和填写连接参数理论上可以直接连MySQL、PostgreSQL生成表结构。但我在实际使用中发现直接连数据库这一路经常会因为JDBC驱动版本问题失败尤其是网页版里内置驱动不完整的时候。所以我更推荐另一种更稳的做法先在客户端工具里把建表SQL导出比如用mysqldump --no-data或者直接在查询窗口里执行SHOW CREATE TABLE t_user拿到DDL然后把这段SQL贴进draw.io的“Extras” - “Database” - “Import from SQL DDL”里它解析DDL后自动生成所有表图形和关系连线。实测下来只要SQL用的是标准建表语法外键用FOREIGN KEY (...)写清楚了导入效果就很理想。表与表之间的外键关系会自动连好线方向也是从父表指向子表。这里有个小经验导入之后不要急着布局draw.io自动生成的位置通常很乱建议先用“Edit” - “Select All”选中全部图形再使用“Arrange”里的布局功能做一次自动整理比如“Horizontal Flow”或“Vertical Flow”把连线交叉降到最低之后再手工微调一下关键表的位置出来的图就相当能打了。3.3 排版、导出和嵌入文档的细节draw.io在“让ER图好看”这件事上几乎没有对手。你可以随意拖动每个表块、修改连线颜色、给主键字段加黄色高亮、把一对多关系的“一”这一端用一个小圆点或十字线标识出来所有细节都能调整。对于要交纸质报告或者放到答辩PPT里的同学来说这一步经常会拉开跟同学的差距。导出方面推荐用PNG或SVG。PNG在“File” - “Export as”里可以设置缩放倍数一般导出2倍或3倍插进Word或PDF不会糊。SVG是矢量格式放在网页或LaTeX里渲染最清晰而且文件体积小。如果图太大还可以勾选“Crop”把画布沿图形边缘裁切干净避免导出的图片四周一大圈空白。还有个容易被忽略的功能draw.io文件可以直接保存为.drawio格式但这个格式本质是XML也能导出成HTML、Markdown嵌入链接。如果平时用Typora或Obsidian写笔记可以把draw.io的SVG直接粘贴进文档里后续改图后重新导出一份覆盖就行记笔记和画ER图之间切换非常丝滑比在Word里贴位图舒服太多。4. 第三款phpMyAdmin 设计器连数据库直接改关系4.1 打开设计器前必须懂的存储引擎与外键前两款工具解决的是“从模型到文档”的问题第三款工具phpMyAdmin解决的是“我在真实数据库上干活”的问题。很多人把phpMyAdmin当成一个简单的网页版SQL查询工具其实它内置了一个叫“设计器”的模块可以在浏览器里可视化展示表之间的关系也能直接新增外键约束、调整表关联全程不需要打开额外的桌面软件。但要用好设计器有一个概念必须先搞清楚MySQL里不是所有存储引擎都支持外键约束。以前用得很普遍的MyISAM引擎压根不支持外键就算你在SQL里写了FOREIGN KEY它也不报错但不会真正生效而InnoDB引擎是支持外键的设计器里能正常看到关系连线的前提就是表引擎为InnoDB且已经建立了外键。很多人打开设计器发现一堆表摆在画布上却没有任何连线90%的原因就是表用了MyISAM或者建表时压根没定义外键。phpMyAdmin 5.x版本在设计器页有“显示/隐藏关系”的开关但前提仍然是表之间存在可识别的关系定义。所以我的习惯是动手之前先用一条SQL把所有表的引擎和关联字段过一遍比如通过information_schema.KEY_COLUMN_USAGE查看哪些字段被当作外键引用心里有数之后再进设计器操作。4.2 三步在浏览器里把图书借阅系统的关系拉出来我用一个很常见的课程设计场景“图书借阅系统”来讲操作流程一共三步。第一步在phpMyAdmin里建好三张表users读者、books图书、borrow_records借阅记录。建表时所有表都用InnoDB引擎主键字段设置为自增整数。borrow_records里放两个业务外键字段user_id、book_id这两个字段的类型必须和主表的主键类型完全一致否则后面建立外键会失败。第二步在borrow_records表的结构页里先给user_id和book_id分别创建普通索引。很多人第一次操作会漏掉这一步但MySQL外部键要求被引用列必须有索引主键列本来就自带索引所以这一步主要针对子表的外键列。索引建好后进入“操作”页或“关系视图”页在对应的下拉框里选择引用的父表和父字段保存即可。第三步回到数据库首页点顶部“设计器”标签你会看到三张表已经被拖到画布上users.id到borrow_records.user_id、books.id到borrow_records.book_id之间出现了连线。连线的箭头方向表示从父表指向子表。你还可以在画布上拖动表的位置调整布局点击“保存”后未来再打开设计器布局会保留下来。整个过程都在浏览器里完成对只装了宝塔面板或者XAMPP环境的人非常友好。4.3 设计器解决什么、不解决什么phpMyAdmin设计器的定位跟前面两款不一样它不擅长从零画一张概念模型图因为它的画布编辑能力很弱不能画菱形、椭圆这些表达属性和联系的元素。它的强项是“数据库已经存在我要快速看清关系并且直接改掉关系”。比如我在维护一个老PHP项目时发现某张表的数据异常想确认它跟订单表、用户表之间有没有外键联动用设计器打开一眼就能看清。再比如课程设计后期老师要求“必须体现外键约束”你可以直接在设计器里把相关表的关系补上再回到SQL页面执行最终提交的设计报告里既有ER图说明也有真实的数据库约束比纸上谈兵强得多。所以我的结论是phpMyAdmin设计器不要拿来当主力建模工具它是你连库操作时的“辅助视图”。真正需要出图给老师、给同事看的时候还是回到dbdiagram.io或draw.io更合适。5. 三款工具横向对比与选型清单5.1 一张表看懂三款工具的脾气工具用多了之后你会发现没有绝对的好坏只有合不合适。为了让你快速决策我整理了一张对比表把三款工具的使用体验、开源情况和适用场景一次说清。对比维度dbdiagram.iodraw.io (diagrams.net)phpMyAdmin 设计器开源状态是可自部署是是Web端可用是是是上手方式写DSL文本拖拽图形操作真实数据库从数据库反向生成ER图支持连接数据库即可支持建议用SQL DDL导入支持但要先有外键导出SQL建表语句一键导出多种数据库DDL不支持自动导出建表SQL本身就是数据库管理工具出图美观度中上自动布局整齐最高完全自由排版一般作为辅助视图适合放进论文/文档可以截图或导出PNG最推荐导出高清图不太建议适合场景快速建模、代码团队协作课程设计、论文插图数据库运维、关系核对这张表背后其实是一个选型逻辑先确定你这次要“得到什么产出物”。如果产出物是建表SQL和表结构模型选dbdiagram.io如果产出物是一张干净美观的ER图插进文档选draw.io如果产出物是线上库的关系理顺、外键补齐选phpMyAdmin设计器。5.2 按你的身份选工具少走弯路我不太建议一上来就把三款工具全部学一遍按身份和当前任务来选会高效很多。如果你是正在做数据库课程设计或毕业设计的学生我的首选组合是“dbdiagram.io 建模 draw.io 出图”。先花半小时在dbdiagram.io里把几张核心表的关系画出来导出SQL看建表语句是否合理然后把模型截图或者把表结构导入draw.io调整排版、补充说明文字得到一张能放进报告里的精美ER图。整个过程不需要安装任何桌面软件浏览器全搞定。如果你是准备Java后端面试的开发者重点用dbdiagram.io。面试前拿“用户-角色-权限”“订单-订单明细-商品”“学生-课程-选课”三套经典业务各建一套ER图把多对多关系拆关联表、一对多关系加外键这些套路练熟。问到你时直接说“我习惯用dbdiagram.io来建模文本形式方便评审”会显得你确实有项目沉淀。如果你是运维或者要在老系统上干活的人先学会phpMyAdmin设计器。它能让你在最短时间内看清生产库的表关系而且修改外键约束就在网页上完成以后再面对“这个表能不能删”“那个字段能不能改类型”之类的问题时不用再去翻一堆没有文档的建表脚本。6. 一套顺手的工作流从概念ER图到建表语句6.1 完整流程演示以“学生选课系统”为例工具讲再多不如走一遍完整流程。我以课程设计里出现频率极高的“学生选课系统”为例演示如何用Web端开源工具把概念模型落到建表语句。先在dbdiagram.io里写DSL。业务规则是一个学生可以选多门课程一门课程可以被多个学生选择典型的M:N关系。按照第三范式需要拆出一张关联表。DSL如下Table students { student_id bigint [pk, increment] name varchar(50) [not null] major varchar(100) enroll_year int } Table courses { course_id bigint [pk, increment] title varchar(100) [not null] credit int teacher varchar(50) } Table selections { id bigint [pk, increment] student_id bigint [ref: students.student_id] course_id bigint [ref: courses.course_id] score decimal(5,2) selected_at timestamp }右侧的ER图生成后检查一下连线students和selections之间是一对多courses和selections之间也是一对多两个一对多合并起来就还原了学生和课程之间的多对多关系。这一步至关重要很多新手在概念模型里直接画学生和课程之间的M:N连线到了关系模型阶段就不知道该怎么落表正确做法永远是拆出第三个表。然后点导出SQL选MySQL得到建表语句。再把DDL粘到draw.io里通过“Extras”-“Database”-“Import from SQL DDL”反向生成图形手动整理一下布局加上标题和说明文字一张论文级的ER图就完成了。最后把SQL拿到phpMyAdmin里执行回到设计器查看三张表之间的关系已经真实出现在库里。从纯文本模型到线上数据库整个链路不用离开浏览器。6.2 ER图转关系模型时最容易被扣分的三个点ER图转关系模型是数据库课程设计和面试中的必考环节但三个高频错误几乎年年都有人犯。第一多对多关系没有拆中间表。很多人画完ER图直接按实体生成表然后告诉老师“学生和课程是多对多”。但在关系模型里多对多必须拆出一张关联表比如上面的selections表主键可以是复合主键(student_id, course_id)也可以单独设一个自增id然后把两个外键加上唯一索引。不拆表的话后续根本无法表达“某个学生选了某门课并且考了多少分”这样的数据。第二一对多关系的外键放错端。比如班级和学生是一对多正确做法是在“多”的这一端也就是学生表里加class_id外键。经常有人反过来在班级表里加student_id字段这样设计不仅冗余而且一个班级只能记录一个学生完全违背业务语义。我分享一个记忆方法外键永远放在“多”的那一端或者说放在子表里。第三忽略一对一关系的合并优化。如果ER图里两个实体是严格的一对一关系比如用户和用户详情在关系模型里可以直接合并成一张表减少一次连接查询也省掉一个外键。只有在两个实体各自被大量其他表引用、或者冷热数据差异明显时才建议保留两张表并建立一对一外键。答辩时如果能把这个取舍讲清楚会显得你不是在机械背概念。7. 实战中的常见问题与排查技巧实录7.1 常见问题速查工具报错与逻辑错误的对应方案我在评论区见过最多的问题集中在“连不上库”“导不出图”“关系线不显示”这三类我把典型情况和解决办法整理成了一张速查表。问题现象可能原因排查与解决办法dbdiagram.io 连不上 MySQL数据库端口没对外开放或账号没有远程访问权限先在本机客户端用同一账号连一次检查MySQL用户是否限制了host自部署时注意容器网络dbdiagram.io 导出的SQL报字段类型错误DSL里字段类型写得过于简单与实际业务不匹配尽量写完整类型如decimal(10,2)、varchar(64)、datetimedraw.io 网页版连数据库报JDBC驱动错误Web环境缺少对应数据库驱动或驱动版本不匹配改用“Import from SQL DDL”先拷贝建表语句再导入稳定且不依赖网络draw.io 导入DDL后关系线全丢失外键定义在CREATE TABLE的末尾或表用了MyISAM检查DDL里是否有FOREIGN KEYMyISAM表不会生成外键改用InnoDB重建phpMyAdmin 设计器看不到表表没有外键关系或者浏览器缓存异常为子表外键字段建索引并定义外键约束刷新设计器页面phpMyAdmin 建立外键失败字段类型不一致或者父表字段不是索引核对两端字段类型完全一致给父表被参考列增加唯一索引或直接使用主键这张表里的每条都是我实际碰到过或帮别人排查过的不是从文档里抄来的。特别是draw.io的JDBC驱动问题我早期在多人协作时反复踩后来干脆放弃在线直连数据库一律走“SQL DDL导入”路线问题彻底消失。7.2 我踩过的一些坑希望你不要再踩最后一个部分分享几条比较零散但很实际的个人经验。第一条ER图的“最终版”一定要导出保存为PNG或SVG不要只保留DSL或drawio源文件。课程设计答辩前老师或队友很可能让你改图改完又让你重新发一份到群里。如果你只有在线链接对方未必能打开如果只存了源文件而没有导出图手机上预览也不方便。我的习惯是工程目录下建一个docs/database文件夹里面同时放源文件和导出的图片命名带好日期和版本号。第二条数据库字段的注释一定要养成习惯写清楚。dbdiagram.io的DSL里可以用note: 注释内容给表或字段加说明draw.io里也可以在字段行后面单独加一列备注。现实中我接手过太多没有注释的数据库表名缩写根本猜不出含义比如t_rl_ua_cfg再好的ER图工具也救不了这种表。ER图不只是给老师看的更是给未来的自己留的线索。第三条工具终究只是外挂ER图背后的建模思想才是关键。你在面试里可以提自己用Web端开源工具做数据库设计这是加分项因为说明你有工程化意识但你也要能解释清楚为什么订单明细表要单独抽出来、为什么要用自增主键而不是用业务编号做主键、为什么外键在InnoDB下才有约束意义。工具帮你把图画出来但让你把项目讲明白的还是对数据关系的理解。就说这么多希望能帮你少走点弯路。我自己现在的习惯是电脑上已经很少安装专门的ER图桌面客户端了大部分数据库建模需求都是开着浏览器用这篇文章里的三款工具配合完成。工具够轻、够开源、够Web效率反而更高。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门