DEV Community

Felipe Rafael Barbosa
Felipe Rafael Barbosa

Posted on

Desvendando os Tipos de Dados SQL: Como Escolher o Melhor para Cada Situação

Image description

1. Introdução

Olá! Sou Felipe Rafael Barbosa, mestrando em Ciência da Computação. Estou me aprofundando no universo dos bancos de dados e quero compartilhar meu aprendizado com vocês, de forma prática e acessível sem muitas abstrações. Pretendo começar com conteúdos relacionados ao SQL, e posteriormente explorar ferramentas e técnicas que ajudam DBAs e Engenheiros de Dados a trabalharem de forma mais eficiente.

2. O que são Tipos de Dados em SQL?

Os tipos de dados, são cruciais para definir o formato e a natureza da informação em uma tabela, assegurando consistência e a validação dos dados. Mas o conhecimento adequado dos tipos de dados vai muito além disso: a escolha correta vai impactar diretamente o desempenho, a segurança e a manutenção do banco de dados. 
Nesse artigo organizarei os dados a serem apresentados da seguinte forma:

  • Tipos de dados numéricos
  • Tipos de dados de texto
  • Tipos de dados de data e hora

Utilizar um tipo de dado apropriado para cada coluna otimiza o espaço de armazenamento, melhora a velocidade de consultas e reduz o risco de erros de dados. Por exemplo, usar um INT para um campo de identificação é mais eficiente do que usar um VARCHAR, e definir o tamanho correto de um VARCHAR evita desperdício de espaço. Ao longo deste artigo, exploraremos como a escolha consciente dos tipos de dados contribui para a construção de um banco de dados robusto, performático e fácil de manter.

3. Tipos de Dados Numéricos

Esses tipos de dados são usados para armazenar números, que podem ser inteiros ou decimais. Eles são essenciais quando lidamos com cálculos, contagens e medições.

3.1. Inteiros

Precisamos armazenar números inteiros no nosso banco de dados? O SQL oferece diferentes tipos para isso, cada um com suas vantagens:

INT (Integer): Ideal para a maioria das situações, armazena números inteiros entre -2.147.483.648 e 2.147.483.647 (ou apenas positivos se usar UNSIGNED). Ocupa sempre 4 bytes, sendo perfeito para IDs e contagens.

TINYINT: Para números inteiros menores, ocupando menos espaço (1 byte). Sua faixa é de -128 a 127 (ou apenas positivos com UNSIGNED).

BIGINT: Quando precisamos de uma faixa bem maior de números inteiros, o BIGINT é a solução, suportando valores muito grandes e ocupando sempre 8 bytes para cada registro.

Lembre-se! a escolha do tipo certo depende da faixa de valores de cada regra de negócio. Usar o tipo mais apropriado otimiza o espaço de armazenamento e o desempenho do seu banco de dados.

3.2. Decimais

A escolha cuidadosa do tipo de dado para representar números decimais no SQL é crucial para a qualidade do banco de dados, algo que, infelizmente, muitos profissionais subestimam no processo de modelagem e implementação. A atenção aos detalhes, como a seleção entre DECIMAL, NUMERIC, FLOAT e DOUBLE, diferencia bons profissionais e pesquisadores.

DECIMAL (P, S): Oferece precisão e controle total sobre o número de dígitos. P representa o número total de dígitos (precisão), e S o número de dígitos após a vírgula (escala). Por exemplo, DECIMAL(5,2) permite números com até 5 dígitos, sendo 2 após a vírgula (ex: 123.45). A escolha de P e S depende da precisão necessária para os seus dados. É ideal para valores monetários, onde a precisão é crítica. O armazenamento desse tipo de dado varia de acordo com o nível de precisão P e escala S do negócio.

NUMERIC: É similar ao DECIMAL, oferece a mesma precisão e controle. A principal diferença é que a implementação pode variar entre diferentes sistemas de gerenciamento de banco de dados (SGBDs, assunto que pretendo abordar quando tiver mais conhecimento).

FLOAT e DOUBLE: Armazenam números de ponto flutuante. São mais compactos que DECIMAL e NUMERIC, mas podem apresentar pequenas imprecisões em cálculos devido à forma como representam os números internamente. São adequados para situações onde a precisão absoluta não é essencial, como dados científicos ou estatísticos. A capacidade do FLOAT vai de -3.4 * 10³⁸ a 3.4 * 10³⁸, enquanto o DOUBLE comporta -1.7 * 10³⁰⁸ a 1.7 * 10³⁰⁸, e ocupam em memória 4 e 8 bytes respectivamente.

A escolha entre esses tipos depende da sua necessidade de precisão e do espaço de armazenamento disponível. Para valores monetários ou onde a precisão é fundamental, DECIMAL ou NUMERIC são as melhores opções. Para dados onde pequenas imprecisões são aceitáveis, FLOAT ou DOUBLE podem ser mais eficientes.

4. Tipos de dados de texto

Os tipos CHAR, VARCHAR e TEXT são usados para armazenar dados de texto no SQL, mas diferem significativamente em como armazenam e gerenciam esses dados. A quantidade de bytes usados varia dependendo do SGBD (Sistema de Gerenciamento de Banco de Dados) e, no caso do VARCHAR e TEXT, do comprimento da string armazenada. As informações abaixo são generalizações e podem variar.

CHAR(tamanho): Armazena strings de tamanho fixo. Se você declarar CHAR(10), ele sempre ocupará 10 bytes, mesmo que você armazene uma string menor (preenchida com espaços em branco à direita). É muito comum encontrar o tipo char para armazenar Código de país (ex: "BR", "US"), abreviações de estados (ex: "SP", "RJ"), códigos de produtos com tamanho fixo. É raramente a melhor opção.

VARCHAR(tamanho): Armazena strings de tamanho variável. Ocupa tamanho + 2 ou 4 bytes (dependendo do SGBD), mais os bytes necessários para armazenar a string. É comum encontrar esse tipo de dado para a declaração de Nomes de pessoas, endereços, cidades, descrições de produtos curtas, títulos de livros. É a escolha mais comum para strings de tamanho variável.

TEXT: Armazena strings de tamanho muito grande. O tamanho em bytes varia bastante dependendo do SGBD e do comprimento da string. Muitos SGBDs usam um sistema de ponteiros para gerenciar strings TEXT. Exemplos bem comuns do tipo TEXT são Artigos grandes e descrições extensas de produtos. Evite usá-lo para campos em que você precisa frequentemente consultá-los, pois as buscas podem ser mais lentas.

5. Tipos de dados de data e hora

O SQL oferece diversos tipos de dados para representar data e hora, e mais uma vez, aqui a quantidade de bytes pode variar dependendo do Sistema de gerenciamento de banco de dados (SGBD), logo a aproximação de bytes pode variar, logo serão apresentadas aproximações.

DATE: Este tipo, armazena apenas a data no formato ano, mês, dia. seu tamanho geralmente é de 3 ou 4 bytes, e seu uso é ideal para armazenar datas de nascimento, datas de eventos, datas de vencimento, etc. o DATE não é recomendado para armazenar informações de tempo.

TIME: Armazena a hora, minuto e segundo. geralmente ocupa entre 3 ou 8 bytes dependendo da precisão, e são bem presentes no registro de horários de eventos, horários de entrada e saída, etc. Não armazena informações de data.

DATETIME: O DATETIME faz a combinação de data e hora, geralmente ocupa 8 bytes por registro. Ideal para registrar eventos com data e hora específicos, como logs de sistema, timestamps de transações, etc.

TIMESTAMP: É similar ao DATETIME mas normalmente inclui informações adicionais como, zona de tempo e pode ser automaticamente atualizado pelo banco de dados. Geralmente ocupa entre 4 ou 8 bytes dependendo do SGBD e da precisão. Muito usado para rastrear a criação e modificação de registros em um banco de dados.

6. Conclusão

Este artigo forneceu uma visão geral de alguns tipos de dados textuais, numéricos e de data/hora comuns na área de dados. No entanto, a riqueza de opções em bancos de dados se estende além destes, abrangendo tipos booleanos, bit, e outras categorias que merecem uma análise mais profunda. A investigação dessas possibilidades tem me instigado a cada dia à realizar estudos e pesquisas futuras, para possibilitar otimizações e soluções mais específicas para diferentes cenários de modelagem de dados, pretendo também, trazer essas otimizações na prática e explica-las realizando testes e provando que esses detalhes são pontos chaves para a formação de bons profissionais.

Alguns sites usados como referência

https://www.geeksforgeeks.org/
https://www.w3schools.com/

Top comments (0)