Çoğu CBS paketinin neden sayısal bir kimliğe ihtiyacı var?


11

Bu basit ama muhtemelen tartışmalı bir sorudur: GIS paketlerinin çoğu (hepsi olmasa da) neden belirli bir katmanın benzersiz nullable olmayan sayısal tanımlayıcıya sahip olmasını gerektirir ?

Neden doğal bir anahtar yerine böyle bir yedek anahtara ihtiyaç vardır?

Örnekler:

  • ArcGIS, NESNE KİMLİĞİ (veya bir GlobalID) uygular

  • QGIS, sayısal bir kimliği olmadığında katmanları yüklemez.


8
Olası bir açıklama: sayısal bir kimlik, sayısal olmayan bir kimliğe göre çok daha az bayt alır. Bu, tümü kimliğin bir kopyasını depolayan farklı tabloları bağlamaya başladığınızda daha da önemlidir.
johanvdw

+1 İyi soru, NoSQL'in sayısal tuşlar gerektirdiğini düşünmüyorum .
Kirk Kuykendall


@cap Bu biraz gizleniyor (ve bu bağlantıyı zaten gönderdiniz).
whuber

Yanıtlar:


6

Çünkü optimize edilebilir endekslenebilir alana sahip olmaları gerekir. Bir dize alanını tekrar tekrar dizine eklemek daha fazla ek yük gerektirir ve sonunda o kadar verimli değildir.

ESRI, SDE dünyasında bir GUID alanı olan 'GLOBALID'i destekler, bu nedenle bu 32char alanıdır, ancak yine de performansı artırmak için endekslenmiştir.


3
Bu, sayısal bir kimliğin verimlilik avantajı için iyi bir açıklamadır. Ama bence @George bundan daha derinlemesine araştırıyor. Teknik olarak, RDBMS'lerin tanımlayıcılarının sayısal olması gerekmez, bu yüzden neden GIS'ler kullanılmalıdır?
whuber

1
Buradaki sorun performans değil. Sıfırlanamaz benzersiz bir anahtar bunu yapardı. Ama neden sayısal olmalı? Bir kez duydum veya sayısal olması gerektiğini okudum çünkü o render kontrol etmek için o anahtarı kullanır ... ESRI Dünyamızı Modelleme oldu?
George Silva

2
Çünkü bir CBS bir RDBMS değildir, bir tanesini kullanabilir. Bir CBS genellikle, performans ve kodlama akıl sağlığı için birincil anahtarın dizinlenmiş bir tam sayı veya GUID olacağı varsayımı gibi bazı kurallara ve varsayımlara sahip olacaktır.
blah238

1
tamam, ama neden bir sayısal varsayım? Katman oluştururken neden anahtarımızı seçemiyoruz?
George Silva

1
Ana nedeni, bu varsayımların bir CBS paketinin çok daha kolay çalışmasını sağlayan kodu yazma işini yapmasını hayal ediyorum.
blah238

4

Eğer bir katmana kayıtları ekleme başlatırsanız olabilir sadece diske yazmadan önce her yeni özellikler için benzersiz alfanümerik kodunu girerek bir kullanıcı güvenmek ..

..ya da basit bir otomatik eklemeli tamsayı alanı uygulayabilirsiniz.


4

Birçok insanın önerdiği gibi, bu bir kolaylık sorunudur; ama belki daha derinden, konvansiyon.

Bir programcı olarak, ilk içgüdüm, katman kimliği için sayısal bir anahtar kullanmak olacaktır, çünkü her zaman böyle yapılmıştır. Gerçekten de, en azından bilinçli bir düzeyde, bunu başka bir şekilde yapmam gerektiği bile gerçekleşmeyebilir. Tabii ki, tamsayıları kullanmamak için teknik bir neden varsa, 32 bitte depolanabilecek katmandan daha fazla katman olma olasılığı varsa (çok olası bir teklif!) Veya bunun bir iş nedeni varsa, alternatifler göz önünde bulundurulur.

Sayısal tuşlarla algoritmik hususlar da vardır. Sıralanan değerlerin bir listesinin sıralanması ve aranması, dizelerin veya karmaşık nesnelerin bir listesi olsa bile, sonuçta iki sayı arasındaki karşılaştırmaya kadar kaynar; sadece bir karma fonksiyonu ile sayılara dönüşürler . Modern bilgisayarlarda, 100 veya hatta 1000 maddelik bir listenin araştırılmasının, yüksek derecede optimize edilmiş bir algoritmada olduğu gibi kaba kuvvet yaklaşımı ile genellikle hızlı olduğu söylenebilir. Bir CBS'de katmanlar söz konusu olduğunda, 1000'den fazla haritaya sahip en karmaşık haritaları bile göremiyorum ve öyle olsa bile, diğer ilişkili hesaplamalar optimize edilmiş bir küçük kazanımdan daha büyük boyutta sipariş alacaktı kısa listeyi arama.

Tamsayı anahtarları bir programcıya "mantıklı" gelir ve Brad'in dediği gibi sayısal olmayan anahtarları kullanmak için daha fazla çaba vardır. Belki daha fazla kod değil, daha fazla zihinsel çaba ve tembel alışkanlık yaratıklarıyız. Ayrıca, bir CBS'de bir katman gibi bir şeyi benzersiz bir şekilde tanımlayan anahtar, kullanıcıyla karıştırılmadığından ve benzersizliğine dayanan kodu kırmadığından emin olmak için kullanıcıdan "gizli" olarak kabul edilir (buna rağmen DB UNIQUE anahtar kelimeleri). Çünkü bir kullanıcıya yeterince ip verirseniz, er ya da geç birileri kendini asacaktır. Elbette kullanıcı düzenlenebilir sahada benzersizliği zorlamak, ancak altta yatan sistem gerekir onun anahtarını varsayalım eşsiz ve, oynanmamış olduğunu.


OpenStreetMap daha 32 bit tamsayı daha ihtiyacı olan bir projenin bir örnektir. bigintBirincil anahtarları için kullanırlar .
Mike T

Yollar / düğümler için evet. Ancak asıl soru bir CBS'deki katmanlarla ilgiliydi.
MerseyViking

OpenStreetMap GIS katmanlarını depolar.
George Silva

OSM yalnızca anahtar / değer etiketlerine sahip yolları ve düğümleri saklar. Katmanlar kavramını bu etiketlere veya başka bir şeye göre belirlemek sunum sistemine (örn. OpenLayers) ve oluşturma arka ucuna (örn. Mapnik, Osmarender) bağlıdır. Ama Mike haklı, biginttüm tabloların birincil anahtarları için s kullanıyor .
MerseyViking

+1 konvansiyonla ilgili olduğunu belirttiği için. Bu bir kongre çünkü daha iyi performansa eşit.
CaptDragon

3

Bu soru, benim gibi şeylerin coğrafi veritabanı tarafını geliştiren kafa karıştırıcı bir soruydu.

PostgreSQL, farklı veri türlerinin bileşik PRIMARY KEYS'leri olan tabloları tanımlayabildiğinden, veritabanı depolamanın bir sınırlaması değildir, ancak bu tablolar QGIS gibi programlara yüklenemez. İlgili tarihi bir notta PostgreSQL , 32 bit tam sayı olan dahili anahtar olarak bir OID sütunu gerektiriyordu . Bu sürüm 7.2'ye kadar gerekliydi .

32 bit tamsayı kimliği gereksinimi gerçekten bir programlama sınırlamasıdır. Sabit veri türü (32 bit tam sayı) olarak bir kayıt kümesine bir dizin oluşturmak çok daha kolaydır ve bunun da söz konusu kayıt için PRIMARY KEY olması uygun olur. Bir programın bileşik bir birincil anahtara izin vermesi ve birden fazla ve / veya değişken veri türlerine dayalı benzersiz bir kayıt alması daha zordur. Ancak PostgreSQL'in OID'si gibi bu sınırlama da geliştirme süresi ile aşılabilir. QGIS için, [şimdi] 5 yaşındaki böcek bir gün çözülebilir (işte konuyla ilgili yakın tarihli bir tartışma ).


+1 Peki dedi. Bunun bir programlama sınırlaması olduğuna dair daha fazla kanıt olarak, ESRI'nin ArcGIS 8.x çıkmadan önce ArcView'de herhangi bir dahili tanımlayıcı alanı gerektirmediğini (veya kullanmadığını) unutmayın. Eski ArcView, ArcGIS'in gerçekleştirdiği tüm veritabanı işlemlerini yapabiliyordu (ve aslında çoğunda daha hızlıydı).
whuber

2

ESRI ve diğer GIS yazılımlarında, özellik sınıfı veya veri kümesini oluşturan bir klasör veya dosya kümesine sahip olmak yaygındır.
örneğin arcinfo kapsamı, şekil dosyası, dosya coğrafi veritabanı.
Bu dosya kümelerinin, birçok CBS işlevine izin vermek için yazılım tarafından "birleştirilmesi" gerekir.
Zayıf tablolar, ağ, topolojik kontroller.
OID'nin amacı budur ve aynı zamanda onu geçersiz, gizli, yazılım kontrollü hale getirmesinin sebebidir.


CBS operasyonlarının bununla bir ilgisi olabileceğini düşünüyorum. (mekansal) sendikalar, farklar, vs.
George Silva

Oracle gibi bir veritabanında tek bir SDE özellik sınıfının gerçekte nasıl saklandığına bir göz atın. Nitelikler için bir tablo, geometri için bir tablo, uzamsal dizin için bir tablo, özellik dizinleri için bir veya daha fazla tablo vb. Vardır. ESRI, PKEY dizesi için her kod sayfasını / karakter kodlamasını desteklemek zorunda kalırsa hepsi hala ArcView 3.x'te.
blah238

@George - blah238 tarafından belirtildiği gibi, her iki veriyi (tümünü) depolamak için tek bir dosya kullanan çok az CBS uygulaması vardır. Pakete bağlı olarak koordinatlar, önlemler, nitelikler, kurallar, ilişkiler ve daha fazlasından oluşabilir. Hangi uzamsal satırın hangi öznitelik satırı, hangi ağ satırı, vb. İle gittiğini takip edebilmek daha önemlidir.
Brad Nesom

1
Üzgünüm blah238, gerçekten bu konuda kod miktarının belirleyici olduğunu sanmıyorum. Kaplamanın bununla hiçbir ilgisi yok. Veritabanı "matematik" yapacak ve bir dizi karakter eşit olup olmadığını karar, bu nedenle, PKEY zorlama. Yazılım katmanında değil. @Brad Nesom: Bu da mantıklı. Ancak Oracle ve PostGIS'te tüm özniteliklerinizi tek bir tabloda saklayabilirsiniz. Şekil dosyalarının korkunç ObjectID ... 'e ihtiyacı olduğunu kabul ediyorum ve bu standardı ayarlamış olabilir mi?
George Silva

@George Shapefiles'a ne gerek vardı, ne de genel bir kural olarak bir ObjectID kullandı. Bu OID alanı ArcGIS 8 ile tanıtıldı. Bu nedenle şekil dosyalarının soru ile ilgisi olduğundan şüpheliyim.
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.