这是一个简单但可能引起争议的问题:为什么大多数(如果不是全部)GIS软件包都要求确定的图层具有唯一的,不可为空的数字标识符?
为什么需要这样的替代密钥而不是自然的替代密钥?
例子:
ArcGIS强制执行OBJECTID(或GlobalID)
当没有数字ID时,QGIS不会加载图层。
这是一个简单但可能引起争议的问题:为什么大多数(如果不是全部)GIS软件包都要求确定的图层具有唯一的,不可为空的数字标识符?
为什么需要这样的替代密钥而不是自然的替代密钥?
例子:
ArcGIS强制执行OBJECTID(或GlobalID)
当没有数字ID时,QGIS不会加载图层。
Answers:
因为它们需要具有优化的可索引字段。一遍又一遍地索引一个字符串字段将需要更多的开销,最后效率不高。
ESRI实际上在SDE世界中支持GUIID字段“ GLOBALID”,因此这是一个32个字符的字段,但仍进行索引以提高性能。
正如许多人所建议的那样,这是一个方便的问题。但也许更深刻的是,这是惯例。
作为程序员,我的第一个直觉是将数字键用于图层ID,因为这一直是这样做的方式。确实,至少在意识层面上,我什至没有想到我应该以任何其他方式来做。当然,如果出于技术原因不使用整数,则说是否有可能存在比32位中存储的层更多的层(这是不太可能的建议!),或者是出于商业原因,然后将考虑替代方案。
使用数字键还需要考虑算法问题。排序和搜索排序值列表最终归结为两个数字之间的比较,即使它是字符串或复杂对象的列表也是如此;它们只是通过散列函数变成数字。话虽如此,在现代计算机上,使用蛮力搜索方法搜索列表中的100甚至1000个项目通常与使用高度优化的算法一样快。对于GIS中的图层,即使是最复杂的地图,也看不到超过1000左右,即使这样,其他关联的计算也要比优化后的任何小增益花费更长的数量级。搜索短名单。
整数键对程序员来说“很有意义”,正如Brad所说,使用非数字键需要更多的努力。也许不是更多的代码,而是更多的精力,我们是习惯的懒惰生物。同样,唯一标识GIS中诸如图层之类的键的用户也被认为是“隐藏的”,以确保他们不会对此产生混乱,并破坏依赖于其唯一性的代码(尽管使用DB UNIQUE关键字)。因为如果给用户足够的绳索,迟早有人会用它吊死自己。一定要在用户可编辑的字段上实施唯一性,但是底层系统必须假定其密钥是唯一且不受篡改的。
bigint
其主键。
bigint
s用于所有表的主键。
这个问题对像我这样开发事物的地理数据库方面的人来说是一个令人困惑的问题。
这不是数据库存储的限制,因为PostgreSQL可以使用不同数据类型的复合PRIMARY KEYS定义表,但是这些表不能加载到QGIS之类的程序中。根据相关的历史记录,PostgreSQL曾经需要OID列作为内部键,它也是32位整数。在7.2版之前,这是必需的。
32位整数ID的要求实际上是编程上的限制。将一组记录的索引作为固定数据类型(32位整数)要简单得多,并且方便地将其作为该记录的主键也很方便。使程序允许组合主键,并使其基于多种和/或多种数据类型检索唯一记录,将更具挑战性。但是,就像PostgreSQL的OID一样,可以通过开发时间来克服此限制。对于QGIS,[现在] 5岁的bug可能有一天会得到解决(这里是有关该主题的最新讨论)。
在ESRI和其他GIS软件中,通常有一个在要素类或数据集上构成的文件夹或文件集。
例如arcinfo coverage,shapefile,文件地理数据库。
这些“文件”集需要由软件“加入”以允许许多GIS功能。
属性表,网络,拓扑控件。
这是OID的目的,也是使其成为非空,隐藏且受软件控制的原因。