开源Web端ER图工具选型:WWW SQL Designer、Adminer与SchemaSpy实战对比

发布时间:2026/9/13 4:56:32
开源Web端ER图工具选型:WWW SQL Designer、Adminer与SchemaSpy实战对比 做数据库设计最烦的往往不是写SQL本身而是画ER图的时候发现工具不对桌面端软件装了一圈换台电脑又得从头折腾在线平台倒是方便可不少工具不是开源关系一多就开始收费数据还要放到别人的服务器上。前阵子我把团队里的数据库设计流程整体翻了一遍最后留下三款开源的Web端工具WWW SQL Designer、Adminer、SchemaSpy。它们并不是同一类东西但组合起来几乎能覆盖日常和ER图打交道的所有场景——从零建模、查看真实库关系、自动生成数据库文档。这篇文章不列空泛的功能清单直接讲它们各自的设计思路、使用场景、部署细节以及我实际踩过的坑。1. 内容整体设计与思路拆解1.1 为什么我坚持把ER图工具放在Web端早期团队画ER图用的都是本地桌面软件比如MySQL Workbench、PowerDesigner优点是功能全但协作体验很差。设计稿在A同事电脑上B同事想查看只能截图发群里等图传到C手上字段早就改了好几轮。换成Web端工具之后整个流程变成部署一套服务所有人打开浏览器访问设计稿统一存储在服务器目录里谁改了什么一目了然。Web端的另一个好处是跨平台。开发机是Windows、测试机是macOS甚至有人在Linux上办公浏览器一开就能用不用再为了一个ER图工具去维护不同平台的安装包。更重要的是对于企业内部数据库设计开源Web工具可以把数据留在内网不依赖外部SaaS服务。这一点在涉及敏感业务表结构时尤其重要很多团队一开始图省事用在线平台后来合规要求收紧又被迫把数据迁回来白折腾一轮。从成本角度看三款工具都是开源免费的部署要求也不高。只要有PHP环境或者Java环境基本都能跑起来。它们相互之间不是替代关系而是互补关系一个负责“画”一个负责“看”一个负责“自动产出”。下面我把分工先整理清楚。1.2 三款开源工具的分工定位这里先用一张表格把三款工具的基本情况和适用场景摆出来方便你快速判断该看后面哪一节。工具运行方式主要用途适合人群WWW SQL DesignerPHP JavaScript Web应用从零绘制ER图、导入现有表结构、导出SQL项目初期的数据建模人员Adminer单文件PHP放到Web目录即用连接真实数据库快速查看ER关系顺便管理表结构和数据开发、DBA的日常运维查看SchemaSpyJava命令行工具生成静态HTML网站自动扫描数据库结构产出带ER图的数据库文档站点需要交付文档或做自动化集成的团队三者最大的差异在于“交互性”。WWW SQL Designer是真正的交互式画图工具你可以拖拖拽拽把实体、字段、外键关系搭出来Adminer虽然本身是数据库管理工具但它的ER图功能能直接映射真实库里的外键关系适合“查一下当前库到底是怎么设计的”SchemaSpy则完全没有交互界面它更像一个文档生成器跑完命令就给你一份完整的HTML报告ER图只是其中的一部分。还有一个容易被忽略的点WWW SQL Designer和Adminer都是PHP写的SchemaSpy是Java写的。这意味着如果你手里只有一台轻量服务器部署PHP工具会更省资源如果团队已经有Java环境SchemaSpy的集成成本会更低。选型时别只看功能运行环境往往才是第一约束。1.3 按项目阶段选型而不是按名气选型很多文章推荐工具时习惯列一堆特性但实际工作中工具好不好用要看它出现在项目生命周期的哪个阶段。如果是新项目刚起步还没有完整的表结构你的核心诉求是“从无到有把实体和关系想清楚”这时候WWW SQL Designer最合适。你可以像在白板上画草图一样把用户、订单、商品这些实体先建出来再逐步补字段、定类型、拉关系最后导出建表SQL。如果项目已经上线数据库里一堆表你想快速搞清楚某张表和哪些表有关联或者想确认外键是否建对了最适合的是Adminer。它连上真实数据库后一个按钮就能把表关系图画出来比翻代码、查SQL直观得多。如果是交付阶段或者团队需要维护一份长期有效的数据库设计文档修一次表就更新一次文档那么SchemaSpy才是正解。它能自动化地扫描库结构生成带注释、带索引、带关系的网页版文档放进内部文档站或者CI流程里都行。一句话总结画图选WWW SQL Designer看库选Adminer自动产出文档选SchemaSpy。下面我分别拆开讲。2. 核心细节解析与实操要点2.1 WWW SQL Designer交互式拖拽的老牌选手WWW SQL Designer是捷克开发者ondras的一个老项目至今还在维护。它最核心的思路是用浏览器当作画布把数据库表建模转换成XML格式保存再根据XML生成对应数据库方言的SQL脚本。界面左侧是工具栏中间是画布操作逻辑非常接近visio但又专门为数据库字段设计做了优化。它支持MySQL、PostgreSQL、MSSQL、Oracle、SQLite等多种数据库方言。使用时不需要预先配置数据库连接它完全可以离线建模。也就是说你可以先画图再确定最终落地到哪种数据库导出SQL时再选对应的方言类型。这个特性对刚开始设计、还没确定生产环境用MySQL还是PostgreSQL的项目非常友好。它还有一个“从已有数据库加载”的功能。在界面的“Database”菜单里填好连接信息它会读取现有表结构反向生成ER图。这一点特别适合接手老项目时用来快速梳理业务模型不用一上来就看一大坨建表SQL。不过要提醒的是反向导入的质量取决于数据库中主键、外键定义得是否规范。字段间的关联如果没建外键导入后的图里也是断开的。实操时最容易踩的坑是字符集。默认情况下导出的SQL如果带中文表注释或字段注释直接用命令行导入MySQL可能会变成乱码原因往往是PHP环境默认字符集和数据库字符集不一致。我在部署时一般会在PHP文件里强制设置默认编码为UTF-8导出SQL前也确认一下选择的是UTF-8选项基本能避开这个问题。2.2 Adminer单文件神器顺带把ER图看了Adminer在很多开发者的认知里是一款“单文件数据库管理工具”一个adminer.php就能替代phpMyAdmin支持MySQL、PostgreSQL、SQLite、MS SQL、Oracle等数据库。不少人在它身上主要用数据浏览和SQL执行功能却忽略了它还带一个很实用的ER图模块。在Adminer里选中一个数据库后页面顶部会有几个功能标签其中就有一个专门显示ER图的按钮。点击之后它会自动读取这个数据库的所有表和表间外键关系生成一张完整的关系图。表以方框展示主键、唯一键、普通字段分别用不同图标标出外键关系用连线连接。这张图和你在建模工具里画出来的ER图基本等价非常适合快速确认“当前真实库的模型到底长什么样”。但务必清楚一点Adminer的ER图是“查看型”功能不是“设计型”功能。你可以在Adminer里新增表、修改字段、加索引但它不会提供一个可视化拖拽界面让你像画图一样建模。它展示的是数据库里已经存在的关系如果没有外键定义那么连线上就不会体现出来。所以我更推荐把它当作日常运维工具而不是建模工具。有一个容易忽略的细节表引擎会影响ER图的显示效果。MySQL里如果表用的还是老旧的MyISAM引擎即使你建了所谓的“关系”也不会真正生成外键约束Adminer的ER图里自然就看不到连线。遇到这种情况需要先把表引擎改成InnoDB并显式添加外键约束关系图才会正常显示。换成新版MySQL或者MariaDB后默认引擎一般就是InnoDB但老库升级后这个问题依然可能出现。2.3 SchemaSpy用命令行把数据库变成可视化站点SchemaSpy的思路和前面两款的交互式风格完全不同。它是一款Java写的命令行工具通过JDBC连接数据库读取系统表里的元数据然后生成一个静态HTML站点。这个站点里有所有表、字段、索引、约束、注释以及基于Graphviz生成的ER关系图。你不需要在浏览器里实时连接数据库只要跑一次命令产出的文件夹可以放到任意Web服务器上浏览甚至可以打包发邮件。它的核心工作流程可以拆成四步加载JDBC驱动连接数据库、读取schema信息、分析表和表之间的外键关系、用Graphviz把关系画成SVG或PNG图片并嵌入HTML页面。整个过程不需要写代码只需要配置好命令行参数。这也是它最大的优势非常适合自动化。你可以在每次发版后用定时任务或CI流水线跑一次把最新的数据库结构同步到文档站点彻底告别“文档和真实库不一致”的尴尬。SchemaSpy对数据库类型的支持比较广MySQL、PostgreSQL、Oracle、SQL Server、SQLite等常见数据库都能跑。不过不同数据库需要对应的JDBC驱动在命令里要用-dp参数指定驱动文件位置。另外生成的ER图依赖Graphviz的dot命令所以服务器上必须装好Graphviz并且把dot可执行文件路径通过-gv参数告诉SchemaSpy否则会报错。要注意的是它生成的ER图是“整个schema”级别的图表一多就会非常密连线交缠在一起。SchemaSpy也提供了按表查看关系图的能力但整体图在几十张表以上的库中可读性比较差。这个问题我在后面会讲怎么缓解。3. 实操过程与核心环节实现3.1 用 WWW SQL Designer 从零绘制用户订单ER图我们以一个最简单的用户订单场景来演示。假设系统里有users用户表和orders订单表一个用户可以有多条订单订单表通过user_id关联用户表。用WWW SQL Designer操作的完整流程如下。第一步准备运行环境。先确认服务器或本机有PHP环境建议PHP 7.2以上。然后下载WWW SQL Designer源码解压到Web目录比如/var/www/html/sqldesigner。如果只是想本地试用可以直接在项目目录下执行php -S 127.0.0.1:8080然后浏览器访问http://127.0.0.1:8080看到编辑界面就算成功了。第二步新建表。点工具栏上的表格按钮在画布上创建第一个表双击表名改成users。再双击表体进入字段编辑界面添加字段。我一般建议用户表至少包含这几个字段users: id INT PRIMARY KEY AUTO_INCREMENT username VARCHAR(50) email VARCHAR(100) created_at DATETIME第三步创建订单表。在旁边再拖出一个新表命名orders添加字段orders: id INT PRIMARY KEY AUTO_INCREMENT user_id INT order_no VARCHAR(32) amount DECIMAL(10,2) created_at DATETIME在字段编辑时把user_id的类型和长度设置成和users.id一致方便后面建立外键关系。第四步建立关系。在工具栏选择关系连线从users表的id字段拖到orders表的user_id字段。WWW SQL Designer会弹出一个关系配置窗口可以选择关系基数比如一对多还会要求确认是否创建外键约束。保存后画布上会出现一条连线把两张表关联起来。第五步导出SQL。点击“Export SQL”菜单选择目标数据库方言。这里选MySQL工具会自动生成建表语句和外键约束。生成的SQL大致长这样CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100), created_at DATETIME ); CREATE TABLE orders ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT, order_no VARCHAR(32), amount DECIMAL(10,2), created_at DATETIME, CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users(id) );如果设计内容需要长期保存利用工具自带的XML导入导出功能把设计稿存成文件放到Git仓库里当版本管理也是一个很好的习惯。这样每次改动都能留下记录比在桌面工具里做设计更好追踪。3.2 用 Adminer 快速查看现有库的ER图Adminer的部署比一般软件都简单。从官网下载最新的adminer.php单文件大小不到1MB放到任意Web目录比如/var/www/adminer.php然后访问http://your-server/adminer.php登录界面就出来了。连接MySQL时驱动默认选择MySQL输入服务器地址、用户名、密码和数据库名即可。登录后左侧能看到数据库里所有表。要查看ER图点击数据库名选中它在顶部工具栏中找到ER图按钮点击后页面就会加载整张关系图。如果你是想确认某张表和哪些表有关系可以先点击表名进入表结构页面再切换到ER图视图。Adminer的ER图默认展示整个库的关系所以表不多时很直观表特别多的话依旧会显得密集此时可以通过浏览器缩放功能放大局部区域查看。在实际操作中你最需要检查的点是“外键是否真正建出来了”。在ER图中两张表之间如果没有连线并不代表业务上没有关联很可能只是当初建表时没有添加外键约束。这时候在Adminer里进入子表结构页面添加外键约束回头再看ER图就会发现连线出现了。我自己的习惯是先用Adminer把现有库的设计浏览一遍发现问题后用SQL在Adminer的执行窗口里修补改完马上能在ER图里看到变化效率很高。如果你不希望别人远程连接生产库也可以把Adminer部署在一台内网跳板机上数据库连接配置只指向内网地址避免直接暴露生产库端口。Adminer本身是轻量的跑在一台1核1G的云主机上都没有压力。3.3 用 SchemaSpy 自动输出数据库文档站点我用SchemaSpy的机会最多因为每次发版前都需要确认一遍数据库结构变化并同步给同事。它的核心命令很简单但第一次使用需要提前准备三样东西Java环境、Graphviz、对应数据库的JDBC驱动。这里以MySQL为例。在服务器上装好Java和Graphviz然后下载SchemaSpy最新jar包和MySQL Connector/J驱动放在同一个目录。命令大致如下java -jar schemaspy.jar \ -t mysql \ -host 127.0.0.1 \ -port 3306 \ -db mydb \ -u root \ -p password \ -dp /path/to/mysql-connector-java.jar \ -o /var/www/html/schema \ -gv /usr/bin/dot \ -charset UTF-8参数解释一下-t是数据库类型-host和-port是数据库地址和端口-db是要扫描的数据库名-u和-p是登录账号密码-dp是JDBC驱动文件路径-o是输出目录-gv是Graphviz的dot可执行文件路径-charset强制指定UTF-8避免中文乱码。命令执行完成后输出目录里会生成大量HTML文件和图片。这时只要用浏览器打开/var/www/html/schema/index.html就能看到数据库文档首页左边是表列表右边是表的详细信息顶部有图表、表、关系、约束等标签页。其中“关系”标签页展示的就是整个库的ER图用Graphviz画出来的SVG图可以无限缩放。我把这个命令写进了团队的CI脚本里。每天凌晨定时跑一次扫描测试库结构并发布到内部文档站生产环境每次发布后手动触发一次生成的结构快照统一归档。这样的好处是谁改了什么字段、什么时候加的索引查文档站的历史记录都能对得上。SchemaSpy还支持自定义模板但一般团队默认模板已经够用没必要在这上面花太多时间。4. 常见问题与排查技巧实录这几款工具我用了很长时间踩过的坑不算少。我把最常遇到的问题和排查思路整理成一个速查表你可以直接对照处理。现象可能原因解决方法WWW SQL Designer导出的SQL中文变问号PHP环境或数据库连接默认字符集不是UTF-8强制设置UTF-8编码导出SQL时选择对应的UTF-8选项Adminer ER图里表之间没有连线表引擎为MyISAM或没有显式定义外键修改表引擎为InnoDB在子表上添加外键约束SchemaSpy执行时报“Graphviz not found”系统没装Graphviz或dot未在PATH中安装graphviz并使用-gv参数指定dot的绝对路径SchemaSpy生成的图中文乱码系统缺少中文字体或未指定字符集安装中文字体命令中加-charset UTF-8SchemaSpy连接MySQL 8失败MySQL 8默认使用caching_sha2_password认证插件驱动版本过旧升级JDBC驱动或为SchemaSpy创建专用账号并指定mysql_native_password大库生成SchemaSpy文档超时表数量多Java默认堆内存不足增加JVM堆内存如-Xmx1g或只扫描需要的schemaAdminer打开目录显示403Web服务器没配置index.php处理在Nginx或Apache中配置PHP默认文件除了表格里的这些我还想补充一个思路层面的排查技巧。刚开始用SchemaSpy时生成出来的ER图总是乱成一团几十张表的关系全部挤在一张图里根本看不清楚。后来我发现SchemaSpy可以对生成图的范围做控制比如排除某些系统表或只关注某些核心表具体可以在命令行参数里指定表名过滤规则。如果你的库表很多别硬扛整库关系图优先把核心业务表单独生成一份读起来会舒服很多。还有一次用Adminer查看一个PostgreSQL数据库ER图怎么都不显示关系。后来发现是用户权限的问题当前登录的账号没有访问系统目录表的权限工具自然读不到外键元数据。解决办法是换一个拥有足够权限的账号或者显式授权当前账号访问相关信息。这一点在MySQL和PostgreSQL里都适用排查时不要只顾着业务表先确认工具是否有权限读取元数据。最后再分享一个小技巧。WWW SQL Designer的XML设计文件其实非常适合做版本管理。我们把设计稿的XML文件放在Git仓库里每次评审前导出一次同事直接打开XML或导出成SQL查看差异。相比把图截图发到群里这种方式的变更记录要清晰得多。你完全可以根据自己的项目场景把三款工具组合成一套流程设计期用WWW SQL Designer开发期用Adminer随时查库交付期用SchemaSpy自动生成文档。三套工具全是开源Web端方案不绑机器、不锁数据遇到底层有问题还能自己改代码这在日常项目里非常省心。