Skip to content

Criar definição de identificador universal para entidades representadas nos datasets #182

Description

@turicas

Problema

Necessidade de um identificador universal único (UUID) para cada entidade representada nos datasets do Brasil.IO. Entidades podem ser: empresas, pessoas, candidaturas etc. A falta de um UUID traz problemas como:

  • A necessidade de filtrar por vários campos ao mesmo tempo (que mudam de dataset para dataset)
  • Dificuldade de buscar em mais de um dataset
  • Dificuldade de gerar o ID offline para consultas externas
  • dentre outras

Atualmente utilizamos o dataset documentos-brasil para fazer essa desambiguação, porém ele não resolve completamente o problema, além de ser de difícil manutenção.

Solução

UUID versão 5 (hash SHA1, usando o namespace OID ou o URL -- ainda a definir), com prefixos de nomes estabelecidos pelo Brasil.IO (ou URLs diretamente), que controlarão a versão e o tipo de entidade.

Referências:

Exemplo em Python (URL)

import uuid

# Pessoa jurídica: 8 primeiros dígitos do CNPJ
# company
banco_do_brasil = uuid.uuid5(uuid.NAMESPACE_URL, "https://id.brasil.io/v1/company/00000000")

# Pessoa jurídica (matriz/filial): 14 dígitos do CNPJ
# company-branch
banco_do_brasil_filial_cajazeiras = uuid.uuid5(uuid.NAMESPACE_URL, "https://id.brasil.io/v1/company-branch/00000000009903")

# person
# Pessoa física: 6 dígitos do CPF ***111111** + nome completo em maiúsculas sem acento (slugified)
pessoa = uuid.uuid5(uuid.NAMESPACE_URL, "https://id.brasil.io/v1/person/111111-JOSE-CARLOS-DA-SILVA")

Nota: talvez o primeiro nome + 6 dígitos não sejam suficientes para a unicidade desse objeto (exemplo: 5,7 milhões de brasileiros possuem o nome José e não temos como garantir que os CPFs deles estarão espalhados uniformemente).

Exemplo em Python (OID)

import uuid

# Pessoa jurídica: 8 primeiros dígitos do CNPJ
# company
banco_do_brasil = uuid.uuid5(uuid.NAMESPACE_OID, "brasil.io/v1/company/00000000")

# Pessoa jurídica (matriz/filial): 14 dígitos do CNPJ
# company-branch
banco_do_brasil_filial_cajazeiras = uuid.uuid5(uuid.NAMESPACE_OID, "brasil.io/v1/company-branch/00000000009903")

# person
# Pessoa física: 6 dígitos do CPF ***111111** + nome completo em maiúsculas sem acento (slugified)
pessoa = uuid.uuid5(uuid.NAMESPACE_OID, "brasil.io/v1/person/111111-JOSE-CARLOS-DA-SILVA")

Implementação

Além do UUID, poderíamos armazenar um título que representa aquele objeto. O título poderia ser o nome da entidade (ou uma categoria) + algum identificador do objeto (não necessariamente único), por exemplo. Exemplos possíveis:

  • Candidato a deputado Fulano de Tal
  • Notebook SN: XXXXX
  • Pessoa: Cicrano da Silva

Na base de dados poderíamos ter os seguintes campos:

  • UUID
  • Name (brasil.io/versao/entidade/id)
  • Versão do UUID
  • Entidade
  • ID
  • Título
  • Texto (para FTS)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions