Código Natural/Identificação taxonômica: mudanças entre as edições

De Documentação
(→‎Taxonomias Base N: add atribuicao de ID)
Linha 1: Linha 1:
Identificadores únicos, tais como [https://www.postgresql.org/docs/current/functions-sequence.html contadores sequenciais em bases de dados], são fundamentais para a indexação e controle de registros. O ideal, todavia, é que esse identificador traga embutida alguma informação relativa à taxonomia da entidade identificada. Isso porque '''os identificadores de grupos taxonômicos também precisam ser únicos e padronizados'''.
Identificadores únicos, tais como [https://www.postgresql.org/docs/current/functions-sequence.html contadores sequenciais em bases de dados], são fundamentais para a indexação e controle de registros. O ideal, todavia, é que esse identificador traga embutida alguma informação relativa à taxonomia da entidade identificada. Isso porque '''os identificadores de grupos taxonômicos também precisam ser únicos e padronizados'''.


A ilustração do conjunto de frutas ajuda a entender os agrupamentos (taxons).
A ilustração do conjunto de frutas ajuda a entender os agrupamentos ([https://schema.org/Taxon taxons]).


==Taxonomias bit a bit==
==Taxonomias bit a bit==
Linha 17: Linha 17:
[[Arquivo:NatCod-Taxons-p1.png|centro|480px]]
[[Arquivo:NatCod-Taxons-p1.png|centro|480px]]


Se o conjunto dos identificadores de fruta for ordenado lexicograficamente, cada "ramo da árvore taxonômica" (prefixo) corresponderá a um único intervalo.   
Se o conjunto dos '''identificadores''' de fruta for ordenado '''lexicograficamente''' ([[Código natural#Ordenações_lexicográfica_e_numérica|''preorder'']]), '''cada ''taxon'' corresponderá a um único intervalo'''. Lembrando que os ''taxons'' são os "ramos da árvore taxonômica", associados aos prefixos. Na ilustração os IDs de maçã estão no intervalo <code>0</code> até <code>011</code>, o subconjunto das maçãs verdes no subintervalo <code>01</code> até <code>011</code>, e os IDs de laranja de <code>1</code> até <code>111</code>.
 
Como boa prática para identificação pode-se evitar IDs com ''contador'' vazio: os IDs da ilustração saltam os códigos <code>0</code>, <code>1</code> e  <code>01</code>.   
   
   
===Reserva de bits para o prefixo do contador===
===Reserva de bits para o prefixo do contador===
Linha 40: Linha 42:


===Contadores numéricos===
===Contadores numéricos===
Na sintaxe "<code>$prefixo$contador</code>", o contador pode ser representado como número. Computacionalmente o ID é um código, seu prefixo um código (fixo ou condicional), e por fim o contador, depois de isolado (ainda como código) pode sofrer ''cast'' para um número inteiro positivo.
Na sintaxe "<code>$prefixo$contador</code>", o contador pode ser representado como número. Computacionalmente o ID é um código, seu prefixo um código, e por fim o contador, depois de isolado (ainda como código) pode sofrer ''cast'' para um número inteiro positivo.


Sendo um número, podemos calcular o sucessor <code>succ($contador)</code> através da aritmética usual, <code>$contador+1</code>.
Sendo um número, podemos calcular o sucessor <code>succ($contador)</code> através da aritmética usual, <code>$contador+1</code>.
Linha 94: Linha 96:
|101||'''2'''Q||Organge (illustrated)
|101||'''2'''Q||Organge (illustrated)
|}
|}
=== Atribuição dos IDs dentro de uma taxonomia ===
:Supor que a partir de ''k'' bits, digamos ''k''=4, seja possível destacar prefixos válidos para conjuntos e subconjuntos alinhados.
[[Arquivo:NatCod-taxon-ilustraSetsB4h.png|centro|semmoldura|480x480px]]
Imaginemos o caso de uma pequena ''loja de departamentos'', que começou por organizar os produtos mais vendidos: frutas e roupas. Entre as frutas, as mais vendidas são as maçãs, e entre as roupas, os jeans, as camisetas e alguns tipos de roupa feminina.
Olhando para a "régua '''base 4h'''" acima decidimos que frutas ficarão todas com o prefixo <code>0</code>, sendo as maçãs com <code>00</code> e as demais frutas com prefixos <code>01</code>, <code>02</code> e <code>03</code>. Os prefixos 1 e <code>2</code> ficam reservados a outros produtos, e o prefixo <code>3</code> ficou com as roupas.
Cada uma dessas ''classes de produtos'' foi destacado abaixo num diagrama de conjuntos, e os prefixos eleitos indicados no ponto interior mais à esquerda de cada conjunto. No ponto interior mais à direita, o limite superior que uma ''instância'' daquela classe de produto pode receber como identificador único.
[[Arquivo:NatCod-taxon-produtos1.png|centro|miniaturadaimagem|680x680px|Códigos Naturais de 11 bits na base 4h: de <code>0</code> até <code>33333Q</code>, identificando produtos.
Futas: prefixo <code>0</code>. Roupas: prefixo <code>3</code>. Demais produtos: prefixos <code>1</code> e <code>2</code> disponíveis. Maçãs: prefixo <code>00</code>. Demais frutas: prefixos <code>01</code>, <code>02</code> e  <code>03</code> disponíveis.
Maçãs vermelhas, 🍎, prefixo <code>000</code>; maçãs verdes, 🍏, prefixo <code>001</code>.Roupas de mulher, prefixo <code>30</code>: vestidos,👗,<code>300</code>; camisas femininas,👚, <code>302</code>. Demais roupas:
camisetas,👕, prefixo <code>31</code>, e jeans, 👖, prefixo <code>32</code>. Cada maçã vermelha recebe um ID no intervalo <code>000</code> até <code>00033Q</code>; cada maçã verde de <code>001</code> até <code>00133Q</code>; ...;  cada jeans de <code>32</code> até <code>32333Q</code>. ]]
Neste cenário, no inventário inicial foram suficientes 11 bits para identificar todos os produtos com seus prefixos. Por exemplo os IDs das maçãs vermelhas ficaram no intervalo <code>000</code> até <code>00033Q</code>. A ampliação do banco de dados, adotando o dobro, 22 bits, acarretou a ampliação do intervalo da mesma classe, seus IDs passaram a ser de <code>000</code> até <code>00033333333</code>. '''O aumento de bits não afeta os identificadores''', apenas amplia a possibilidade de incluir mais produtos dentro da mesma classe.


==Identificadores sem contador==
==Identificadores sem contador==

Edição das 08h41min de 7 de agosto de 2023

Identificadores únicos, tais como contadores sequenciais em bases de dados, são fundamentais para a indexação e controle de registros. O ideal, todavia, é que esse identificador traga embutida alguma informação relativa à taxonomia da entidade identificada. Isso porque os identificadores de grupos taxonômicos também precisam ser únicos e padronizados.

A ilustração do conjunto de frutas ajuda a entender os agrupamentos (taxons).

Taxonomias bit a bit

Códigos binários identificando frutas individuais e sua taxonomia: laranja, maçã vermelha e maçã verde.

A cada prefixo pode-se expressar uma regra. Por exemplo:

  • Primeiro bit do ID: define se é laranja (1) ou maçã (0).
    Os conjuntos L dos identificadores de laranjas e M das maçãs da ilustração ao lado são definidos por: e .
  • Primeiro bit do ID de maçã: especializa como vermelha (0) ou verde (1). Portanto IDs com prefixos "00" (maçã red), "01" (maçã green) e "0" para maçã genérica. Daí rotular uma maçã com ID "0" é uma falha, é um código exclusivo de taxon.
    Os conjuntos R dos identificadores de maçãs red e G das maçãs green da ilustração ao lado são definidos por: e . Ambos subconjuntos de M, estabelecendo portanto uma hierarquia taxonômica entre as maçãs.

Os identificadores de frutas são livres, podem ter qualquer quantidade de bits, podem ter tamanho fixo ou variável, e não precisam percorrer uma sequência especial. A taxonomia só impõe a existência de prefixos e regras de interpretação para esses prefixos.

A sintaxe geral da cadeia de bits é simples: "$prefixo$contador". Com as variáveis prefixo e contador, tendo apenas o prefixo um comprimento definido pelas regras taxonômicas.

NatCod-Taxons-p1.png

Se o conjunto dos identificadores de fruta for ordenado lexicograficamente (preorder), cada taxon corresponderá a um único intervalo. Lembrando que os taxons são os "ramos da árvore taxonômica", associados aos prefixos. Na ilustração os IDs de maçã estão no intervalo 0 até 011, o subconjunto das maçãs verdes no subintervalo 01 até 011, e os IDs de laranja de 1 até 111.

Como boa prática para identificação pode-se evitar IDs com contador vazio: os IDs da ilustração saltam os códigos 0, 1 e 01.

Reserva de bits para o prefixo do contador

No exemplo acima as laranjas fizeram uso de um prefixo de apenas 1 bit e as maçãs uso de um prefixo de 2 bits.

Se a taxonomia é sujeita a modificações, podemos reservar mais bits para cada um dos grupos taxonômicos (taxons).

No exemplo poderíamos no futuro distinguir laranjas, entre comuns e avermelhadas. Todas elas com prefixo 1 mas reservando mais bits para futuras diferenciações: duas estratégias são possíveis:

  • Se as existentes são comuns, batizamos elas de 10 e reservamos 11 para as avermelhadas. Não fica nenhuma reserva de segurança.
  • Se as existentes são misturadas, batizamos a mistura de 100 e reservamos 101 para as identificadas como comuns e 110 para as avermelhadas; ficando ainda a reserva 111 para outra eventual variedade de laranja.

Quanto maior o risco de uma futura diferenciação, maior a demanda por reserva.

Prefixos lexicográficos

Na sintaxe "$prefixo$contador", o prefixo é necessariamente um código e a contagem para identificação dos taxons é necessariamente lexicográfica. Ver função hsucc em step01def-lib_NatCod.sql. Exemplos:

  • Dois taxons requerem no mínimo 1 bit. O primeiro é hsucc("")="0", o segundo é seu sucessor, hsucc("0")="1".
  • Dois taxons com reserva de 2 bits, requerindo portanto 3 bits. Com reserva balanceada: taxons "001" e "101".
  • Três taxons e todos com até 5 subtaxons cada. Pode-se adotar um prefixo de 2 bits fixos para os pais, mais dois variáveis para os filhos, ou balancear valores de zero a 3*5=15 entre 4 ou mais bits.

Contadores numéricos

Na sintaxe "$prefixo$contador", o contador pode ser representado como número. Computacionalmente o ID é um código, seu prefixo um código, e por fim o contador, depois de isolado (ainda como código) pode sofrer cast para um número inteiro positivo.

Sendo um número, podemos calcular o sucessor succ($contador) através da aritmética usual, $contador+1.

Contadores lexicográficos

Na sintaxe "$prefixo$contador", o contador pode ser mantido como código.

Sendo um código, podemos calcular succ($contador) através do "sucessor lexicográfico" (também denominado "hierarchical successor"). Ver função hsucc em step01def-lib_NatCod.sql.

Taxonomias Base N

Reserving 2 bits for all taxon-prefixes, and later representation in Base4h.

O caso mais simples é a Base4, com dígitos de 2 bits. É necessário então reservar no mínimo 2 bits para a taxonomia. Aqui adotamos a estratégia de reserva de apenas um bit para a diferenciação das laranjas, e mais um bit para a diferenciação das maçãs.

Green apples, IDs na Base4h.

A conversão para Base4h resulta na segunda coluna da tabela abaixo, com prefixos em negrito, e conjunto "Green apples" ilustrado.

Base2h Base4h Taxon
00 0 Red Apple (illustrated)
000 0G Red Apple (illustrated)
0000 00 Red Apple (illustrated)
0001101 012Q Red Apple
0010101 022Q Red Apple
01 1 Green apple (illustrated)
0101 11 Green apple
010 1G Green apple (illustrated)
011 1Q Green apple (illustrated)
10 2 Organge (illustrated)
10101 22Q Organge
1011 23 Organge
101 2Q Organge (illustrated)

Atribuição dos IDs dentro de uma taxonomia

Supor que a partir de k bits, digamos k=4, seja possível destacar prefixos válidos para conjuntos e subconjuntos alinhados.
NatCod-taxon-ilustraSetsB4h.png

Imaginemos o caso de uma pequena loja de departamentos, que começou por organizar os produtos mais vendidos: frutas e roupas. Entre as frutas, as mais vendidas são as maçãs, e entre as roupas, os jeans, as camisetas e alguns tipos de roupa feminina.

Olhando para a "régua base 4h" acima decidimos que frutas ficarão todas com o prefixo 0, sendo as maçãs com 00 e as demais frutas com prefixos 01, 02 e 03. Os prefixos 1 e 2 ficam reservados a outros produtos, e o prefixo 3 ficou com as roupas.

Cada uma dessas classes de produtos foi destacado abaixo num diagrama de conjuntos, e os prefixos eleitos indicados no ponto interior mais à esquerda de cada conjunto. No ponto interior mais à direita, o limite superior que uma instância daquela classe de produto pode receber como identificador único.

Códigos Naturais de 11 bits na base 4h: de 0 até 33333Q, identificando produtos. Futas: prefixo 0. Roupas: prefixo 3. Demais produtos: prefixos 1 e 2 disponíveis. Maçãs: prefixo 00. Demais frutas: prefixos 01, 02 e 03 disponíveis. Maçãs vermelhas, 🍎, prefixo 000; maçãs verdes, 🍏, prefixo 001.Roupas de mulher, prefixo 30: vestidos,👗,300; camisas femininas,👚, 302. Demais roupas: camisetas,👕, prefixo 31, e jeans, 👖, prefixo 32. Cada maçã vermelha recebe um ID no intervalo 000 até 00033Q; cada maçã verde de 001 até 00133Q; ...; cada jeans de 32 até 32333Q.

Neste cenário, no inventário inicial foram suficientes 11 bits para identificar todos os produtos com seus prefixos. Por exemplo os IDs das maçãs vermelhas ficaram no intervalo 000 até 00033Q. A ampliação do banco de dados, adotando o dobro, 22 bits, acarretou a ampliação do intervalo da mesma classe, seus IDs passaram a ser de 000 até 00033333333. O aumento de bits não afeta os identificadores, apenas amplia a possibilidade de incluir mais produtos dentro da mesma classe.

Identificadores sem contador

A sintaxe "$prefixo$contador" não deve ser confundida com a sintaxe interna do prefixo. Havendo necessidade de se identificar apenas os grupos taxonômicos, com sua hierarquia, podemos fazer uso do prefixo como identificador,

Prefixo e contador ao mesmo tempo

Exemplo. Ao identificar as partições recursivas de um quadrado, estamos identificando as células (como instâncias) e os taxons ao mesmo tempo. Abaixo usando a base4 para rotular. A célula "0" tem as filhas "00", "01", "02" e "03".

GGeohash-ilustra9-basic.png

Modelagem dos níveis hierárquicos

Uniforme vs heterogêneo...

  • Por base N de referência: exemplo do geocódigo quadrilátero que precisa preserva compatibilidade com a base4
  • Por agregação: ... junta 2 ou mais níveis hierárquicos da base N para obter um nível...