Introdução a Modelagem de Banco de Dados - SQL
Tags: beginners, sql, mysql, braziliandevs
Published: 2022-03-07 20:52:10

## Tabela de Conteúdos

- [Database Design](#database-design)
- [Database Design Passo a Passo](#database-design-passo-a-passo)
- [Normalização](#normalização)
- [Links Úteis]()

---

## Database Design

### O que é?

É a modelagem que iremos desenvolver para então criarmos nosso DB baseado nesse modelo.

### Modelando

Para iniciarmos a modelagem de um banco de dados, seguimos quatro passos básicos, sendo eles:

1. Identificar as entidades, atributos e relacionamentos com base na descrição do problema
2. Construir um diagrama entidade-relacionamento para representar as entidades encontradas no passo 1
3. Criar um banco de dados para conter suas tabelas
4. Criar e modelar tabelas tendo o diagrama do passo 2 como base

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

---

## Database Design Passo a passo

### 1. Identificando entidades, atributos e relacionamentos

Antes de realmente identificar quais são as entidades, atributos e relacionamentos, é preciso saber o que eles são.

#### Entidades

São representações de algo do mundo real dentro do DB. Normalmente englobam uma ideia em sua totalidade e são armazenadas em formato de tabelas no DB.
Em resumo **são as tabelas**.

#### Atributos

São as características de uma entidade, ou seja, tudo aquilo que serve para descrever uma entidade.
Em resumo **são as colunas** de uma tabela.

#### Relacionamentos

São as ligações que uma entidade possui com outra, sendo que há três tipos de relacionamento: 1:1, 1:N ou N:1 e N:N.
Em resumo **são as referências entre as colunas** das tabelas.

### 2. Construindo um diagrama entidade-relacionamento

#### Diagrama

O diagrama possui dois estágios, o básico, para que possamos entender o relacionamento entre as entidades _(tabelas)_ e o detalhado, assim conseguimos visualizar exatamente quais colunas estão se relacionando.

#### Criação do diagrama

Há diversas formas de se criar diagramas, podemos desenhar no papel, no paint ou em qualquer outra ferramenta, sendo que há algumas ferramentas especializadas para isso, como o [Excalidraw](https://draw.moyu.io), Draw.io ou [QuickDB](https://app.quickdatabasediagrams.com/#/).

_pessoalmente prefiro o QuickDB_

#### Estrutura

Como dito anteriormente, possuímos duas etapas e cada uma possui sua própria estrutura.

Na etapa básica temos uma estrutura simples, onde ligamos as entidades através de um verbo, identificando seu tipo de relacionamento, não sendo necessário identificar explicitamente quais atributos se relacionam.


![simple ER diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6b64hvpw0maru0sicppy.png)

Agora com o diagrama mais detalhado, precisamos informar não só as entidades, como também as chaves primárias e estrangeiras.

![complete ER diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wofvz29g6rc40a2dx2uk.png)

*OBS: _O diagrama acima foi elaborado apenas para fins de ilustração, logo algumas relações não fazem sentido na "vida real"._

### 3. Criando um banco de dados

#### Como criar

Essa é a parte mais simples do processo, tudo que precisamos fazer é executar alguns comandos, são eles:

``` sql
CREATE DATABASE <nome do banco de dados>;
CREATE SCHEMA <nome do banco de dados>;
```

Para evitar erros utilizamos uma condicional que verifica a existência de determinado DB, isso previne a possível duplicação de um DB já existente.

``` sql
CREATE DATABASE IF NOT EXISTS <nome do banco de dados>;
```

### 4. Criando e modelando tabelas

#### Padrão

As tabelas devem ser criadas respeitando os diagramas ER criados no passo 2, assim conseguimos ter um plano de ação visível e relativamente previsível.

#### Tipos de dados

Assim como linguagens de programação fortemente tipadas, devemos informar os tipos de dados que irão ser inseridos em determinada coluna de determinada tabela. Existem muitos tipos de dados para se listar aqui, porém sempre podemos consultá-los na [OverAPI](https://overapi.com/mysql) ou na documentação oficial [(MySQL)](https://dev.mysql.com/doc/refman/8.0/en/data-types.html).

#### Keys

Existem duas chaves dentro do MySQL que fazem a identificação de um dado, temos a Primary Key que será o identificador único de uma entidade e temos a Foreign Key, essa irá fazer referência a determinado dado em outra tabela.

#### Sintaxe

A sintaxe para a criação de tabelas é simples, consiste no comando `CREATE TABLE` seguido do nome da tabela e entre parênteses definimos as colunas, de forma similar a criação de uma interface no TypeScript.

``` sql
DROP SCHEMA IF EXISTS <nome do DB>;  -- parte extra para evitar bancos de dados duplicados
CREATE SCHEMA <nome do DB>;
USE <nome do DB>;

CREATE TABLE <nome da tabela>(
    <coluna> <tipo de dados>,
    <coluna> <tipo de dados>,
    <coluna> <tipo de dados>
);
```
``` sql
DROP SCHEMA IF EXISTS Brazil;
CREATE SCHEMA Brazil;
USE Brazil;

CREATE TABLE cities(
    city_id INT PRIMARY KEY auto_increment,
    city VARCHAR(100) NOT NULL,
    state VARCHAR(10) NOT NULL,
    population INTEGER
);
```

O `DROP SCHEMA` foi utilizado pensando em um ambiente de aprendizagem, onde não há problemas em deletar uma tabela/DB, porém em outros contextos o `DROP SCHEMA` é um recurso __extremamente perigoso__ de ser utilizado, logo seu uso deve ser evitado a todo custo!

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

___

## Normalização

### O que é?
É uma técnica para reduzir a duplicidade de informações dentro de um DB, evitando assim anomalias de inserção, atualização e exclusão.

### O que faz?
Como dito em sua definição, a normalização reduz a duplicidade de dados dentro das tabelas, para isso criamos outras tabelas, essas que irão conter as informações que seriam duplicadas.

Dessa forma definimos a informação apenas uma vez e a ligamos através da chave estrangeira a entidade necessária _(Foreign Key)_.

### Como fazer?
A normalização possui cinco formas, porém iremos abordar apenas as três primeiras, elas são como passos que devemos seguir a fim de construir um DB com o mínimo de duplicidade possível.

#### 1ª Forma Normal
É o primeiro passo que devemos dar para normalizar nosso DB, não somente por causa de seu nome, mas os requisitos dessa Forma serão a base para as outras.

A 1ª Forma Normal pede que as tabelas sejam escaláveis, além de serem extensíveis, em outras palavras, mudanças não devem quebrar a integridade dos dados.

Para alcançar essas metas podemos seguir uma lista de quatro requisitos.

- Colunas devem possuir apenas um valor
- Valores em uma coluna devem ser do mesmo tipo
- Cada coluna deve possuir um nome único
- A ordem dos dados não deve afetar a integridade dos mesmos

#### 2ª Forma Normal
Para iniciarmos a 2ª Forma Normal é necessário que nosso DB esteja normalizado de acordo com a 1ª Forma.

A 2ª Forma Normal pede que as tabelas não possuam dependências parciais, isso é qualquer coluna que não dependa exclusivamente da chave primária para existir.

Para remover essas dependências de nosso DB podemos seguir duas opções.

- Podemos vincular a coluna em questão a uma tabela que faça sentido
- Ou podemos criar uma nova tabela do zero, apenas com a coluna em questão

#### 3ª Forma Normal
Como era de se esperar, para iniciarmos a normalização a partir da 3ª Forma, precisamos ter realizado a normalização pela 1ª e 2ª Formas Normais.

A 3ª Forma Normal pede que a tabela não deva possuir colunas que não sejam dependentes exclusivamente da chave primária _(Primary Key)_.

Para alcançar essa ideia podemos, assim como na 2ª Forma Normal.

- Podemos vincular a coluna em questão a uma tabela que faça sentido
- Ou podemos criar uma nova tabela do zero, apenas com a coluna em questão

<br />

<small>[Voltar ao topo](#tabela-de-conteúdos)</small>

---

## Links Úteis

- [W3Schools - MySQL Data Types](https://www.w3schools.com/mysql/mysql_datatypes.asp)
- [W3Schools - MySQL CREATE TABLE](https://www.w3schools.com/mysql/mysql_create_table.asp)
- [OverAPI - MySQL Cheat Sheet](https://overapi.com/mysql)
- [DevHints - MySQL Cheat Sheet](https://devhints.io/mysql)
- [QuickDB](https://app.quickdatabasediagrams.com/#/)