1
resposta

[Sugestão] Por que nâo utiliza o aluguel_d como numero - Por que evitar VARCHAR para IDs? Embora o exemplo funcione - Quando o VARCHAR é aceitável? Então Respondendo ao colega.

Embora o uso de VARCHAR para IDs (como chaves primárias) funcione e ofereça flexibilidade, ele deve ser evitado em favor de tipos numéricos (inteiros, bigints) ou UUIDs otimizados, principalmente devido a impactos no desempenho e no armazenamento.

Aqui estão os principais motivos para evitar VARCHAR em IDs:

  1. Performance de Indexação e Busca

  2. Comparação lenta: Comparar números (inteiros) é muito mais rápido para o processador do que comparar strings, que precisam ser analisadas caractere por caractere (respeitando regras de collation ou acentuação).

  3. Índices maiores: VARCHAR ocupa mais espaço em disco e na memória (cache). Índices grandes significam que menos dados cabem na memória RAM, resultando em mais leituras de disco e consultas mais lentas.

  4. Fragmentação: Índices baseados em texto (especialmente se não forem sequenciais) tendem a causar mais fragmentação no banco de dados com o tempo.

  5. Uso de Armazenamento

1- Sobrecarga (overhead): VARCHAR precisa de 1 ou 2 bytes extras para armazenar o comprimento da string, além dos caracteres em si.

2- Espaço desnecessário: Se o tamanho do VARCHAR for definido como alto (ex: VARCHAR(255)), pode haver desperdício, embora o VARCHAR economize espaço em comparação ao CHAR por armazenar apenas o necessário, ele ainda perde para um INT ou BIGINT que ocupam espaço fixo e compacto (4 ou 8 bytes).

  1. Integridade e Tipo de Dado

Ordenação incorreta: Strings são ordenadas alfabeticamente, não numericamente. 10 pode vir antes de 2 em uma ordenação VARCHAR, o que quebra a lógica de IDs sequenciais.

Uso inadequado: IDs devem ser identificadores únicos e estáveis. VARCHAR permite qualquer caractere, o que pode levar a inconsistências, espaços em branco acidentais ('123 ' vs '123') e dificuldades na validação.

Quando o VARCHAR é aceitável?

O uso de VARCHAR é aceitável quando o ID é naturalmente alfanumérico e de tamanho fixo, como códigos de aeroportos (IATA) ou códigos postais, mas mesmo nesses casos, CHAR costuma ser mais performático que VARCHAR.

Resumo Comparativo

1 resposta

Olá, Fábio. Como vai?

Excelente aprofundamento! Você trouxe uma explicação técnica muito completa que serve como um verdadeiro guia de Boas Práticas de Modelagem de Dados. A tabela comparativa que você anexou resume perfeitamente o impacto direto que essa escolha tem na infraestrutura do banco de dados (RAM, Cache e Disco).

Gostaria de reforçar um ponto muito importante que você mencionou: a questão da Collation.

Quando usamos VARCHAR, o banco de dados precisa checar as regras de comparação de caracteres (como se "A" é igual a "a" ou se acentos importam). Em uma busca com milhões de registros, esse "trabalho extra" do processador em cada linha faz uma diferença brutal na velocidade da consulta, algo que não existe no tipo INT, onde a comparação é puramente binária e direta.

Para complementar sua excelente explicação sobre quando o VARCHAR é aceitável, vale um lembrete sobre os UUIDs:

  • Atualmente, muitas aplicações modernas usam UUIDs (aqueles códigos como 550e8400-e29b...) como IDs para facilitar a integração entre sistemas diferentes.
  • Mesmo nesses casos, a recomendação atual para performance máxima no MySQL é armazená-los como BINARY(16) em vez de VARCHAR(36), justamente para reduzir o uso de armazenamento e acelerar a indexação, reforçando a sua tese de que o texto puro deve ser evitado em chaves primárias sempre que possível.

Parabéns pelo conteúdo rico! Tópicos assim elevam muito o nível das discussões no fórum da Alura.

Espero que possa ter lhe ajudado!