数据库优化:JSON To MySQL模式 — Numio
根据示例 JSON 生成 MySQL CREATE TABLE 语句。根节点变为名为 generic 的表;每个嵌套对象或数组变为子表,并带有指向父表主键的外键。
在编写正式迁移之前,为 API 载荷草拟规范化的表结构。
JSON
MySQL Schema
适用场景
- 在编写正式迁移之前,为 API 载荷草拟规范化的表结构。
- 把数据从文档数据库迁到 MySQL 时,查看文档中哪些嵌套对象和数组需要单独建表。
使用方法
- 将 JSON 对象或示例记录数组(会合并为一张表)粘贴到左侧编辑器,或用加载文件按钮打开 UTF-8 文件。
- 查看生成的表:根表为 generic,子表为 generic_<key>,通过 generic_id 外键关联。
- 复制 SQL,执行前重命名表并调整列类型(例如价格用 DECIMAL,或设置 VARCHAR 长度)。
JSON 示例对象
{
"id": 1024,
"total": 19.5,
"coupon": null,
"created_at": "2026-01-05T10:00:00Z",
"scores": [4, 4.5],
"items": [{ "sku": "A1", "qty": 2 }]
}MySQL CREATE TABLE 语句
CREATE TABLE generic ( id INT, total DOUBLE, coupon TEXT, created_at TIMESTAMP, PRIMARY KEY (id) ); CREATE TABLE generic_scores ( generic_id INT, id INT, value DOUBLE, PRIMARY KEY (id), FOREIGN KEY (generic_id) REFERENCES generic(id) ); CREATE TABLE generic_items ( generic_id INT, id INT, sku TEXT, qty INT, PRIMARY KEY (id), FOREIGN KEY (generic_id) REFERENCES generic(id) );
功能与限制
整数变为 INT(超出 32 位范围时为 BIGINT),其他数字为 DOUBLE,字符串为 TEXT,布尔值为 BOOLEAN。不会生成 VARCHAR 长度、NOT NULL、AUTO_INCREMENT 或索引。
主键取名为 id 或包含 _id 的键;如果都没有,会添加一个 id 列。长度超过 18 个字符且能解析为日期的字符串会变为 TIMESTAMP。
null 值变为 TEXT 列。标量数组会生成带 value 列的子表,其类型由所有元素决定(上例中 scores 为 DOUBLE)。
在浏览器中运行;输出不会在 MySQL 服务器上验证。
FAQ
为什么小数是 DOUBLE 而不是 DECIMAL?
示例无法体现所需的精度,因此非整数一律为 DOUBLE。金额列请手动改为 DECIMAL(p,s)。
可以指定表名吗?
不可以。根表总是 generic,子表为 generic_<key>。请在复制的 SQL 中重命名。
会生成 INSERT 语句吗?
不会,只生成 CREATE TABLE。要把 JSON 行转换为 INSERT 语句,请使用 JSON 转 SQL 工具。