Guia do iniciante para escrever esquemas de banco de dados mySQL

Ao desenvolver um projeto de software, um dos aspectos mais importantes, fundamentais e intrínsecos é um esquema de banco de dados devidamente estruturado. É o equivalente a quando construir uma casa, você precisa garantir que os alicerces sejam colocados corretamente, caso contrário, as chances de construir uma casa de qualidade são drasticamente reduzidas.

Surpreendentemente mais fácil do que se poderia pensar, vamos aprender as várias facetas usadas para escrever um esquema de banco de dados bem arquitetado.

Sintaxe CREATE TABLE

Para começar, abra seu editor de texto favorito. A criação de um esquema de banco de dados não requer nada mais do que um arquivo de texto simples. Um banco de dados consiste em várias tabelas, cada uma consistindo em colunas, e a sintaxe CREATE TABLE é usada para criar uma única tabela. Aqui está um exemplo básico:

 
CREATE TABLE users (
id INT NOT NULL,
is_active TINY INT NOT NULL,
full_name VAR CHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL
);

Como você pode ver, isso criará uma tabela de banco de dados chamada users, que consiste em quatro colunas. Esta deve ser uma instrução SQL bastante direta começando com CREATE TABLE , seguida pelo nome das tabelas do banco de dados e, em seguida, entre parênteses as colunas da tabela separadas por uma vírgula.

Use os tipos de coluna corretos

Conforme mostrado acima, as colunas nas quais a tabela consistirá são separadas por vírgulas. Cada definição de coluna é composta pelas três mesmas partes:

 COL_NAME    TYPE    [OPTIONS]

O nome da coluna, seguido pelo tipo de coluna e, a seguir, quaisquer parâmetros opcionais. Entraremos nos parâmetros opcionais mais tarde, mas concentrando-nos no tipo de coluna, a seguir lista os tipos de coluna mais comumente usados ​​disponíveis:

Tipo Descrição
INT Inteiro, suporta valores de até (+/-) 2,14 bilhões. O tipo de número inteiro mais comumente usado, mas o seguinte com os respectivos intervalos também estão disponíveis:

  • TINYINT – 128. Ótimo para booleanos (1 ou 0).
  • SMALLINT – 32k
  • MEDIUMINT – 3,8 milhões
  • BIGINT – 9,3 quintilhões.
VARCHAR (xxx) String de comprimento variável que suporta virtualmente todos os dados não binários. O xxx entre parênteses é o comprimento máximo que a coluna pode conter.
DECIMAL (x, y) Armazena valores decimais / flutuantes, como preços ou quaisquer valores numéricos que não sejam números inteiros. Os números entre parênteses de (x, y) definem o comprimento máximo da coluna e o número de casas decimais a serem armazenadas. Por exemplo, DECIMAL (8,2) permitiria que os números tivessem no máximo seis dígitos de comprimento, mais formatados com duas casas decimais.
DATETIME / TIMESTAMP Ambos mantêm a data e a hora no formato AAA-MM-DD HH: II: SS. Você deve usar TIMESTAMP para todos os metadados de linha (ou seja, criado em, última atualização, etc.) e DATETIME para todas as outras datas (por exemplo, data de nascimento, etc.).
ENCONTRO Semelhante a DATETIME, exceto que apenas armazena a data no formato AAA-MM-DD e não armazena a hora.
TEXTO Grandes blocos de texto podem armazenar até 65k caracteres. Os itens a seguir também estão disponíveis com seus respectivos intervalos:

  • MEDIUMTEXT – 16,7 milhões de caracteres.
  • LONGTEXT – 4,2 bilhões de caracteres.
BLOB Usado para armazenar dados binários, como imagens. Suporta tamanho máximo de 64 KB, e o seguinte com os respectivos limites de tamanho também são suportados:

  • TINYBLOG – 255 bytes
  • MEDIUMBLOB – 16 MB
  • LONGBLOG – 4 GB
ENUM (opção1, opção2, opção3 …) Permite apenas que o valor seja um dos valores predefinidos especificados entre parênteses. Bom para coisas como uma coluna de status (por exemplo, ativo, inativo, pendente).

Para todos os efeitos, os tipos de coluna acima são tudo o que você precisa para escrever esquemas de banco de dados mySQL bem construídos.

Definir opções de coluna

Ao definir colunas, também existem várias opções que você pode especificar. Abaixo está outro exemplo da instrução CREATE TABLE :

 
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) NOT NULL UNIQUE,
status ENUM('active','inactive') NOT NULL DEFAULT 'active',
balance DECIMAL(8,2) NOT NULL DEFAULT 0,
date_of_birth DATETIME,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

A descrição acima pode parecer um pouco assustadora, mas não se preocupe, é bastante simples. Detalhado, aqui está o que está acontecendo na declaração acima:

  • Você deve sempre usar NOT NULL em todas as colunas possíveis para ajudar com a velocidade e desempenho da tabela. Isso simplesmente especifica que a coluna não pode ser deixada vazia / nula quando uma linha é inserida.
  • Sempre tente manter o tamanho da coluna tão pequeno quanto realisticamente possível, pois isso ajuda a melhorar a velocidade e o desempenho.
  • A coluna id é um inteiro, também é a chave primária da tabela, o que significa que é única, e aumentará em um cada vez que um registro for inserido. Isso geralmente deve ser usado em todas as tabelas que você cria, para que possa referenciar facilmente qualquer linha única dentro da tabela.
  • A coluna de status é um ENUM e deve ter um valor de "ativo" ou "inativo". Se nenhum valor for especificado, uma nova linha começará com o status de "ativo".
  • A coluna de saldo começa em 0 para cada nova linha e é um valor formatado com duas casas decimais.
  • A coluna date_of_birth é simplesmente uma DATE, mas também permite um valor nulo, pois a data de nascimento pode não ser conhecida no momento da criação.
  • Por último, a coluna created_at é um TIMESTAMP e o padrão é a hora atual quando a linha foi inserida.

O exemplo acima é um exemplo de uma tabela de banco de dados bem estruturada e deve ser usado como exemplo no futuro.

Uma das maiores vantagens de usar bancos de dados relacionais como mySQL é seu excelente suporte para restrições de chave estrangeira e cascata. Isso ocorre quando você vincula duas tabelas por uma coluna, formando um relacionamento pai-filho, de forma que, quando a linha pai é excluída, as linhas filho necessárias também são excluídas automaticamente.

Aqui está um exemplo:

 
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) NOT NULL UNIQUE,
full_name VARCHAR(100) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) engine=InnoDB;
CREATE TABLE orders (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
userid INT NOT NULL,
amount DECIMAL(8,2) NOT NULL,
product_name VARCHAR(200) NOT NULL,
FOREIGN KEY (userid) REFERENCES users (id) ON DELETE CASCADE
) engine=InnoDB;

Você notará a cláusula FOREIGN KEY como a última linha. Esta linha simplesmente afirma que esta tabela contém linhas filhas que são vinculadas pela coluna userid à sua linha pai, que é a coluna id da tabela users . O que isso significa é que sempre que uma linha for excluída da tabela de usuários , o mySQL excluirá automaticamente todas as linhas correspondentes da tabela de pedidos, ajudando a garantir a integridade estrutural em seu banco de dados.

Observe também que engine = InnoDB no final da instrução acima. Embora InnoDB agora seja o tipo de tabela mySQL padrão, nem sempre foi, então isso deve ser adicionado apenas para ficar no lado seguro, já que o cascateamento só funciona com tabelas InnoDB.

Projete com confiança

Agora você está no caminho certo para arquitetar esquemas de banco de dados mySQL sólidos e bem estruturados. Usando o conhecimento acima, agora você pode escrever esquemas bem organizados que fornecem desempenho e integridade estrutural.

Com seu esquema implementado, certifique-se de saber como usá-lo com esses comandos SQL essenciais .