Por que a maioria dos pacotes GIS precisa de um ID numérico?

11

Esta é uma pergunta simples, mas possivelmente controversa: por que a maioria (senão todos) dos pacotes GIS exigem que uma determinada camada tenha um identificador numérico exclusivo e não nulo ?

Por que existe a necessidade de uma chave substituta em vez de uma chave natural?

Exemplos:

  • O ArcGIS aplica OBJECTID (ou um GlobalID)

  • O QGIS não carrega camadas quando elas não têm um ID numérico.

George Silva
fonte
8
Uma possível explicação: um ID numérico ocupa muito menos bytes que um ID não numérico. Isso importa ainda mais quando você começa a vincular tabelas diferentes, que armazenam uma cópia do ID.
Johanvdw
+1 Boa pergunta, não acho que o NoSQL exija chaves numéricas.
22411 Kirk Kuykendall
tinyurl.com/6xrtk2l
CaptDragon
@cap Isso é um pouco malicioso (e você já postou esse link).
whuber

Respostas:

6

Porque eles precisam ter um campo indexável otimizado. Para indexar um campo de string repetidamente, seria necessário mais sobrecarga e, no final, não é tão eficiente.

A ESRI realmente suporta no mundo da SDE o 'GLOBALID', que é um campo GUID, portanto esse é um campo de 32 caracteres, mas ainda é indexado para aumentar o desempenho.

DEWright
fonte
3
Essa é uma boa explicação para a vantagem de eficiência de um ID numérico. Mas acho que @George está investigando mais profundamente do que isso. Tecnicamente, os RDBMSs não precisam que seus identificadores sejam numéricos; então, por que os GIS devem?
whuber
1
O problema aqui não é o desempenho. Uma chave exclusiva não anulável faria isso. Mas por que deve ser numérico? Depois de ouvir ou ler que ele precisa ser numérico, porque usa essa chave para controlar a renderização ... estava em Modeling Our World da ESRI?
George Silva
2
Porque um GIS não é um RDBMS, embora possa fazer uso de um. Um GIS geralmente terá algumas regras e suposições, como a suposição de que a chave primária será um número inteiro indexado ou GUID, por uma questão de desempenho e sanidade de codificação.
blah238
1
ok, mas por que assumir um numérico? por que não podemos escolher nossa chave ao criar uma camada?
George Silva
1
Eu imagino que o principal motivo é que essas suposições tornam o trabalho de escrever o código que faz um pacote GIS funcionar muito, muito mais fácil.
blah238
4

Se você começar a adicionar registros a uma camada, poderá confiar em um usuário digitando um código alfanumérico exclusivo para cada novo recurso antes de gravá-lo no disco.

..ou você pode implementar um campo inteiro simples de incremento automático.

geographika
fonte
4

Como muitas pessoas sugeriram, é uma questão de conveniência; mas talvez mais profundamente, é convenção.

Como programador, meu primeiro instinto seria usar uma tecla numérica para um ID de camada, porque é assim que sempre foi feito. De fato, pode nem me ocorrer, pelo menos em nível consciente, que eu deva fazê-lo de outra maneira. É claro que, se houver uma razão técnica para não usar números inteiros, diga se existe a possibilidade de haver mais camadas do que as que podem ser armazenadas em 32 bits (uma proposta muito improvável!) Ou se existe uma razão comercial para isso, então alternativas seriam consideradas.

Há também considerações algorítmicas com teclas numéricas. A classificação e a pesquisa de uma lista de valores classificados acabam resumindo-se a uma comparação entre dois números, mesmo que seja uma lista de cadeias ou objetos complexos; eles simplesmente se transformam em números com uma função de hash . Dito isto, em computadores modernos, pesquisar uma lista de, digamos, 100 ou até 1000 itens é geralmente tão rápido com uma abordagem de força bruta quanto com um algoritmo altamente otimizado. No caso de camadas em um GIS, não consigo ver nem o mais complexo dos mapas com mais de 1000, e mesmo que o fizesse, os outros cálculos associados levariam ordens de magnitude mais longas do que qualquer pequeno ganho de um otimizado. pesquisa de uma lista curta.

Teclas inteiras "fazem sentido" para um programador e, como Brad diz, há mais esforço no uso de teclas não numéricas. Talvez não mais código, mas mais esforço mental, e somos criaturas preguiçosas de hábito. Além disso, a chave que identifica exclusivamente algo como uma camada em um GIS é considerada "oculta" do usuário, para garantir que eles não mexam com ela e quebrem o código que depende de sua exclusividade (não obstante as palavras-chave do DB UNIQUE). Porque se você der corda suficiente a um usuário, mais cedo ou mais tarde alguém se enforcará com ela. De qualquer modo, imponha exclusividade em um campo editável pelo usuário, mas o sistema subjacente deve assumir que sua chave é única e sem alterações.

MerseyViking
fonte
O OpenStreetMap é um exemplo de projeto que precisa de mais de 32 bits. Eles usam bigintpara suas chaves primárias.
Mike T
Para formas / nós, sim. Mas a pergunta original era sobre camadas em um SIG.
MerseyViking
O OpenStreetMap armazena camadas GIS.
George Silva
O OSM apenas armazena maneiras e nós que possuem tags de chave / valor. Cabe ao sistema de apresentação (por exemplo, OpenLayers) e ao backend de renderização (por exemplo, Mapnik, Osmarender) determinar sua noção de camadas com base nessas tags ou em qualquer outra coisa. Mas Mike está certo, ele usa bigints para todas as chaves primárias de suas tabelas.
MerseyViking
+1 por mencionar que trata-se de convenção. É uma convenção porque é igual a melhor desempenho.
CaptDragon
3

Essa questão tem sido confusa para pessoas (como eu) que desenvolvem o lado do geodatabase.

Não é uma limitação do armazenamento do banco de dados, pois o PostgreSQL pode definir tabelas com PRIMARY KEYS compostas de diferentes tipos de dados; no entanto, essas tabelas não podem ser carregadas em programas como o QGIS. Em uma nota histórica relacionada, o PostgreSQL exigia uma coluna OID como uma chave interna, que também era um número inteiro de 32 bits. Isso foi necessário até a versão 7.2 .

O requisito de ID inteiro de 32 bits é realmente uma limitação de programação. É muito mais simples ter um índice para um conjunto de registros como um tipo de dados fixo (número inteiro de 32 bits), e é conveniente que essa também seja a PRIMARY KEY para esse registro. É mais desafiador tornar um programa permitir uma chave primária composta e recuperar um registro exclusivo com base em vários e / ou tipos de dados variáveis. No entanto, como o OID do PostgreSQL, essa limitação pode ser superada com o tempo de desenvolvimento. Para o QGIS, o bug de 5 anos [agora] pode ser resolvido algum dia (aqui está uma discussão recente sobre o assunto).

Mike T
fonte
+1 Bem dito. Como evidência adicional de que essa é uma limitação de programação, observe que o ESRI não exigiu (ou usou) nenhum campo identificador interno no ArcView antes do ArcGIS 8.x ser lançado. O antigo ArcView era capaz de todas as operações de banco de dados que o ArcGIS executa (e na verdade era mais rápido em muitas delas).
whuber
2

No ESRI e em outros softwares GIS, é comum ter uma pasta ou um conjunto de arquivos que compõem a classe de recurso ou o conjunto de dados.
por exemplo, cobertura arcinfo, shapefile, geodatabase de arquivo.
Esses "conjuntos" de arquivos precisam ser "unidos" pelo software para permitir muitas funções GIS.
Tabelas de atribuição, rede, controles topológicos.
Esse é o objetivo do OID e também o motivo para torná-lo não anulável, oculto e controlado por software.

Brad Nesom
fonte
Eu acho que as operações GIS podem ter algo a ver com isso, realmente. interseção, uniões (espaciais), diferença, etc. Alguém pode confirmar ou apresentar isso mais detalhadamente?
George Silva
Veja como uma única classe de recurso SDE é realmente armazenada em um banco de dados como o Oracle. Há uma tabela para os atributos, uma tabela para a geometria, uma tabela para o índice espacial, uma ou mais tabelas para os índices de atributos, etc. todos ainda estão no ArcView 3.x.
blah238
@ George - como observado por blah238 Existem muito poucos aplicativos GIS que usam um único arquivo para armazenar ambos (todos) os dados. Que pode consistir em coordenadas, medidas, atributos, regras, relacionamentos e muito mais, dependendo do pacote. Tem mais a ver com a capacidade de rastrear qual linha espacial combina com qual linha de atributo, qual linha de rede, etc.
21811 Brad Nesom
1
Sinto muito blah238, realmente não acho que a quantidade de código tenha sido determinante nesta edição. O enconding não tem nada a ver com isso. O banco de dados fará a "matemática" e decidirá se uma sequência de caracteres é igual ou não, portanto, aplicando PKEY. Não está na camada de software. @ Brad Nesom: isso também faz sentido. Mas no Oracle e PostGIS você pode armazenar todos os seus atributos em uma única tabela. Concordo que os shapefiles precisavam do temido ObjectID ... e que pode ter definido o padrão?
George Silva
@ George Shapefiles nem precisava nem, como regra geral, usou um ObjectID. Esse campo OID foi introduzido no ArcGIS 8. Portanto, duvido que os shapefiles tenham algo a ver com a questão.
whuber