我已经使用了所有这三个数据库并在它们之间进行了迁移,因此希望我仍然可以在旧文章中添加一些内容。十年前,我的任务是将稍大的4.5亿个空间对象从GML数据集放到空间数据库中。我决定尝试MySQL和Postgis,当时SQL Server中没有空间,而且我们的启动环境很小,所以MySQL似乎很合适。随后,我参与了MySQL,我参加/参加了几次会议,并大量参与了MySQL中与GIS更加兼容的功能的beta测试,该测试最终与5.5版一起发布。随后,我参与了将空间数据迁移到Postgis和将公司数据(带有空间元素)迁移到SQL Server的工作。这些是我的发现。
的MySQL
1)。稳定性问题。在5年的时间里,我们遇到了几个数据库损坏问题,这些问题只能通过在索引文件上运行myismachk来解决,而在4.5亿行的表上,此过程要花费24个小时以上。
2)。直到最近,只有MyISAM表支持空间数据类型。这意味着,如果您需要交易支持,那将很不幸。现在,InnoDB表类型确实支持空间类型,但不支持它们的索引,鉴于空间数据集的典型大小,它并不是非常有用。参见http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html我参加会议的经验是,空间问题只是事后的想法-我们已经实现了复制,分区等,但不适用于空间。编辑:在即将发布的5.7.5版本中, InnoDB将最终支持空间列上的索引,这意味着ACID,外键和空间索引最终将在同一引擎中可用。
3)。与Postgis和SQL Server空间相比,空间功能受到极大限制。仍然没有作用于整个几何字段的ST_Union函数,这是我最常运行的查询之一,即,您不能编写:
select attribute, ST_Union(geom) from some_table group by some_attribute
这在GIS环境中非常有用。 Select ST_Union(geom1, const_geom) from some_table
即,其中一种几何形状是硬编码的恒定几何形状,相比而言,它是一个位限制。
4)。不支持栅格。能够在db中执行组合的矢量栅格分析是非常有用的GIS功能。
5)。不支持从一种空间参照系到另一种的转换。
6)。自从Oracle收购以来,空间问题实际上已经搁置了。
总体而言,为了公平起见,MySQL对我们的网站,WMS和常规空间处理提供了数年的支持,并且易于设置。不利的一面是,数据损坏是一个问题,由于被迫使用MyISAM表,您放弃了RDBMS的许多好处。
Postgis
考虑到MySQL的问题,我们最终转换为Postgis。这段经历的重点是。
1)。极高的稳定性。五年内没有数据损坏,并且在不同负载下,我们现在在centos虚拟机上大约有25个Postgres / GIS盒。
2)。发展迅速-栅格,拓扑,3D支持就是最近的例子。
3)。非常活跃的社区。Postgis irc频道和邮件列表是绝佳的资源。Postgis参考手册也很出色。http://postgis.net/docs/manual-2.0/
4)。在OSGeo的支持下,与其他应用程序(例如GeoServer和GDAL)的配合非常好。
5)。除了默认的plpgsql(例如Python或R)外,存储过程可以用多种语言编写。
5)。Postgres是非常符合标准的,功能齐全的RDBMS,旨在保持与ANSI标准接近。
6)。支持窗口函数和递归查询-不是在MySQL中,而是在SQL Server中。这使编写更复杂的空间查询变得更加干净。
SQL Server。
我只使用了SQL Server 2008空间功能,该版本的许多烦恼-缺乏对从一种CRS到另一种CRS转换的支持,需要在空间索引中添加自己的参数-已得到解决。
1)。由于SQL Server中的空间对象基本上是CLR对象,因此语法让人感到后退。而不是ST_Area(geom)而是编写geom.STArea(),当将函数链接在一起时,这一点变得更加明显。函数名中下划线的删除只是一个小麻烦。
2)。我有许多无效的多边形已被SQL Server接受,并且缺少ST_MakeValid函数会使这变得有些痛苦。
3)。仅Windows。通常,Microsoft产品(如ESRI产品)被设计为可以很好地相互配合,但是并不总是以标准的合规性和互操作性为主要目标。如果您正在运行仅Windows商店,这不是问题。
更新:我曾在SQL Server 2012中玩过一点,可以说它已经得到了显着改进。现在有一个很好的几何图形验证功能,对Geography数据类型有很好的支持,包括FULL GLOBE对象,该对象可以表示占据多个半球的对象,并支持“复合曲线”和“圆弧线”,这对于精确和紧凑非常有用。弧(和圆)的表示等等。尽管在大多数应用程序中这并不是显示停止,但仍需要在第三方库中完成将坐标从一个CRS转换为另一个的功能。
我还没有使用SQL Server拥有足够大的数据集来与Postgis / MySQL进行一对一的比较,但是从我看到的功能来看,它的功能是正确的,虽然功能不如Postgis,但是它对MySQL提供的功能有很大的改进。
抱歉,这么长的答案,我希望我多年来遭受的某些痛苦和喜悦对某人有所帮助。