Normalização do Tipo de Identificação

Ortiz de Arcanjo Antonio David - Jan 11 '22 - - Dev Community

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

Modelo Lógico

Image description

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

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player