Pular para o conteúdo

Converter JSON em esquema MySQL — Numio

Gera instruções CREATE TABLE do MySQL a partir de JSON de exemplo. A raiz vira uma tabela chamada generic; cada objeto ou array aninhado vira uma tabela filha com uma chave estrangeira para a chave primária da tabela pai.

Esboçar um layout de tabelas normalizado para o payload de uma API antes de escrever uma migration de verdade.

JSON

MySQL Schema

Quando usar

  • Esboçar um layout de tabelas normalizado para o payload de uma API antes de escrever uma migration de verdade.
  • Ver quais objetos e arrays aninhados de um documento precisariam de tabelas próprias ao migrar dados de um banco de documentos para o MySQL.

Como usar

  1. Cole no editor da esquerda um objeto JSON, ou um array de registros de exemplo que são mesclados em uma única tabela, ou use o botão de carregar arquivo para abrir um arquivo UTF-8.
  2. Leia as tabelas geradas: a raiz é generic e as filhas são generic_<key>, ligadas por chaves estrangeiras generic_id.
  3. Copie o SQL e, antes de executá-lo, renomeie as tabelas e ajuste os tipos das colunas (por exemplo, DECIMAL para preços ou tamanhos de VARCHAR).

Objeto JSON de exemplo

{
  "id": 1024,
  "total": 19.5,
  "coupon": null,
  "created_at": "2026-01-05T10:00:00Z",
  "scores": [4, 4.5],
  "items": [{ "sku": "A1", "qty": 2 }]
}

Instruções CREATE TABLE do MySQL

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)
);

Detalhes e limitações

Inteiros viram INT (BIGINT fora da faixa de 32 bits), outros números DOUBLE, strings TEXT e booleanos BOOLEAN. Não são gerados tamanhos de VARCHAR, NOT NULL, AUTO_INCREMENT nem índices.

A chave primária é uma chave chamada id ou que contenha _id; se não houver, uma coluna id é adicionada. Strings com mais de 18 caracteres que podem ser interpretadas como datas viram TIMESTAMP.

Valores null viram colunas TEXT. Arrays de escalares geram uma tabela filha com uma coluna value cujo tipo vem de todos os elementos (scores, acima, é DOUBLE).

Roda no seu navegador; a saída não é validada em um servidor MySQL.

FAQ

Por que um valor decimal tem o tipo DOUBLE e não DECIMAL?

A amostra não mostra a precisão de que você precisa, então números não inteiros viram DOUBLE. Mude colunas de valores monetários para DECIMAL(p,s) à mão.

Posso escolher o nome da tabela?

Não. A tabela raiz é sempre generic e as tabelas filhas são generic_<key>. Renomeie-as no SQL copiado.

Gera instruções INSERT?

Não, apenas CREATE TABLE. Para transformar linhas JSON em instruções INSERT, use a ferramenta JSON para SQL.

Especificações e referências