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"