Pourquoi la plupart des packages SIG ont-ils besoin d'un identifiant numérique?


11

Il s'agit d'une question simple mais peut-être controversée: pourquoi la plupart des progiciels SIG (sinon tous) nécessitent-ils qu'une couche déterminée ait un identifiant numérique unique non annulable ?

Pourquoi est-il nécessaire d'avoir une telle clé de substitution au lieu d'une clé naturelle?

Exemples:

  • ArcGIS applique OBJECTID (ou un GlobalID)

  • QGIS ne charge pas les couches lorsqu'elles n'ont pas d'identifiant numérique.


8
Une explication possible: un identifiant numérique prend beaucoup moins d'octets qu'un identifiant non numérique. Cela est encore plus important lorsque vous commencez à lier différentes tables, qui stockent toutes une copie de l'ID.
johanvdw

+1 Bonne question, je ne pense pas que NoSQL nécessite des touches numériques.
Kirk Kuykendall


@cap C'est un peu sournois (et vous avez déjà publié ce lien).
whuber

Réponses:


6

Parce qu'ils ont besoin d'un champ indexable optimisé. Pour indexer un champ de chaîne encore et encore, il faudrait plus de surcharge et à la fin n'est pas aussi efficace.

ESRI prend en charge dans le monde SDE le «GLOBALID» qui est un champ GUID, il s'agit donc d'un champ de 32 caractères mais est toujours indexé pour augmenter les performances.


3
C'est une bonne explication de l'avantage d'efficacité d'un identifiant numérique. Mais je pense que @George sonde plus profondément que cela. Techniquement, les SGBDR n'ont pas besoin que leurs identifiants soient numériques, alors pourquoi les SIG devraient-ils l'être?
whuber

1
Le problème ici n'est pas la performance. Une clé unique non annulable le ferait. Mais pourquoi doit-il être numérique? Une fois que j'ai entendu ou lu qu'il doit être numérique car il utilise cette clé pour contrôler le rendu ... était dans Modeling Our World d'ESRI?
George Silva

2
Parce qu'un SIG n'est pas un SGBDR, bien qu'il puisse en utiliser un. Un SIG aura généralement des règles et des hypothèses, telles que l'hypothèse que la clé primaire sera un entier indexé ou GUID, pour des raisons de performances et de bon sens du codage.
blah238

1
ok, mais pourquoi assumer un numérique? pourquoi ne pouvons-nous pas choisir notre clé lors de la création d'un calque?
George Silva

1
J'imagine que la raison principale est que ces hypothèses rendent le travail d'écriture du code qui fait qu'un package SIG fonctionne beaucoup, beaucoup plus facile.
blah238

4

Si vous commencez à ajouter des enregistrements à une couche, vous pouvez compter sur un utilisateur saisissant un code alphanumérique unique pour chaque nouvelle fonctionnalité juste avant de l'écrire sur le disque.

..ou vous pouvez implémenter un simple champ entier à auto-incrémentation.


4

Comme beaucoup de gens l'ont suggéré, c'est une question de commodité; mais peut-être plus profondément, c'est la convention.

En tant que programmeur, mon premier réflexe serait d'utiliser une clé numérique pour un ID de couche car c'est ainsi que cela a toujours été fait. En effet, il ne m'est même pas venu à l'esprit, au moins sur un plan conscient, que je doive procéder autrement. Bien sûr, s'il y a une raison technique de ne pas utiliser d'entiers, dites s'il y a une possibilité qu'il y ait plus de couches que ce qui peut être stocké en 32 bits (une proposition très improbable!), Ou s'il y a une raison commerciale pour cela, alors des alternatives seraient envisagées.

Il y a aussi des considérations algorithmiques avec les touches numériques. Le tri et la recherche d'une liste de valeurs triées se résument finalement à une comparaison entre deux nombres, même s'il s'agit d'une liste de chaînes ou d'objets complexes; ils sont simplement transformés en nombres avec une fonction de hachage . Cela dit, sur les ordinateurs modernes, la recherche d'une liste de 100 ou même 1000 éléments est généralement aussi rapide avec une approche par force brute qu'avec un algorithme hautement optimisé. Dans le cas des couches dans un SIG, je ne vois même pas la plus complexe des cartes ayant plus de 1000 ou plus, et même si c'était le cas, les autres calculs associés prendraient des ordres de grandeur plus longs que tout petit gain d'un optimisé recherche d'une liste restreinte.

Les clés entières "ont tout simplement du sens" pour un programmeur, et comme le dit Brad, l'utilisation de touches non numériques demande plus d'efforts. Peut-être pas plus de code, mais plus d'effort mental, et nous sommes des créatures paresseuses d'habitude. De plus, la clé qui identifie de manière unique quelque chose comme une couche dans un SIG est considérée comme "cachée" par l'utilisateur, pour s'assurer qu'il ne s'en occupe pas et ne casse pas le code qui repose sur son unicité (malgré les mots-clés DB UNIQUE). Parce que si vous donnez suffisamment de corde à un utilisateur, tôt ou tard, quelqu'un se pendre avec. Bien sûr, imposez l' unicité sur un champ modifiable par l'utilisateur, mais le système sous-jacent doit supposer que sa clé est unique et non altérée.


Le OpenStreetMap est un exemple d'un projet qui a besoin de plus d'entiers de 32 bits. Ils utilisent bigintpour leurs clés primaires.
Mike T

Pour les voies / nœuds, oui. Mais la question initiale portait sur les couches dans un SIG.
MerseyViking

OpenStreetMap stocke les couches SIG.
George Silva

OSM stocke simplement les chemins et les nœuds qui ont des balises clé / valeur. C'est au système de présentation (par exemple OpenLayers) et au backend de rendu (par exemple Mapnik, Osmarender) de déterminer sa notion de couches en fonction de ces balises ou d'autre chose. Mais Mike a raison, il utilise bigints pour toutes les clés primaires de ses tables.
MerseyViking

+1 pour avoir mentionné qu'il s'agit d'une convention. C'est une convention car elle équivaut à de meilleures performances.
CaptDragon

3

Cette question a été déroutante pour les personnes (comme moi) qui développent le côté géodatabase des choses.

Ce n'est pas une limitation du stockage de base de données, car PostgreSQL peut définir des tables avec des CLÉS PRIMAIRES composites de différents types de données, cependant, ces tables ne peuvent pas être chargées dans des programmes comme QGIS. Sur une note historique connexe, PostgreSQL exigeait auparavant une colonne OID comme clé interne, qui était également un entier 32 bits. Cela était nécessaire jusqu'à la version 7.2 .

L'exigence d'ID entier 32 bits est vraiment une limitation de programmation. Il est beaucoup plus simple d'avoir un index vers un ensemble d'enregistrements en tant que type de données fixe (entier 32 bits), et il est pratique que ce soit également la CLÉ PRIMAIRE pour cet enregistrement. Il est plus difficile de permettre à un programme d'autoriser une clé primaire composite et de récupérer un enregistrement unique basé sur des types de données multiples et / ou variables. Cependant, comme l'OID de PostgreSQL, cette limitation peut être surmontée avec le temps de développement. Pour QGIS, le bogue de [maintenant] âgé de 5 ans pourrait être résolu un jour (voici une discussion récente sur le sujet).


+1 Bien dit. Comme preuve supplémentaire qu'il s'agit d'une limitation de programmation, notez qu'ESRI ne nécessitait (ni n'utilisait) aucun champ d'identification interne dans ArcView avant la sortie d'ArcGIS 8.x. L'ancien ArcView était capable de toutes les opérations de base de données qu'ArcGIS effectue (et était en fait plus rapide pour beaucoup d'entre elles).
whuber

2

Dans ESRI et d'autres logiciels SIG, il est courant d'avoir un dossier ou un ensemble de fichiers qui se produisent sur une classe d'entités ou un ensemble de données.
par exemple couverture arcinfo, fichier de formes, géodatabase fichier.
Ces "ensembles" de fichiers doivent être "joints" par le logiciel pour permettre de nombreuses fonctions SIG.
Tables d'attrubution, réseau, contrôles topologiques.
C'est le but de l'OID et aussi la raison pour laquelle il est non nul, caché, contrôlé par logiciel.


Je pense que les opérations SIG peuvent avoir quelque chose à voir avec cela, vraiment. intersection, unions (spatiales), différence, etc. Quelqu'un peut-il confirmer ou présenter cela plus en détail?
George Silva

Jetez un œil à la façon dont une seule classe d'entités SDE est réellement stockée dans une base de données telle qu'Oracle. Il y a une table pour les attributs, une table pour la géométrie, une table pour l'index spatial, une ou plusieurs tables pour les index d'attributs, etc. Si ESRI devait prendre en charge chaque codage de page de code / caractère pour une chaîne PKEY, nous tous sont toujours sur ArcView 3.x.
blah238

@George - comme indiqué par blah238 Il existe très peu d'applications SIG qui utilisent un seul fichier pour stocker les deux (toutes) les données. Qui peut être composé de coordonnées, de mesures, d'attributs, de règles, de relations, etc., selon le package. Il s'agit davantage de pouvoir suivre quelle ligne spatiale va avec quelle ligne d'attribut, quelle ligne de réseau, etc.
Brad Nesom

1
Je suis désolé blah238, je ne pense vraiment pas que la quantité de code ait été déterminante dans ce problème. La rencontre n'a rien à voir avec cela. La base de données fera le "calcul" et décidera si une séquence de caractères est égale ou non, par conséquent, en appliquant PKEY. Ce n'est pas sur la couche logicielle. @Brad Nesom: cela a aussi du sens. Mais dans Oracle et PostGIS, vous pouvez stocker tous vos attributs sur une seule table. Je suis d'accord que les fichiers de formes avaient besoin du redoutable ObjectID ... et qui a peut-être établi la norme?
George Silva

@George Shapefiles n'a pas eu besoin ni, en règle générale, utilisé un ObjectID. Ce champ OID a été introduit avec ArcGIS 8. Par conséquent, je doute que les fichiers de formes aient quelque chose à voir avec la question.
whuber
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.