← Voltar para 7. Estruturas Flexíveis & JSON
7. Estruturas Flexíveis & JSON

JSON / JSONB (Documentos Estruturados)

Armazena objetos e arrays JSON validados automaticamente e consultáveis via SQL.

💾 Espaço em Disco: Aproximadamente o tamanho de um LONGBLOB/LONGTEXT (até 1 GB no Postgres / 4 GB no MySQL) 📏 Limites: Documentos JSON válidos (objetos `{}` ou arrays `[]`)

O tipo nativo `JSON` (MySQL 5.7.8+ / MariaDB) e `JSONB` (PostgreSQL) valida automaticamente se a string enviada é um JSON válido e a armazena em um formato binário otimizado que permite buscar chaves específicas (`JSON_EXTRACT` ou operador `->`) sem precisar ler e fazer parse do texto inteiro.

✅ Quando Usar

  • •Atributos dinâmicos de produtos de categorias muito diferentes (ex: ficha técnica de uma Camiseta vs Placa de Vídeo).
  • •Preferências e configurações de interface do usuário (tema escuro, notificações, idioma).
  • •Payloads brutos de Webhooks (Stripe, Mercado Pago, Asaas) e snapshots de auditoria (antes/depois da edição).

🚫 Quando NÃO Usar

  • •NÃO use JSON como muleta para evitar criar tabelas e relacionamentos normais! Nunca guarde chaves estrangeiras dentro de um array JSON (`"produtos_ids": [1, 5, 9]`) — crie uma tabela associativa!

📐 Configuração no DrawDB

Type:
JSON (ou JSONB no PostgreSQL)
Size / Values:
Vazio
Default:
Deixe vazio ou NULL
MySQL / MariaDB
JSON
PostgreSQL
JSONB (Binário indexável recomendado) ou JSON
SQLite
TEXT (com funções da extensão JSON1 nativas)
🗄️ SQL DDL (Pronto para Importar no DrawDB)
CREATE TABLE produtos_catalogo (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(150) NOT NULL,
    preco DECIMAL(10, 2) NOT NULL,
    atributos_extras JSON NULL COMMENT 'Ex: {"voltagem": "220v", "garantia_meses": 12}'
);
🐘 Exemplo Prático em PHP 8 + PDO
<?php
declare(strict_types=1);

// 1. Codificando array associativo do PHP para JSON com tratamento de erro nativo (JSON_THROW_ON_ERROR)
$atributos = [
    'processador' => 'Ryzen 7',
    'memoria_ram_gb' => 32,
    'conexoes' => ['HDMI 2.1', 'USB-C', 'Wi-Fi 6E'],
];

$jsonString = json_encode($atributos, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);

$stmt = $pdo->prepare('
    INSERT INTO produtos_catalogo (nome, preco, atributos_extras)
    VALUES (:nome, :preco, :atributos)
');
$stmt->bindValue(':nome', 'Notebook Pro 16', PDO::PARAM_STR);
$stmt->bindValue(':preco', '7499.90', PDO::PARAM_STR);
$stmt->bindValue(':atributos', $jsonString, PDO::PARAM_STR);
$stmt->execute();

// 2. Lendo do banco e decodificando de volta para Array PHP
$dadosAtributos = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR);
echo $dadosAtributos['processador']; // "Ryzen 7"