Dlaczego większość pakietów GIS potrzebuje identyfikatora numerycznego?

11

Jest to proste, ale być może kontrowersyjne pytanie: dlaczego większość (jeśli nie wszystkie) pakiety GIS wymagają, aby określona warstwa miała unikalny niedopuszczalny identyfikator numeryczny ?

Dlaczego potrzebujemy takiego klucza zastępczego zamiast klucza naturalnego?

Przykłady:

  • ArcGIS wymusza OBJECTID (lub GlobalID)

  • QGIS nie ładuje warstw, jeśli nie mają identyfikatora numerycznego.

George Silva
źródło
8
Możliwe wyjaśnienie: identyfikator numeryczny zajmuje znacznie mniej bajtów niż identyfikator nienumeryczny. Ma to jeszcze większe znaczenie, gdy zaczniesz łączyć różne tabele, z których wszystkie przechowują kopię identyfikatora.
johanvdw
+1 Dobre pytanie, nie sądzę, że NoSQL wymaga klawiszy numerycznych.
Kirk Kuykendall,
tinyurl.com/6xrtk2l
CaptDragon
@cap To trochę snide (i już opublikowałeś ten link).
whuber

Odpowiedzi:

6

Ponieważ muszą mieć zoptymalizowane pole indeksowane. Ciągłe indeksowanie pola ciągów wymagałoby większego obciążenia, a na koniec nie jest tak wydajne.

ESRI faktycznie obsługuje w świecie SDE „GLOBALID”, który jest polem GUID, więc jest to pole 32-kanałowe, ale nadal jest indeksowane w celu zwiększenia wydajności.

DEWright
źródło
3
To dobre wytłumaczenie przewagi wydajności identyfikatora numerycznego. Ale myślę, że @George sonduje głębiej niż to. Technicznie rzecz biorąc, RDBMS nie wymagają, aby ich identyfikatory były numeryczne, więc po co GIS?
whuber
1
Problemem nie jest występ. Czyniłby to niepowtarzalny klucz, który nie ma wartości zerowej. Ale dlaczego musi być liczbowy? Po usłyszeniu lub przeczytaniu, że musi być numeryczny, ponieważ używa tego klucza do kontrolowania renderowania ... był w Modelowaniu naszego świata z ESRI?
George Silva,
2
Ponieważ GIS nie jest RDBMS, chociaż może z niego korzystać. GIS zwykle będzie miał pewne reguły i założenia, takie jak założenie, że kluczem podstawowym będzie indeksowana liczba całkowita lub identyfikator GUID, ze względu na wydajność i poprawność kodowania.
blah238,
1
ok, ale dlaczego zakładać cyfrę? dlaczego nie możemy wybrać naszego klucza podczas tworzenia warstwy?
George Silva,
1
Wyobrażam sobie, że głównym powodem jest to, że założenia te znacznie ułatwiają pisanie kodu, który sprawia, że ​​pakiet GIS działa.
blah238,
4

Jeśli rozpocząć dodawanie rekordów do warstwy, która mogłaby polegać na wchodzącego unikalny kod alfanumeryczny dla każdej nowej funkcji użytkownika tuż przed pisania go na dysku ..

.. lub możesz zaimplementować proste pole liczb całkowitych z automatyczną inkrementacją.

geografia
źródło
4

Jak sugerowało wiele osób, jest to kwestia wygody; ale może głębiej, jest to konwencja.

Jako programista, moim pierwszym instynktem byłoby użycie klucza numerycznego dla identyfikatora warstwy, ponieważ zawsze tak było. Rzeczywiście, może nawet nie przyszło mi do głowy, przynajmniej na świadomym poziomie, że powinienem to zrobić w inny sposób. Oczywiście, jeśli istnieje techniczny powód, aby nie używać liczb całkowitych, powiedzmy, czy istnieje możliwość istnienia większej liczby warstw niż może być przechowywana w 32-bitach (bardzo mało prawdopodobna propozycja!), Lub jeśli istnieje uzasadnienie biznesowe, wtedy rozważone zostaną alternatywy.

Istnieją również względy algorytmiczne dotyczące klawiszy numerycznych. Sortowanie i wyszukiwanie listy posortowanych wartości ostatecznie sprowadza się do porównania dwóch liczb, nawet jeśli jest to lista ciągów znaków lub złożonych obiektów; zostają po prostu zamienione na liczby z funkcją haszującą . To powiedziawszy, na współczesnych komputerach przeszukiwanie listy powiedzmy 100, a nawet 1000 pozycji jest zwykle tak szybkie przy użyciu metody brutalnej siły, jak przy wysoce zoptymalizowanym algorytmie. W przypadku warstw w GIS nie widzę nawet najbardziej złożonych map mających więcej niż 1000, a nawet gdyby tak było, inne powiązane obliczenia zajęłyby rzędy wielkości dłuższe niż jakikolwiek niewielki zysk ze zoptymalizowanego wyszukiwanie krótkiej listy.

Klucze całkowite „po prostu mają sens” dla programisty, a jak mówi Brad, więcej wysiłku wymaga użycie kluczy nienumerycznych. Może nie więcej kodu, ale więcej wysiłku umysłowego, a my jesteśmy leniwymi stworzeniami przyzwyczajonymi. Ponadto klucz, który jednoznacznie identyfikuje coś w rodzaju warstwy w GIS, jest uważany za „ukryty” przed użytkownikiem, aby upewnić się, że nie zadziera z nim i nie złamie kodu, który opiera się na jego wyjątkowości (pomimo słów kluczowych DB UNIQUE). Ponieważ jeśli dasz użytkownikowi wystarczającą ilość liny, prędzej czy później ktoś się z nią zawiesi. Wymuszaj unikalność w polu edytowalnym przez użytkownika, ale system bazowy musi założyć, że jego klucz jest unikalny i niezakłócony.

MerseyViking
źródło
OpenStreetMap jest przykładem projektu, który potrzebuje więcej niż 32-bitowych liczb całkowitych. Używają bigintdo swoich kluczy podstawowych.
Mike T
W przypadku sposobów / węzłów tak. Ale pierwotne pytanie dotyczyło warstw w GIS.
MerseyViking
OpenStreetMap przechowuje warstwy GIS.
George Silva,
OSM przechowuje tylko sposoby i węzły, które mają znaczniki klucz / wartość. To system prezentacji (np. OpenLayers) i backend renderowania (np. Mapnik, Osmarender) określają pojęcie warstw na podstawie tych znaczników lub czegoś innego. Ale Mike ma rację, używa bigints dla wszystkich kluczy podstawowych swoich tabel.
MerseyViking
+1 za wspomnienie o konwencji. To konwencja, ponieważ oznacza lepszą wydajność.
CaptDragon,
3

To pytanie było mylące dla osób (takich jak ja), które rozwijają geobazę po stronie rzeczy.

Nie jest to ograniczenie pamięci bazy danych, ponieważ PostgreSQL może definiować tabele ze złożonymi KLUCZAMI PODSTAWOWYMI różnych typów danych, jednak tabel tych nie można załadować do programów takich jak QGIS. W powiązanej historycznej notatce PostgreSQL wymagał kolumny OID jako klucza wewnętrznego, który był również 32-bitową liczbą całkowitą. Było to wymagane do wersji 7.2 .

Wymaganie 32-bitowej liczby całkowitej jest naprawdę ograniczeniem programowania. Znacznie łatwiej jest mieć indeks do zestawu rekordów jako stały typ danych (32-bitowa liczba całkowita) i wygodnie jest, aby był to również KLUCZ PODSTAWOWY dla tego rekordu. Trudniej jest pozwolić programowi na użycie złożonego klucza głównego i aby uzyskać unikalny rekord oparty na wielu i / lub różnych typach danych. Jednak podobnie jak OID PostgreSQL, ograniczenie to można przezwyciężyć wraz z czasem programowania. W przypadku QGIS 5-letni błąd może zostać kiedyś rozwiązany (tutaj jest niedawna dyskusja na ten temat).

Mike T.
źródło
+1 Dobrze powiedziane. Jako kolejny dowód na to, że jest to ograniczenie programowania, zauważ, że ESRI nie wymagał (ani nie używał) żadnych wewnętrznych pól identyfikacyjnych w ArcView przed wydaniem ArcGIS 8.x. Stary ArcView był zdolny do wszystkich operacji na bazie danych, które wykonuje ArcGIS (i w rzeczywistości był szybszy w wielu z nich).
whuber
2

W ESRI i innym oprogramowaniu GIS często występuje folder lub zestaw plików tworzących klasę obiektów lub zestaw danych.
np. pokrycie arcinfo, plik kształtu, geobaza plików.
Te „zestawy” plików muszą zostać „połączone” przez oprogramowanie, aby umożliwić wiele funkcji GIS.
Tabele attrubute, kontrola sieci, topologia.
Taki jest cel OID, a także powód, dla którego nie ma on wartości zerowej, jest ukryty, kontrolowany programowo.

Brad Nesom
źródło
Myślę, że operacje GIS mogą mieć z tym coś wspólnego. przecinają się, (przestrzenne) związki, różnice itp. Czy ktoś może potwierdzić lub przedstawić to bardziej szczegółowo?
George Silva,
Zobacz, jak w rzeczywistości jedna klasa funkcji SDE jest przechowywana w bazie danych, takiej jak Oracle. Istnieje jedna tabela dla atrybutów, jedna tabela dla geometrii, jedna tabela dla indeksu przestrzennego, jedna lub więcej tabel dla indeksów atrybutów itp. Gdyby ESRI musiał obsługiwać każdą stronę kodową / kodowanie znaków dla łańcucha PKEY, wszyscy nadal korzystają z ArcView 3.x.
blah238
@George - jak zauważył blah238 Istnieje bardzo niewiele aplikacji GIS, które używają jednego pliku do przechowywania obu (wszystkich) danych. Który może składać się ze współrzędnych, miar, atrybutów, reguł, relacji i innych w zależności od pakietu. Ma to więcej wspólnego z możliwością śledzenia, który wiersz przestrzenny idzie z którym rzędem atrybutów, który wiersz sieci itd.
Brad Nesom,
1
Przepraszam blah238, naprawdę nie sądzę, żeby ilość kodu była determinująca w tym wydaniu. Bisowanie nie ma z tym nic wspólnego. Baza danych wykona „matematykę” i zdecyduje, czy sekwencja znaków jest równa, czy nie, dlatego wymusza PKEY. Nie ma go w warstwie oprogramowania. @Brad Nesom: to też ma sens. Ale w Oracle i PostGIS możesz przechowywać wszystkie swoje atrybuty na jednym stole. Zgadzam się, że pliki shapefile potrzebowały przerażającego ObjectID ... a to mogło wyznaczyć standard?
George Silva,
@George Shapefiles nie jest potrzebny ani, co do zasady, nie korzysta z ObjectID. To pole OID zostało wprowadzone w ArcGIS 8. Dlatego wątpię, aby pliki kształtów miały coś wspólnego z tym pytaniem.
whuber