Usar UUID como chave primária tem vantagens e desvantagens
A escolha entre UUID e ID (inteiro auto-incremental) depende muito do caso de uso e das prioridades do projeto, ambas as abordagens possuem vantagens e desvantagens, de um modo geral é necessário analisar o uso.
Atualmente muito se fala que o ideal é usar UUID ao invés de um ID auto incremento, mas no fundo a decisão é bem mais profunda. Vamos iniciar este artigo com algumas comparações gerais:
1. Espaço em armazenamento
UUID (16 bytes): Ocupa mais espaço em comparação a um inteiro (INT ou BIGINT).
INT (4 bytes), enquanto um BIGINT (8 bytes).
Isso significa que cada tabela que referenciar o UUID como chave estrangeira vai replicar o tamanho do UUID, aumentando o consumo de armazenamento e podendo diminuir a performance para grandes bases de dados.
2. Índices
Índices em colunas com UUIDs são maiores, o que pode aumentar o tempo de busca e reduzir a eficiência de leitura, principalmente em bancos de dados que precisam fazer muitas operações de escrita/leitura.
3. Legibilidade
Um UUID é menos legível para humanos do que um ID incremental. Para debug e logs, trabalhar com números inteiros (ID) é mais fácil.
Quando usar UUID
Ambiente distribuído:
Em sistemas onde múltiplos servidores ou serviços estão criando registros simultaneamente, UUID evita colisões porque é globalmente único.
Por exemplo, se você tem um sistema distribuído com várias tabelas ou serviços independentes gerando chaves primárias, UUID é uma escolha robusta.
Privacidade e segurança:
Se você não quer que IDs sejam previsíveis (por exemplo, URLs públicas que expõem IDs incrementais), UUID é mais seguro, pois os valores são aleatórios.
Sincronização entre sistemas:
Se os dados precisam ser sincronizados entre sistemas distintos (ex.: replicação de bases de dados ou integrações entre serviços), UUID facilita identificar registros únicos.
Quando usar ID incremental (INT ou BIGINT)
Desempenho:
Em bases de dados menores ou sistemas que priorizam performance de escrita/leitura, IDs incrementais são mais eficientes. Os índices ocupam menos espaço e são mais rápidos para processar.
Simples e local:
Se o banco de dados é usado por um único sistema e não há risco de colisões entre IDs, um ID incremental é mais que suficiente.
Armazenamento:
Para sistemas com tabelas muito grandes e várias relações com chaves estrangeiras, IDs incrementais economizam espaço e tornam a consulta mais rápida.
Alternativa híbrida
Em alguns casos, você pode usar uma abordagem mista:
Usar IDs incrementais como chave primária interna para tabelas principais (relacionais).
Adicionar uma coluna UUID para expor publicamente os registros ou para sincronização entre sistemas, mas mantê-la como secundária.
Sendo assim, se o desempenho e o tamanho do banco são mais importantes, opte por IDs incrementais (INT ou BIGINT).
Se o sistema é distribuído ou exige segurança/privacidade, UUID pode ser mais apropriado.
Para muitos casos de uso comuns (sistemas centralizados ou monolíticos), um ID incremental funciona muito bem.
Se optar por UUID, considere também otimizações, como a versão compactada BINARY(16) em vez do formato tradicional de string VARCHAR(36).
Sua avaliação criteriosa deverá garantir o futuro do seu código e do seu projeto, gaste algum tempo simulando o que poderá acontecer com sua base de dados no futuro, isso é muito importante e agora é a hora.
