Executando verificação de segurança...
0

ParabénsCaique! Excelente post com uma metodologia muito bem explicada!

Sempre deixei mesmo como INT e nunca tive problemas, embora sempre em aplicações de pequeno porte. Em larga scala valeria a pena rever.

Outra discussão é se devemos misturar CPF e CNPJ no mesmo campo e mais um campo PF/PJ numa tabela de cadastro de clientes, por exemplo. Como tem feito? Por questão de praticidade fazemos essa combinação, embora possa vir a ferir alguma regra de normalização.

Carregando publicação patrocinada...
3

Então, essas são outras discussões que não couberam no post original por uma limitação de caracteres, mas vamos lá 😅

Sempre que você vai armazenar um dado no banco de dados, você precisa entender a finalidade daquela dado na hora de projetar o MER (modelo de entidade-relacionamento).

Um dado como CPF pode ter diferentes aplicações em diferentes sistemas. Em um sistema ele pode ser usado para consulta, em outro não, etc. Mas acima de tudo a representação deste dado tem como característica a identificação única de um indivíduo.

Dentro do contexto de dados, a identificação única de um registro mais eficiente já o seu próprio ID (auto incrementado, por exemplo). O CPF, por exemplo, é a identificação do indivíduo e, em algum momento, assim como aconteceu com placas de carro, aconteceu com CNPJ, vai acontecer com o CPF: letras serão incluídas.

Quando você analisa a estrutura do dado, existem apenas 8 dígitos produtivos. Isso porque os três últimos dígitos fazem referência ao número do estado (em uma tabela de correspondência) e aos dígitos verificadores. Isso dá uma razão de 99 milhões de opções por grupo de estado. Parece muito, porém a Receita Federal ainda aplica um conjunto de regras para limitar essa combinação de números de modo a não gerar número em sequência de repetição alta, por exemplo.

Logo a natureza do dado em si nunca foi numérica, pois todos os dígitos formam esse dado. Os zeros à esquerda eliminados por uma coluna inteira, por exemplo, descaracterizam a entidade. Se eu precisar processar esses valores do lado do banco de dados, pode ter certeza que será uma dor de cabeça enorme. Mesmo para sistemas pequenos, não recomendaria a prática, ainda mais pelos poucos benefícios que você ganha com ela e, ainda, na camada da aplicação tem que: (1) converter para string; (2) preencher zeros a esquerda; (3) aplicar a formatação.

Sobre a outra discussão: devemos misturar dados? É outra coisa que depende do seu MER, quando você olha para o contexto e significado do CNPJ e CPF, estamos falando de pessoas diferentes. Uma é física, um indivíduo com nome, sobrenome, RG, etc. E a outra é jurídica, com razão social, nome fantasia, inscrição estadual, inscrição municipal, etc. E essa última ainda é composta de um quadro societário de pessoas físicas.

Em alguns sistemas, principalmente fiscais, essas separações lógicas são aplicadas no banco também, criando uma tabela para cada tipo de pessoa. Mas fora isso, existem muitas alternativas:

  • Podemos criar uma tabela usuários e uma outra tabela de metadados desse usuário;
  • Podemos criar uma única tabela com uma separação lógica por coluna.

Sobre o segundo caso que você mencionou sobre praticidade, por exemplo, é simples. Você irá precisar de três colunas para garantir uma consulta mais eficiente:

  • doc_type: Um coluna do tipo ENUM com cpf, cnpj e indexada. O custo dessa coluna tanto em tempos de processamento quanto armazenamento é insignificante, porque ela é armazenada como inteiro, mas com o benefício da fácil visualização e busca de dados por string;
  • doc_number: Uma coluna do tipo VARCHAR com 14 caracteres para armazenar o valor do documento sem formatação;
  • doc_crc: Uma coluna do tipo BIGINT para armazenar os CRC32 do número do documento e indexada.

Quando você executar um WHERE, o banco irá filtrar primeiro por doc_type (menor índice), depois pelo doc_crc e por fim o doc_number. Não terá qualquer problema de ineficiência.

Agora, concordo que a estrutura acima só funciona para sistemas muito simples ou, geralmente, quando dados relacionados não são usados (nome completo, razão social, RG, inscrições federais, etc). Por exemplo, você tem um sistema de cadastro de usuário e você apenas quer saber se ele é pessoa física ou jurídica, junto com sua identificação. Nesse caso, a flag doc_type se faz mais interessante. Contudo se você precisa, por exemplo, coletar dados fiscais dessas pessoas, geralmente você vai precisar separar, não só para organizar melhor os dados, mas também relacionar uma pessoa física a uma jurídica quando aplicável.

No fim se você trabalha com banco de dados, tem que entender de banco de dados. Entender sobre a construção do MER e, principalmente, desvendar as características e relações dos dados de modo a resolver um problema mais eficiente. Nesse caso, um número de documento jamais deveria ser interpretado como inteiro, mas muitos fazem e por suas razões.

Contudo, assim que CPF ganhar dígitos alfanuméricos, esteja prepara para atualizar todas as suas aplicações de pequeno porte.

1

Verdade caiquearaujo, é bem provável que o número de Cadastro de Pessoa Física (CPF) seja o próximo a passar por uma alteração (ainda não encontrei nada a respeito), pois a estrutura desse número não é contínua como se pensa. Atualmente já se encontra incorporado pela Carteira de Identidade Nacional (CIN) sendo o identificador único do cidadão. Dos 9 dígitos que o compõe, apenas 8 são realmente livres dentro de cada região fiscal da Receita Federal, identificada no 9º dígito (região fiscal responsável pela primeira emissão do documento). Os dois últimos restantes são dígitos verificadores.

NNN.NNN.NNX-YZ : CPF
sendo:
NNN.NNN.NN     : representam o número da inscrição oficial da pessoa
          X    : região fiscal da Receita Federal responsável pela criação deste CPF
            YZ : verifica os nove primeiros dígitos

O nono dígito corresponde a um ou mais estados do país, a saber:

1: DF, GO, MS, MT e TO
2: AC, AM, AP, PA, RO e RR
3: CE, MA e PI
4: AL, PB, PE e RN
5: BA e SE
6: MG
7: ES e RJ
8: SP
9: PR e SC
0: RS

Fonte: https://www.serasa.com.br/blog/o-que-e-cpf

Segundo o IBGE, a população residente no Brasil é de 203.080.756 indivíduos. Do exposto, supõe-se que cada região fiscal pode emitir cerca de 99.999.999 números de CPF. Caso o 9º dígito fosse uma letra [A-Z] representando cada uma delas um estado da federação, teoricamente seriam possíveis 2.600.000.000 de CPFs com 100.000.000 por estado (DF precisa ser incluso em algum outro estado). O 9º dígito também poderia ser um elemento de conferência, caso o local de emissão fosse conhecido! Supondo-se que todos habitantes possuem inscrição no CPF, a síntese da população por UF poderia ser representativa de todos os CPFs ativos.

      Estado       |  Habitantes | Região Fiscal
Goiás              :   7.350.483   1
Mato Grosso        :   3.836.399   1
Distrito Federal   :   2.982.818   1
Mato Grosso do Sul :   2.901.895   1
Tocantins          :   1.577.342   1

Pará               :   8.664.306   2
Amazonas           :   4.281.209   2
Rondônia           :   1.746.227   2
Acre               :     880.631   2
Amapá              :     802.837   2
Roraima            :     716.793   2

Ceará              :   9.233.656   3
Maranhão           :   7.010.960   3
Piauí              :   3.375.646   3

Pernambuco         :   9.539.029   4
Paraíba            :   4.145.040   4
Rio Grande do Norte:   3.446.071   4
Alagoas            :   3.220.104   4

Bahia              :  14.850.513   5
Sergipe            :   2.291.077   5

Minas Gerais       :  21.322.691   6

Rio de Janeiro     :  17.219.679   7
Espírito Santo     :   4.102.129   7

São Paulo          :  45.973.194   8

Paraná             :  11.824.665   9
Santa Catarina     :   8.058.441   9

Rio Grande do Sul  :  11.229.915   0

Sei que não faz muito sentido apresentar esta tabela acima, pois para avaliar quantos possíveis CPF estão consumidos, é necessário levar em conta certas curvas de crescimento populacional e mortalidade.

Mas fica a dúvida. O Cadastro de Pessoas Físicas foi efetivamente instituído em 1968 por força do Decreto-lei nº 401 de 30 de dezembro de 1968. De lá para cá, vários cidadãos cadastrados faleceram. Neste caso, cedem seu número CPF para outro cadastro após determinado tempo legal ou manterá o número para sempre, mesmo falecido?

Brasil tem 12,5 milhões de CPFs ativos a mais que a população total, e TCU cobra Receita Federal: Auditoria diz que, em 3,3 milhões de cadastros, há indícios de que a pessoa já morreu. Há ainda 78 mil CPFs ativos de pessoas que, se vivas, têm mais de 110 anos; Receita não comentou dados.
Fonte: G1 em matéria publicada em 02/09/2020 19h07, atualizada em 02/09/2020