如何处理具有256个以上变量的表?


10

我正在处理人口普查数据,并下载了几个CSV文件,每个文件都有600列/变量。我想将它们全部存储在可查询的数据库中,但是到目前为止,我尝试过的所有操作(MS Access,Arc地理数据库表)都将表截断为256列。对于非DBA人士可以访问的大型表,是否有解决方案?


2
无论使用多少DB规范化,我都怀疑这些巨大的表应该被分成几个(或多个)较小的表,这些表与它们的普查单位(可能是块)UID有关。
罗伊

Answers:


7

PostgreSQL的列数限制在250到1600之间(取决于列类型),并通过PostGIS扩展支持空间数据和查询。因此,我倾向于做两件事:

首先,如果一列代表一个类别而不是自由文本,则使用这些类别创建一个单独的表,然后使用整数ID和外键约束替换该列,并引用该类别表。

其次,通过以逻辑方式将大表分成两个或多个来打破第三范式,并在它们之间建立一对一的关系。这也许不是最有效的方法,但是如果您很少需要一些数据,那么查询就可以在您想要的表上进行。

另一种完全不同的替代方法是使用“ NOSQL”数据库,例如MongoDB,CouchDB等。“行”的大小没有硬性限制,并且如果记录中不存在数据,则不需要占用任何空间。

对于这些类型的大表数据库,空间支持并不那么好,但是MongoDB支持2D空间查询和数据,而CouchDB似乎具有类似的功能。


4
+1联接解决方案(第3段)实际上可以非常有效,因为人口普查数据往往具有一组相关字段,并且对于任何特定分析而言,通常只需要这些组中的一小部分即可。以这种方式,成千上万个字段(我不夸张地说:这很常见)可以在数十个表之间进行逻辑分解,对于任何特定的图或分析,仅需要访问其中的少数几个表。
ub

@MerseyViking,如果他(@scoball)无法将数据导入到任何操作表的程序中,他将如何拆分表或执行其他提到的操作?数据以CSV格式显示。
巴勃罗(Pablo)2012年

2
@Pablo,我认为你是不公平的MerseyViking:如果你可以写一个脚本来导入表-你基本上是被强迫,以便实现您的解决方案-然后的话就是他,有没有困难在编写中,它是完全通用和灵活的。(我从经验中了解到这一点,因为我已经为超大型人口普查数据库完成了此工作。)此外,他提出了许多解决256个字段限制的方法。
ub

“列代表类别而不是自由文本”您必须手动映射这些列。
巴勃罗

2
@Pablo仅当您使用的软件不足时:-)。例如,使用几乎任何现代统计程序,只需使用几个命令即可完成第2-3段中的工作流程。(当然,我不主张使用这样的程序来代替数据库;我只是指出,使用适当的工具套件,可以轻松,有效地完成此答案中的所有内容。)
笨蛋

7

我最近处理了包含2172列的加拿大统计局人口普查资料CSV文件的完全相同的问题。如果可以访问ArcGIS,则可以将csv导入ESRI文件地理数据库(FGDB)。根据ESRI,FGDB格式可以处理要素类或表中的65,534个字段

就我而言,我能够将2172列宽的CSV文件导入到FGDB表中,而不会出现任何问题。

将整个表放入FGDB后,您可以按自己喜欢的任何方式对其进行切片(例如,逻辑上或基于数据库限制),并确保保留唯一的id列,以确保可以将其重新联接在一起需要。


1
有趣!我试图从csv导入文件地理数据库。当我设置它时,我查看了要导入的变量列表,它停止在256个变量之后列出它们,所以我没有继续。我会再看一遍。
scoball 2012年


文件地理数据库有很高的限制,因此导入中可能会发生某些情况。
nicksan

2

简而言之:
对于具有大量属性或每个对象具有可变属性类型的数据,我的选择是使用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脚本。


这通常称为数据的“长”格式,并且很容易了解。尽管可以灵活存储,但对于任何类型的多变量分析(对两个或多个属性进行比较的任何分析)都没有用。
ub

@whuber,它对于多变量分析不是没有用,但实际上您需要结构化的软件或良好的编程技能,因为需要准备数据,尤其是将数据传输到表中。在这里,当我需要在处理之前将数据摘录放到表中时,我使用postgis + django(Python Web框架)的组合来处理土壤数据(ph,al,clay等)。选择该模型是因为相同的结构将处理其他任意守时数据。
巴勃罗(Pablo)2012年

足够公平:我应该说“没用”。只要保留了所有信息,便可以始终将数据处理为所需的任何格式。与键/值方法相比,使用@MerseyViking的方法进行处理相对容易。另外,当表变得非常大时,我们开始担心总大小。键/值存储中的冗余是如此之大,以至于很少用于大型数据集的分析(我不能说纯粹用于存储的频率。)
whuber

我不同意他的解决方案,因为如果您无法打开数据库中的数据,拆分或操作表并不容易,更不用说不可能。用户需要通过脚本将数据直接发送到数据库,并且使用键/值模型,您可以对任何数据使用相同的脚本,而无需映射列或对属性进行分类。
巴勃罗(Pablo)2012年

自己承认,您的解决方案似乎和我的一样复杂,需要“良好的编程技巧”。我只是提倡以对RDBMS(例如PostgreSQL)最有效的形式保存数据。此外,这似乎是有争议的,因为布伦特的答案表明256列的限制是虚假的。
MerseyViking
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.