piapia123
zh

在线数据库设计:ER 图、方言转换与结构检查

网络

所有处理都在浏览器本地完成,数据不上传服务器

表结构关系图(PK / FK 已标出)

把建表语句贴进左边,右边给你三样东西: 1. 表关系图 —— 每张表一个盒子,主键与外键标出来,外键画成连线; 2. 目标方言的建表语句 —— MySQL / PostgreSQL / SQLite 三选一,自动转换类型与自增写法; 3. 结构检查 —— 下面这些是重点。 检查为什么值得单独做:在几十张表的 schema 里靠眼睛找问题是不现实的,而这里的每一条都是确定的事实: · 外键指向的表或列不存在(图上看不出来,建表时才报错); · PostgreSQL 不会自动为外键列建索引(MySQL 会)—— 关联查询与父表删除都会变慢; · 表没有主键、列名重复、自增用在非整数类型上; · 列名是 SQL 保留字却没加引号(多数数据库会直接报语法错误); · `VARCHAR` 没写长度(MySQL 报错、PostgreSQL 当不限长); · 没写 `ON DELETE`(默认是 RESTRICT,删父行会被拦住)。 转换不静默丢东西:类型映射表是有限且写明的,映射不了或会丢语义的(MySQL 的 `unsigned`、`ON UPDATE CURRENT_TIMESTAMP`、`ENUM`)一律给出一条说明。拿着输出的 SQL 去建表,不该在几个月后才发现少了个约束。 解析范围是明确限定的:只认 `CREATE TABLE` 与 `ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY`。视图、触发器、生成列表达式一律不进解析 —— 遇到不认识的东西会给一条「这行没解析」的警告,而不是猜一个看似合理的结构(静默丢弃会让图漂漂亮亮地少一张表)。 全部在浏览器本地完成,不上传任何内容。

功能

  • 表关系图:表名、列名与类型、PK / FK 标记、外键连线
  • 三种方言的建表语句:MySQL / PostgreSQL / SQLite
  • 类型映射:AUTO_INCREMENT → SERIAL、DATETIME → TIMESTAMP、TINYINT(1) → BOOLEAN 等
  • 生成的语句按依赖顺序排列(被引用的表在前),整段拿去执行不会因外键失败
  • 结构检查:外键指向、缺失的索引、主键、重复列名、保留字、类型写法、ON DELETE
  • 检查结果按「错误 / 警告 / 提示」分级,每条都带具体对象名
  • 转换说明:丢掉的语义逐条列出,不静默处理
  • 解析不了的行会被列出来,而不是悄悄丢掉
  • 只在必要时给标识符加引号(保留字或含特殊字符时)
  • Ctrl / Cmd + Enter 直接分析;预填了一份示例可以改

使用方法

  1. 把建表语句贴进左边的文本框(或直接用预填的示例)
  2. 选目标方言:MySQL / PostgreSQL / SQLite
  3. 点「分析」,或按 Ctrl / Cmd + Enter
  4. 左侧出关系图,右侧出表清单、检查结果与生成的 SQL
  5. 用每行的复制按钮取走生成的建表语句

常见问题

支持哪些 SQL 写法?
只支持 `CREATE TABLE`(列定义、列级与表级主键、唯一、索引、外键、CHECK)与 `ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY`。视图、触发器、存储过程、生成列表达式、`DEFAULT` 里的复杂表达式一律不解析 —— 遇到就在结果里给一条「这行没解析」的警告。宁可不给,也不猜。
为什么 PostgreSQL 会提示外键列没有索引?
因为 PostgreSQL 不会自动为外键的引用列建索引,而 MySQL(InnoDB)会自动。没有索引时,关联查询和删除父表记录都会退化成一行的全表扫描。这是按目标方言区分的提示:选 MySQL 时不会出现。
类型转换可靠吗?会丢东西吗?
映射表是有限且写在明处的(约 20 条常见类型),每条都能在结果里对照。会丢语义的转换一定给说明,例如 `unsigned` 在 PostgreSQL 里没有对应写法(取值范围会变)、`ENUM` 会退化成 TEXT(取值约束丢失)、`ON UPDATE CURRENT_TIMESTAMP` 在目标方言里需要触发器才能实现。没把握的类型原样保留并提示,不猜。
生成的语句可以直接执行吗?
可以直接执行,而且按依赖顺序排列(被引用的表在前),整段拿去跑不会因为外键指向还不存在的表而失败。但注意两点:一是 SQLite 的外键默认不生效,要在每条连接上执行 `PRAGMA foreign_keys = ON`(工具会在生成的 SQL 里写上这句的提示);二是工具不会生成数据迁移逻辑 —— 已有数据怎么搬是你的决定。
能反向做吗(从数据库导出建表语句)?
不能,这个站没有服务端可以连你的数据库。但你可以用 `mysqldump --no-data`、`pg_dump --schema-only` 或 `sqlite3 .schema` 导出 DDL,再贴进来 —— 那正是这个工具最常见的用法。

相关工具