Answers:
PostgreSQL的列数限制在250到1600之间(取决于列类型),并通过PostGIS扩展支持空间数据和查询。因此,我倾向于做两件事:
首先,如果一列代表一个类别而不是自由文本,则使用这些类别创建一个单独的表,然后使用整数ID和外键约束替换该列,并引用该类别表。
其次,通过以逻辑方式将大表分成两个或多个来打破第三范式,并在它们之间建立一对一的关系。这也许不是最有效的方法,但是如果您很少需要一些数据,那么查询就可以在您想要的表上进行。
另一种完全不同的替代方法是使用“ NOSQL”数据库,例如MongoDB,CouchDB等。“行”的大小没有硬性限制,并且如果记录中不存在数据,则不需要占用任何空间。
对于这些类型的大表数据库,空间支持并不那么好,但是MongoDB支持2D空间查询和数据,而CouchDB似乎具有类似的功能。
我最近处理了包含2172列的加拿大统计局人口普查资料CSV文件的完全相同的问题。如果可以访问ArcGIS,则可以将csv导入ESRI文件地理数据库(FGDB)。根据ESRI,FGDB格式可以处理要素类或表中的65,534个字段。
就我而言,我能够将2172列宽的CSV文件导入到FGDB表中,而不会出现任何问题。
将整个表放入FGDB后,您可以按自己喜欢的任何方式对其进行切片(例如,逻辑上或基于数据库限制),并确保保留唯一的id列,以确保可以将其重新联接在一起需要。
简而言之:
对于具有大量属性或每个对象具有可变属性类型的数据,我的选择是使用KEY / VALUE数据模型,该模型可以在sql中实现,并且效果很好(我建议使用postgresql + postgis)。
描述:
1)您有一张特征表,比如点。该表包含每个点的ID和GEOMETRY。
2)您还有一张“属性”表,它是键/值对。该表具有列ID,POINT_ID(FK),KEY(varchar),VALUE(varchar)。
现在,每个点实际上都可以存储如下所示的无限属性:
ID POINT_ID KEY VALUE
1 1 type burger shop
2 1 name SuperBurger
3 1 address 123, a ST.
OpenStreetMaps的工作原理如此,并且效果很好,请参见此处和此处。
要导入数据,我建议使用python脚本。