三款开源Web端ER图设计工具,让数据库建模告别桌面客户端
2026/9/9 8:12:59 网站建设 项目流程

做数据库课程设计或者维护老项目的时候,有一件事永远绕不开,那就是数据库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图。这种交互方式对程序员来说非常友好,因为表结构本身就可以用文本描述,写完即所见。

我以最常见的用户表、角色表、用户角色关联表为例,写一个最小可用的DSL:

Table 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里某张表名跟数据库保留字冲突,比如表名叫orderuser,导出SQL时可能报语法错误。解决办法是在DSL里用反引号把表名和字段名包起来,例如Table `order`,对应字段也照此处理,导出后才不会翻车。另一个坑是关系定义容易出现“反向”错误,比如我本来想表达“用户拥有多个订单”,结果写成了Ref: order.user_id < users.id,ER图上显示的连线就会指向反。排查方式很简单:看连线箭头指向,箭头永远从“一”的那端指向“多”的那端,如果反了,就对调<的方向。

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_idbook_id,这两个字段的类型必须和主表的主键类型完全一致,否则后面建立外键会失败。

第二步,在borrow_records表的结构页里,先给user_idbook_id分别创建普通索引。很多人第一次操作会漏掉这一步,但MySQL外部键要求被引用列必须有索引,主键列本来就自带索引,所以这一步主要针对子表的外键列。索引建好后,进入“操作”页或“关系视图”页,在对应的下拉框里选择引用的父表和父字段,保存即可。

第三步,回到数据库首页,点顶部“设计器”标签,你会看到三张表已经被拖到画布上,users.idborrow_records.user_idbooks.idborrow_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图生成后,检查一下连线:studentsselections之间是一对多,coursesselections之间也是一对多,两个一对多合并起来就还原了学生和课程之间的多对多关系。这一步至关重要,很多新手在概念模型里直接画学生和课程之间的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)datetime
draw.io 网页版连数据库报JDBC驱动错误Web环境缺少对应数据库驱动,或驱动版本不匹配改用“Import from SQL DDL”,先拷贝建表语句再导入,稳定且不依赖网络
draw.io 导入DDL后关系线全丢失外键定义在CREATE TABLE的末尾,或表用了MyISAM检查DDL里是否有FOREIGN KEY;MyISAM表不会生成外键,改用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,效率反而更高。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询