Perché la maggior parte dei pacchetti GIS necessita di un ID numerico?


11

Questa è una domanda semplice ma forse controversa: perché la maggior parte (se non tutti) i pacchetti GIS richiedono che un determinato livello abbia un identificatore numerico non nulla univoco?

Perché c'è bisogno di una chiave così surrogata anziché naturale?

Esempi:

  • ArcGIS applica OBJECTID (o un GlobalID)

  • QGIS non carica i livelli quando non dispongono di un ID numerico.


8
Una possibile spiegazione: un ID numerico occupa molto meno byte di un ID non numerico. Ciò è ancora più importante quando inizi a collegare tabelle diverse, che memorizzano tutte una copia dell'ID.
johanvdw,

+1 Buona domanda, non credo che NoSQL richieda tasti numerici.
Kirk Kuykendall l'


@cap Questo è un po 'ridicolo (e hai già pubblicato quel link).
whuber

Risposte:


6

Perché devono avere un campo indicizzabile ottimizzato. Indicizzare più volte un campo stringa richiederebbe un maggior sovraccarico e alla fine non è altrettanto efficiente.

ESRI in realtà supporta nel mondo SDE il 'GLOBALID' che è un campo GUID, quindi questo è un campo 32char ma è ancora indicizzato per aumentare le prestazioni.


3
Questa è una buona spiegazione per il vantaggio in termini di efficienza di un ID numerico. Ma penso che @ George stia sondando più a fondo di così. Tecnicamente, i RDBMS non hanno bisogno che i loro identificatori siano numerici, quindi perché i GIS?
whuber

1
Il problema qui non è la prestazione. Una chiave univoca non nullable lo farebbe. Ma perché deve essere numerico? Una volta che ho sentito o letto che deve essere numerico perché usa quella chiave per controllare il rendering ... era in Modeling Our World di ESRI?
George Silva,

2
Perché un GIS non è un RDBMS, sebbene possa farne uso. Un GIS di solito avrà alcune regole e ipotesi, come il presupposto che la chiave primaria sarà un numero intero o GUID indicizzato, per motivi di prestazioni e sanità mentale di codifica.
blah238,

1
ok, ma perché assumere un numero? perché non possiamo scegliere la nostra chiave durante la creazione di un livello?
George Silva,

1
Immagino che il motivo principale sia che quei presupposti rendono il lavoro di scrittura del codice che fa funzionare un pacchetto GIS molto, molto più facilmente.
blah238,

4

Se inizi ad aggiungere record a un livello, puoi fare affidamento su un utente che immette un codice alfanumerico univoco per ogni nuova funzione prima di scriverlo sul disco.

..o potresti implementare un semplice campo intero autoincrementante.


4

Come molte persone hanno suggerito, è una questione di convenienza; ma forse più profondamente, è una convenzione.

Come programmatore, il mio primo istinto sarebbe quello di usare un tasto numerico per un ID di livello perché è così che è sempre stato fatto. In effetti, forse non mi viene nemmeno in mente, almeno a livello cosciente, che dovrei farlo in qualsiasi altro modo. Naturalmente, se esiste un motivo tecnico per non utilizzare numeri interi, dire se esiste la possibilità che ci siano più livelli di quanti possano essere memorizzati in 32 bit (una proposta molto improbabile!) O se esiste un motivo commerciale per questo, allora sarebbero prese in considerazione alternative.

Ci sono anche considerazioni algoritmiche con i tasti numerici. L'ordinamento e la ricerca di un elenco di valori ordinati alla fine si riduce a un confronto tra due numeri, anche se si tratta di un elenco di stringhe o oggetti complessi; vengono semplicemente trasformati in numeri con una funzione di hashing . Detto questo, sui moderni computer, la ricerca di un elenco di 100 o addirittura 1000 voci è solitamente rapida con un approccio a forza bruta come lo è con un algoritmo altamente ottimizzato. Nel caso di layer in un GIS, non riesco a vedere nemmeno la più complessa delle mappe con più di 1000 o giù di lì, e anche se lo facesse, gli altri calcoli associati prenderebbero ordini di grandezza più lunghi di qualsiasi piccolo guadagno da un ottimizzato ricerca di un breve elenco.

I tasti interi "hanno senso" per un programmatore e, come dice Brad, c'è più impegno nell'uso di tasti non numerici. Forse non più codice, ma più sforzo mentale, e siamo pigre creature dell'abitudine. Inoltre, la chiave che identifica in modo univoco qualcosa come un livello in un GIS è considerata "nascosta" dall'utente, per assicurarsi che non si scherzi con esso e rompere il codice che si basa sulla sua unicità (nonostante le parole chiave DB UNIQUE). Perché se dai a un utente abbastanza corda, prima o poi qualcuno si impiccerà con esso. Applica in modo univoco un campo modificabile dall'utente, ma il sistema sottostante deve assumere che la sua chiave sia unica e non manomessa.


L'OpenStreetMap è un esempio di un progetto che ha bisogno di più di interi a 32 bit. Usano bigintper le loro chiavi primarie.
Mike T,

Per modi / nodi, sì. Ma la domanda originale riguardava i livelli in un GIS.
MerseyViking,

OpenStreetMap memorizza i livelli GIS.
George Silva,

OSM memorizza solo modi e nodi che hanno tag chiave / valore. Spetta al sistema di presentazione (ad esempio OpenLayers) e al backend di rendering (ad esempio Mapnik, Osmarender) determinare la sua nozione di livelli in base a tali tag o qualcos'altro. Mike ha ragione, usa bigints per le chiavi primarie di tutti i suoi tavoli.
MerseyViking,

+1 per menzionare si tratta di convenzione. È una convenzione perché equivale a prestazioni migliori.
CaptDragon,

3

Questa domanda è stata confusa per le persone (come me) che sviluppano il lato geodatabase delle cose.

Non è una limitazione dell'archiviazione del database, poiché PostgreSQL può definire tabelle con CHIAVI PRIMARIE composte di diversi tipi di dati, tuttavia queste tabelle non possono essere caricate in programmi come QGIS. In una nota storica correlata, PostgreSQL richiedeva una colonna OID come chiave interna, che era anche un numero intero a 32 bit. Ciò era necessario fino alla versione 7.2 .

Il requisito dell'ID intero a 32 bit è in realtà un limite di programmazione. È molto più semplice avere un indice su un set di record come tipo di dati fisso (numero intero a 32 bit), ed è conveniente per questo essere anche il PRIMARY KEY per quel record. È più difficile fare in modo che un programma consenta una chiave primaria composita e che recuperi un record univoco basato su più e / o diversi tipi di dati. Tuttavia, come l'OID di PostgreSQL, questa limitazione può essere superata con i tempi di sviluppo. Per QGIS, il bug [ora] di 5 anni potrebbe essere risolto un giorno (ecco alcune discussioni recenti sull'argomento).


+1 Ben detto. Come ulteriore prova che si tratta di un limite di programmazione, si noti che ESRI non ha richiesto (o utilizzato) alcun campo identificativo interno in ArcView prima che ArcGIS 8.x venisse pubblicato. Il vecchio ArcView era in grado di eseguire tutte le operazioni del database eseguite da ArcGIS (e in realtà era più veloce in molte di esse).
whuber

2

In ESRI e in altri software GIS, è comune avere una cartella o un set di file che compongono la classe di funzionalità o il set di dati.
ad es. copertura arcinfo, shapefile, file geodatabase.
Questi "set" di file devono essere "uniti" dal software per consentire molte funzioni GIS.
Attrubute tabelle, rete, controlli topologici.
Questo è lo scopo dell'OID e anche il motivo per renderlo non annullabile, nascosto, controllato dal software.


Penso che le operazioni GIS potrebbero avere qualcosa a che fare con questo, davvero. intersecare, unioni (spaziali), differenze, ecc. Qualcuno può confermare o presentare questo più dettagliato?
George Silva,

Dai un'occhiata a come una singola classe di funzionalità SDE è effettivamente memorizzata in un database come Oracle. Esiste una tabella per gli attributi, una tabella per la geometria, una tabella per l'indice spaziale, una o più tabelle per gli indici degli attributi, ecc. Se ESRI dovesse supportare ogni codifica di tabella codici / caratteri per una stringa PKEY, tutto ancora su ArcView 3.x.
blah238,

@George - come notato da blah238 Esistono pochissime applicazioni GIS che utilizzano un singolo file per archiviare entrambi (tutti) i dati. Che può consistere in coordinate, misure, attributi, regole, relazioni e altro a seconda del pacchetto. Ha più a che fare con la possibilità di tenere traccia di quale riga spaziale va con quale riga di attributo, quale riga di rete, ecc.
Brad Nesom,

1
Mi dispiace blah238, non credo davvero che la quantità di codice sia stata determinante in questo problema. L'incondizionamento non ha nulla a che fare con questo. Il database eseguirà la "matematica" e deciderà se una sequenza di caratteri è uguale o meno, quindi, applicando PKEY. Non è sul livello software. @ Brad Nesom: anche questo ha un senso. Ma in Oracle e PostGIS puoi archiviare tutti i tuoi attributi su una singola tabella. Sono d'accordo che gli shapefile necessitavano del temuto ObjectID ... e che potrebbe aver fissato lo standard?
George Silva,

@George Shapefiles non era necessario né, come regola generale, utilizzava un ObjectID. Quel campo OID è stato introdotto con ArcGIS 8. Pertanto dubito che gli shapefile abbiano qualcosa a che fare con la domanda.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.