Normalização do Tipo de Identificação
Tags: sql
Published: 2022-01-11 12:07:30

Nas bases de dados é comum usarmos o BI (ou 

RG ou CPF para o Brasil) como oprincipal atributo único , contando apenas com as pessoas nativas. É o campo mais usado para consultas. 
Devemos levar em conta que uma pessoa também pode ser identificado pelo Passaporte, Cartão de Residente, Bilhete de Identidade Estrangeiro, Bilhete Militar e outros.

Essa abordagem tem as seguintes desvantagens:

1. Para cada pessoa estrageira, teriamos que adicionar um atributo para o tipo de identificação. Caso alguém não tenha o documento, o campo será nulo;
2. Na medida que o sistema cresce, será mais difícil modificar todas as funcionalidades que dependem do Bilhete de Identidade;
3. Caso entra um pessoa estrageira, teremos que modificar cada consulta no Sistema.

Uma das soluções é criar uma tabela para os tipos de identificação e na tabela de pessoas referenciamos o tipo, seguido do atributo que representa o número de identificação. Caso surjam mais documentos de identificação, não vão impedir o crescimento do sistema, porque para cada consulta será usado o número de identificação, independentemente do tipo.

**Obs**: Na implementação do Sistema, podemos validar cada entrada, criando uma expressão regular para cada tipo de documento de identificação.

**Exemplo**: Sistema de Inscrições para a Universidade XPTO. Os candidatos podem ser nativos ou estrangeiros.
Neste exemplo, vamos nos focar num trecho da base de dados,  usando os 3 modelos(conceitual, lógico e físico). 

## Modelo Conceitual
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u8n65b87lwji8jnvat9x.jpg)

## Modelo Lógico
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xi56go45g1i22zxfpqy0.jpg)

## Modelo Físico
`CREATE DATABASE teste_identificacao;
USE teste_identificacao;

CREATE TABLE tipo_identificacao (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome_tipo VARCHAR(50) NOT NULL,
    codigo VARCHAR(20) UNIQUE NOT NULL
);

CREATE TABLE pessoa (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(50) NOT NULL,
    sexo ENUM('M', 'F'),
    id_tipo INT NOT NULL,
    num_identificacao VARCHAR(20) UNIQUE NOT NULL,
    CONSTRAINT fk_ident_pessoa FOREIGN KEY (id_tipo) REFERENCES tipo_identificacao (id)
);

CREATE TABLE candidato (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    id_pessoa INT NOT NULL,
    cod_candidato VARCHAR (20) NOT NULL,
    CONSTRAINT fk_pessoa_candidato FOREIGN KEY (id_pessoa) REFERENCES pessoa (id)
);

-- INSERÇÃO -----------------------------------------------------------------------------------------------------------------------
INSERT INTO tipo_identificacao (nome_tipo, codigo) VALUES ('Bilhete de Identidade', 'bi'), ('Passaporte', 'passaporte'), ('Cartão de Residente', 'cartao-res'), ('Bilhete de Identidade Militar', 'bi-militar'), ('Bilhete de Identidade Estrangeiro', 'bi-estrangeiro');

INSERT INTO pessoa (nome, sexo, id_tipo, num_identificacao) VALUES ('António', 'M', 1, '0012344743LA022');
INSERT INTO pessoa (nome, sexo, id_tipo, num_identificacao) VALUES ('Maria', 'F', 2, '00123449JASA8S88');
INSERT INTO pessoa (nome, sexo, id_tipo, num_identificacao) VALUES ('Manuel', 'M', 3, '00123458MT92976');
INSERT INTO pessoa (nome, sexo, id_tipo, num_identificacao) VALUES ('João', 'M', 1, '123456LA09754');
INSERT INTO pessoa (nome, sexo, id_tipo, num_identificacao) VALUES ('Ana', 'F', 4, '12324456522');

INSERT INTO candidato (id_pessoa, cod_candidato) VALUES (1, 'CAND_01');
INSERT INTO candidato (id_pessoa, cod_candidato) VALUES (2, 'CAND_02');
INSERT INTO candidato (id_pessoa, cod_candidato) VALUES (3, 'CAND_03');
INSERT INTO candidato (id_pessoa, cod_candidato) VALUES (4, 'CAND_04');
INSERT INTO candidato (id_pessoa, cod_candidato) VALUES (4, 'CAND_05');`

## Resultados


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjt607s82bix2c7sla1v.jpg)