Warum benötigen die meisten GIS-Pakete eine numerische ID?

11

Dies ist eine einfache, aber möglicherweise kontroverse Frage: Warum erfordern die meisten (wenn nicht alle) GIS-Pakete, dass eine bestimmte Ebene eine eindeutige, nicht nullbare numerische Kennung hat?

Warum wird ein solcher Ersatzschlüssel anstelle eines natürlichen benötigt?

Beispiele:

  • ArcGIS erzwingt OBJECTID (oder eine GlobalID)

  • QGIS lädt keine Layer, wenn sie keine numerische ID haben.

George Silva
quelle
8
Eine mögliche Erklärung: Eine numerische ID benötigt viel weniger Bytes als eine nicht numerische ID. Dies ist umso wichtiger, wenn Sie verschiedene Tabellen verknüpfen, in denen alle eine Kopie der ID speichern.
Johanvdw
+1 Gute Frage, ich glaube nicht, dass NoSQL numerische Schlüssel benötigt.
Kirk Kuykendall
tinyurl.com/6xrtk2l
CaptDragon
@cap Das ist ein bisschen snide (und du hast diesen Link bereits gepostet).
whuber

Antworten:

6

Weil sie ein optimiertes indizierbares Feld haben müssen. Das wiederholte Indizieren eines Zeichenfolgenfelds würde mehr Overhead erfordern und ist am Ende einfach nicht so effizient.

ESRI unterstützt in der SDE-Welt tatsächlich die 'GLOBALID', die ein GUID-Feld ist. Dies ist also ein 32-Zeichen-Feld, das jedoch weiterhin indiziert ist, um die Leistung zu steigern.

DEWright
quelle
3
Dies ist eine gute Erklärung für den Effizienzvorteil einer numerischen ID. Aber ich denke, @George geht tiefer. Technisch gesehen müssen RDBMS nicht ihre Bezeichner numerisch sein. Warum sollten GIS also?
whuber
1
Das Problem hier ist nicht Leistung. Ein nicht nullbarer eindeutiger Schlüssel würde dies tun. Aber warum muss es numerisch sein? Sobald ich gehört oder gelesen habe, dass es numerisch sein muss, weil es diesen Schlüssel verwendet, um das Rendern zu steuern ... war in Modeling Our World von ESRI?
George Silva
2
Weil ein GIS kein RDBMS ist, obwohl es eines verwenden kann. Ein GIS enthält normalerweise einige Regeln und Annahmen, z. B. die Annahme, dass der Primärschlüssel eine indizierte Ganzzahl oder GUID ist, um die Leistung und die Codierung zu gewährleisten.
blah238
1
ok, aber warum eine Zahl annehmen? Warum können wir unseren Schlüssel beim Erstellen einer Ebene nicht auswählen?
George Silva
1
Ich würde mir vorstellen, dass der Hauptgrund darin besteht, dass diese Annahmen das Schreiben des Codes erleichtern, mit dem ein GIS-Paket viel, viel einfacher funktioniert.
blah238
4

Wenn Sie anfangen, Datensätze zu einer Ebene hinzuzufügen, können Sie sich darauf verlassen, dass ein Benutzer einen eindeutigen alphanumerischen Code für jede neue Funktion eingibt, bevor er sie auf die Festplatte schreibt.

..oder Sie könnten ein einfaches automatisch inkrementierendes Ganzzahlfeld implementieren.

geographika
quelle
4

Wie viele Leute vorgeschlagen haben, ist es eine Frage der Bequemlichkeit; aber vielleicht tiefer ist es Konvention.

Als Programmierer wäre mein erster Instinkt, einen numerischen Schlüssel für eine Ebenen-ID zu verwenden, da dies immer so war. In der Tat kann es mir zumindest bewusst nicht einmal einfallen, dass ich es anders machen sollte. Wenn es einen technischen Grund gibt, keine ganzen Zahlen zu verwenden, sagen Sie natürlich, ob die Möglichkeit besteht, dass mehr Ebenen vorhanden sind, als in 32-Bit gespeichert werden können (ein sehr unwahrscheinlicher Vorschlag!), Oder ob es einen geschäftlichen Grund dafür gibt. dann würden Alternativen in Betracht gezogen.

Es gibt auch algorithmische Überlegungen mit Zifferntasten. Das Sortieren und Durchsuchen einer Liste sortierter Werte führt letztendlich zu einem Vergleich zwischen zwei Zahlen, selbst wenn es sich um eine Liste von Zeichenfolgen oder komplexen Objekten handelt. Sie werden lediglich mit einer Hashing-Funktion in Zahlen umgewandelt . Auf modernen Computern ist das Durchsuchen einer Liste mit beispielsweise 100 oder sogar 1000 Elementen mit einem Brute-Force-Ansatz normalerweise genauso schnell wie mit einem hochoptimierten Algorithmus. Im Fall von Ebenen in einem GIS kann ich nicht einmal die komplexesten Karten mit mehr als 1000 Karten sehen, und selbst wenn dies der Fall wäre, würden die anderen zugehörigen Berechnungen Größenordnungen länger dauern als jeder kleine Gewinn aus einer optimierten Karte Suche nach einer kurzen Liste.

Ganzzahlige Tasten sind für einen Programmierer "nur sinnvoll", und wie Brad sagt, ist die Verwendung nicht numerischer Tasten aufwändiger. Vielleicht nicht mehr Code, sondern mehr geistige Anstrengung, und wir sind faule Gewohnheitstiere. Außerdem wird der Schlüssel, der so etwas wie eine Ebene in einem GIS eindeutig identifiziert, als "verborgen" für den Benutzer betrachtet, um sicherzustellen, dass er nicht damit herumspielt und Code bricht, der auf seiner Eindeutigkeit beruht (ungeachtet der DB UNIQUE-Schlüsselwörter). Denn wenn Sie einem Benutzer genug Seil geben, wird sich früher oder später jemand daran aufhängen. Erzwingen Sie auf jeden Fall die Eindeutigkeit eines vom Benutzer bearbeitbaren Felds, aber das zugrunde liegende System muss davon ausgehen, dass sein Schlüssel eindeutig und nicht manipuliert ist.

MerseyViking
quelle
Die OpenStreetMap ist ein Beispiel für ein Projekt, das mehr als 32-Bit-Ganzzahlen benötigt. Sie verwenden bigintfür ihre Primärschlüssel.
Mike T
Für Wege / Knoten ja. Die ursprüngliche Frage betraf jedoch Ebenen in einem GIS.
MerseyViking
OpenStreetMap speichert GIS-Layer.
George Silva
OSM speichert nur Wege und Knoten, die Schlüssel- / Wert-Tags haben. Es liegt an dem Präsentationssystem (z. B. OpenLayers) und dem Rendering-Backend (z. B. Mapnik, Osmarender), die Vorstellung von Ebenen basierend auf diesen Tags oder etwas anderem zu bestimmen. Aber Mike hat recht, er verwendet bigints für alle Primärschlüssel seiner Tabellen.
MerseyViking
+1 für die Erwähnung, dass es um Konventionen geht. Es ist eine Konvention, weil sie einer besseren Leistung entspricht.
CaptDragon
3

Diese Frage war für Leute (wie mich) verwirrend, die die Geodatabase-Seite der Dinge entwickeln.

Dies ist keine Einschränkung des Datenbankspeichers, da PostgreSQL Tabellen mit zusammengesetzten PRIMARY KEYS verschiedener Datentypen definieren kann. Diese Tabellen können jedoch nicht in Programme wie QGIS geladen werden. In einem verwandten historischen Hinweis benötigte PostgreSQL früher eine OID- Spalte als internen Schlüssel, der ebenfalls eine 32-Bit-Ganzzahl war. Dies war bis Version 7.2 erforderlich .

Die 32-Bit-Ganzzahl-ID-Anforderung ist wirklich eine Programmierbeschränkung. Es ist viel einfacher, einen Index für eine Reihe von Datensätzen als festen Datentyp (32-Bit-Ganzzahl) zu haben, und es ist zweckmäßig, dass dies auch der primäre Schlüssel für diesen Datensatz ist. Es ist schwieriger, ein Programm so zu gestalten, dass es einen zusammengesetzten Primärschlüssel zulässt, und einen eindeutigen Datensatz abzurufen, der auf mehreren und / oder unterschiedlichen Datentypen basiert. Wie bei der OID von PostgreSQL kann diese Einschränkung jedoch mit der Entwicklungszeit überwunden werden. Für QGIS könnte der [jetzt] 5 Jahre alte Fehler eines Tages behoben sein (hier ist eine aktuelle Diskussion zu diesem Thema).

Mike T.
quelle
+1 Gut gesagt. Beachten Sie als weiteren Beweis dafür, dass dies eine Programmierbeschränkung ist, dass ESRI vor dem Erscheinen von ArcGIS 8.x keine internen Bezeichnerfelder in ArcView benötigt (oder verwendet) hat. Das alte ArcView war in der Lage, alle von ArcGIS ausgeführten Datenbankoperationen auszuführen (und war bei vielen von ihnen sogar schneller).
whuber
2

In ESRI und anderer GIS-Software ist es üblich, einen Ordner oder eine Reihe von Dateien zu haben, die für Feature-Classes oder Datasets erstellt werden.
zB Arcinfo-Abdeckung, Shapefile, Datei-Geodatabase.
Diese "Sätze" von Dateien müssen von der Software "zusammengefügt" werden, um viele GIS-Funktionen zu ermöglichen.
Attrubute-Tabellen, Netzwerk, topologische Kontrollen.
Dies ist der Zweck der OID und auch der Grund dafür, dass sie nicht nullbar, versteckt und softwaregesteuert ist.

Brad Nesom
quelle
Ich denke, die GIS-Operationen haben wirklich etwas damit zu tun. Schnittpunkte, (räumliche) Gewerkschaften, Unterschiede usw. Kann jemand dies genauer bestätigen oder präsentieren?
George Silva
Sehen Sie sich an, wie eine einzelne SDE-Feature-Class tatsächlich in einer Datenbank wie Oracle gespeichert ist. Es gibt eine Tabelle für die Attribute, eine Tabelle für die Geometrie, eine Tabelle für den räumlichen Index, eine oder mehrere Tabellen für die Attributindizes usw. Wenn ESRI jede Codepage- / Zeichencodierung für eine Zeichenfolge PKEY unterstützen müsste, würden wir Alle befinden sich noch in ArcView 3.x.
blah238
@George - wie von blah238 festgestellt Es gibt nur sehr wenige GIS-Anwendungen, die eine einzige Datei zum Speichern beider (aller) Daten verwenden. Diese können je nach Paket aus Koordinaten, Kennzahlen, Attributen, Regeln, Beziehungen und mehr bestehen. Es geht mehr darum, verfolgen zu können, welche räumliche Zeile zu welcher Attributzeile, welcher Netzwerkzeile usw. gehört.
Brad Nesom
1
Es tut mir leid, blah238, ich glaube wirklich nicht, dass die Menge an Code in dieser Ausgabe entscheidend war. Das Enconding hat damit nichts zu tun. Die Datenbank führt die "Mathematik" durch und entscheidet, ob eine Zeichenfolge gleich ist oder nicht, wodurch PKEY erzwungen wird. Es ist nicht auf der Software-Ebene. @Brad Nesom: das macht auch Sinn. In Oracle und PostGIS können Sie jedoch alle Ihre Attribute in einer einzigen Tabelle speichern. Ich bin damit einverstanden, dass Shapefiles die gefürchtete ObjectID benötigen ... und das könnte den Standard gesetzt haben?
George Silva
@George Shapefiles benötigte weder eine ObjectID noch verwendete sie in der Regel. Dieses OID-Feld wurde mit ArcGIS 8 eingeführt. Daher bezweifle ich, dass Shapefiles etwas mit der Frage zu tun haben.
whuber