1. Identificadores & Chaves
UUID (CHAR(36) / UUID Nativo)
Identificador universalmente único de 36 caracteres (ex: 550e8400-e29b-41d4-a716-446655440000).
💾 Espaço em Disco: 36 Bytes em CHAR(36) no MySQL | 16 Bytes no tipo nativo UUID do PostgreSQL
📏 Limites: Exatamente 36 caracteres (32 dígitos hexadecimais + 4 hífens)
UUIDs permitem gerar identificadores únicos diretamente no PHP antes mesmo de consultar o banco de dados, além de ocultar a contagem real de registros em URLs e APIs REST. Dica de ouro: prefira UUID v7 (ordenado por tempo) em vez de UUID v4 (totalmente aleatório) para evitar fragmentação de índices B-Tree.
✅ Quando Usar
- •IDs públicos expostos em URLs, APIs, links de pagamento ou notas fiscais (`/faturas/0192a4b2-7c90-...`).
- •Sistemas distribuídos ou aplicativos offline que geram o ID antes de sincronizar com o servidor.
- •Como coluna secundária (`uuid CHAR(36) UNIQUE`) mantendo `id BIGINT` interno para JOINs rápidos (Padrão Híbrido Recomendado!).
🚫 Quando NÃO Usar
- •Não use `VARCHAR(36)` para UUID — como todo UUID com hífens tem exatamente 36 caracteres, `CHAR(36)` é mais rápido e não gasta byte extra de prefixo.
- •Evite UUID v4 como Primary Key clusterizada no MySQL InnoDB em tabelas com milhões de linhas (prefira UUID v7 ou o padrão híbrido ID numérico + coluna UUID).
📐 Configuração no DrawDB
- Type:
- CHAR (no MySQL) ou UUID (no PostgreSQL)
- Size / Values:
- 36 (quando usar CHAR)
- Default:
- UUID() no MySQL 8+ ou gen_random_uuid() no PostgreSQL
MySQL / MariaDB
CHAR(36) NOT NULL UNIQUE (MariaDB 10.7+ possui tipo UUID nativo)
PostgreSQL
UUID NOT NULL DEFAULT gen_random_uuid()
SQLite
TEXT NOT NULL UNIQUE
🗄️ SQL DDL (Pronto para Importar no DrawDB)
CREATE TABLE pedidos (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
uuid CHAR(36) NOT NULL UNIQUE,
valor_total DECIMAL(10, 2) NOT NULL,
criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
🐘 Exemplo Prático em PHP 8 + PDO
<?php
declare(strict_types=1);
/**
* Gerador nativo de UUID v4 em PHP 8+ (sem precisar de bibliotecas externas)
*/
function gerarUuidV4(): string {
$bytes = random_bytes(16);
$bytes[6] = chr((ord($bytes[6]) & 0x0f) | 0x40); // Versão 4
$bytes[8] = chr((ord($bytes[8]) & 0x3f) | 0x80); // Variante RFC 4122
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
}
/**
* Validando se uma string recebida na URL é um UUID válido
*/
function validarUuid(string $uuid): bool {
return (bool) preg_match(
'/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i',
$uuid
);
}
$uuid = gerarUuidV4();
$stmt = $pdo->prepare('INSERT INTO pedidos (uuid, valor_total) VALUES (:uuid, :total)');
$stmt->bindValue(':uuid', $uuid, PDO::PARAM_STR);
$stmt->bindValue(':total', '149.90', PDO::PARAM_STR);
$stmt->execute();