跳到主要内容

数据库优化:JSON To MySQL模式 — Numio

根据示例 JSON 生成 MySQL CREATE TABLE 语句。根节点变为名为 generic 的表;每个嵌套对象或数组变为子表,并带有指向父表主键的外键。

在编写正式迁移之前,为 API 载荷草拟规范化的表结构。

JSON

MySQL Schema

适用场景

  • 在编写正式迁移之前,为 API 载荷草拟规范化的表结构。
  • 把数据从文档数据库迁到 MySQL 时,查看文档中哪些嵌套对象和数组需要单独建表。

使用方法

  1. 将 JSON 对象或示例记录数组(会合并为一张表)粘贴到左侧编辑器,或用加载文件按钮打开 UTF-8 文件。
  2. 查看生成的表:根表为 generic,子表为 generic_<key>,通过 generic_id 外键关联。
  3. 复制 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 工具。

规范与参考资料