为什么大多数GIS软件包都需要数字ID?


11

这是一个简单但可能引起争议的问题:为什么大多数(如果不是全部)GIS软件包都要求确定的图层具有唯一的,不可为空的数字标识符?

为什么需要这样的替代密钥而不是自然的替代密钥?

例子:

  • ArcGIS强制执行OBJECTID(或GlobalID)

  • 当没有数字ID时,QGIS不会加载图层。


8
可能的解释:数字ID比非数字ID占用的字节少得多。当您开始链接不同的表时,这一点尤为重要,这些表都存储了ID的副本。
johanvdw 2011年

+1好问题,我认为NoSQL不需要数字键。
Kirk Kuykendall,


@cap这有点傻(您已经发布了该链接)。
ub

Answers:


6

因为它们需要具有优化的可索引字段。一遍又一遍地索引一个字符串字段将需要更多的开销,最后效率不高。

ESRI实际上在SDE世界中支持GUIID字段“ GLOBALID”,因此这是一个32个字符的字段,但仍进行索引以提高性能。


3
对于数字ID的效率优势,这是一个很好的解释。但是我认为@George的探索比这还深入。从技术上讲,RDBMS不需要其标识符为数字,那么为什么要使用GIS?
ub

1
这里的问题不是性能。不能为空的唯一键可以做到这一点。但是为什么必须是数字呢?一旦我听到或读到它必须是数字,因为它使用该键控制渲染...是ESRI的《建模我们的世界》中的内容吗?
乔治席尔瓦

2
因为GIS不是RDBMS,但是它可以使用RDBMS。GIS通常具有一些规则和假设,例如出于性能和编码合理性的考虑,主键将是索引整数或GUID。
blah238

1
好的,但是为什么要假设数字呢?为什么在创建图层时不能选择密钥?
乔治席尔瓦,

1
我猜想主要原因是这些假设使得编写使GIS包工作的代码变得容易得多的工作。
blah238

4

如果您开始将记录添加到图层,则可以依靠用户在将每个新功能写入磁盘之前为每个新功能输入唯一的字母数字代码。

..或您可以实现一个简单的自动递增整数字段。


4

正如许多人所建议的那样,这是一个方便的问题。但也许更深刻的是,这是惯例。

作为程序员,我的第一个直觉是将数字键用于图层ID,因为这一直是这样做的方式。确实,至少在意识层面上,我什至没有想到我应该以任何其他方式来做。当然,如果出于技术原因不使用整数,则说是否有可能存在比32位中存储的层更多的层(这是不太可能的建议!),或者是出于商业原因,然后将考虑替代方案。

使用数字键还需要考虑算法问题。排序和搜索排序值列表最终归结为两个数字之间的比较,即使它是字符串或复杂对象的列表也是如此;它们只是通过散列函数变成数字。话虽如此,在现代计算机上,使用蛮力搜索方法搜索列表中的100甚至1000个项目通常与使用高度优化的算法一样快。对于GIS中的图层,即使是最复杂的地图,也看不到超过1000左右,即使这样,其他关联的计算也要比优化后的任何小增益花费更长的数量级。搜索短名单。

整数键对程序员来说“很有意义”,正如Brad所说,使用非数字键需要更多的努力。也许不是更多的代码,而是更多的精力,我们是习惯的懒惰生物。同样,唯一标识GIS中诸如图层之类的键的用户也被认为是“隐藏的”,以确保他们不会对此产生混乱,并破坏依赖于其唯一性的代码(尽管使用DB UNIQUE关键字)。因为如果给用户足够的绳索,迟早有人会用它吊死自己。一定要在用户可编辑的字段上实施唯一性,但是底层系统必须假定其密钥是唯一且不受篡改的。


OpenStreetMap的是需要多于32位整数的一个项目的一个例子。他们使用bigint其主键。
Mike T

对于方式/节点,是的。但是最初的问题是关于GIS中的图层的。
MerseyViking

OpenStreetMap存储GIS图层。
乔治席尔瓦,

OSM仅存储具有键/值标签的方式和节点。呈现系统(例如OpenLayers)和渲染后端(例如Mapnik,Osmarender)将根据这些标签或其他内容确定其图层概念。但是Mike是正确的,它将bigints用于所有表的主键。
MerseyViking

+1表示与惯例有关。这是一个约定,因为它等于更好的性能。
CaptDragon 2011年

3

这个问题对像我这样开发事物的地理数据库方面的人来说是一个令人困惑的问题。

这不是数据库存储的限制,因为PostgreSQL可以使用不同数据类型的复合PRIMARY KEYS定义表,但是这些表不能加载到QGIS之类的程序中。根据相关的历史记录,PostgreSQL曾经需要OID列作为内部键,它也是32位整数。在7.2版之前,这是必需的。

32位整数ID的要求实际上是编程上的限制。将一组记录的索引作为固定数据类型(32位整数)要简单得多,并且方便地将其作为该记录的主键也很方便。使程序允许组合主键,并使其基于多种和/或多种数据类型检索唯一记录,将更具挑战性。但是,就像PostgreSQL的OID一样,可以通过开发时间来克服此限制。对于QGIS,[现在] 5岁的bug可能有一天会得到解决(这里是有关该主题的最新讨论)。


+1说得好。为了进一步证明这是编程上的限制,请注意,在ArcGIS 8.x发布之前,ESRI在ArcView中不需要(或使用)任何内部标识符字段。旧的ArcView能够执行ArcGIS执行的所有数据库操作(实际上其中许多操作更快)。
ub

2

在ESRI和其他GIS软件中,通常有一个在要素类或数据集上构成的文件夹或文件集。
例如arcinfo coverage,shapefile,文件地理数据库。
这些“文件”集需要由软件“加入”以允许许多GIS功能。
属性表,网络,拓扑控件。
这是OID的目的,也是使其成为非空,隐藏且受软件控制的原因。


我认为GIS操作可能与此有关。相交,(空间)并集,差异等。有人可以确认或更详细地说明这一点吗?
乔治席尔瓦,

看一下单个SDE要素类如何实际存储在数据库(如Oracle)中。有一个用于属性的表,一个用于几何的表,一个用于空间索引的表,一个或多个用于属性索引的表,等等。如果ESRI必须支持字符串PKEY的每个代码页/字符编码,所有这些都仍在ArcView 3.x上。
blah238

@George-blah238指出,很少有GIS应用程序使用一个文件来存储两个(全部)数据。其中可以包含坐标,度量,属性,规则,关系等,具体取决于软件包。与能够跟踪哪个空间行与哪个属性行,哪个网络行等等有关,等等。
布拉德·尼索姆

1
抱歉,我非常抱歉,此问题中没有决定代码的数量。与此无关。数据库将执行“数学运算”,并确定字符序列是否相等,因此强制执行PKEY。它不在软件层上。@Brad Nesom:这也很有意义。但是在Oracle和PostGIS中,您可以将所有属性存储在一个表中。我同意shapefile需要可怕的ObjectID ...这可能已经设定了标准?
乔治席尔瓦

@George Shapefiles既不需要也没有使用ObjectID。OID字段是在ArcGIS 8中引入的。因此,我怀疑shapefile是否与问题有关。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.