DEV Community

Cover image for Normalização do Tipo de Identificação
Ortiz de Arcanjo Antonio David
Ortiz de Arcanjo Antonio David

Posted on

Normalização do Tipo de Identificação

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

Top comments (0)