【问题标题】:Very wide denormalized data (around 40000 columns). Which database to use?非常宽的非规范化数据(大约 40000 列)。使用哪个数据库?
【发布时间】:2016-07-18 08:54:42
【问题描述】:

我有一个非常具体的问题。我有大约 40000 列的数据。数据是非规范化的,因为实时处理需要很多时间。

Postgresql 对列号 1600 有限制。有人可以建议我一个没有此限制的数据库吗?

或者如果不是数据库,该方法怎么能存储很宽的数据?

事实证明,对较小的表进行分区是一项乏味的任务,因为在使用特定过滤器执行特定查询时加入它们可能会非常麻烦。我已经试过了。

谢谢!

编辑:

census.gov/programs-surveys/acs/data.html 这是数据集。 示例表:

编号某条街上的人:

列:人数、年龄

而且这些组合越来越高。包括种族、性别、国籍等。有你的 40000 列。并且这些列不能即时计算。需要预先计算并存储它以加快阅读速度 – Forsythe 15 分钟前

【问题讨论】:

  • 我很好奇添加 40000 列的行如何比使用正确的 SQL 连接和查询的规范化数据更快?
  • 40000 列?严重地?很想知道这些数据代表什么。这应该会给出哪里出错的线索。
  • 好吧,我知道没有办法,列限制是你无法打破的......所以如果你能举个例子,我们可能会更好地理解并为你提供解决方案的先机
  • 那么你的问题真的是你无法编写合适的动态查询来查询多个表吗?不要因为写 SELECT 很麻烦就在一张表里塞这么多列,如果你只是想把它当作一张大表,最好不用 RDBMS。
  • 我不明白您为什么不能正确规范化该数据?

标签: database postgresql denormalization


【解决方案1】:

我能轻易想到的所有数据库都有几千个限制(至少 SQL Server、MS Access、Oracle、MySQL、Postgres、Teradata 和 DB2)。使用列式数据库可能会更好,但这些数据库相当专业。

这为您提供了多种选择:

  • 您可以对数据使用键值对。但是,如果数据很密集,那么您的数据可能会非常大。
  • 您可以使用其他数据结构,例如 JSON、XML、数组(在 Postgres 中)或 BLOB(二进制大对象)。
  • 您可以使用 NOSQL 技术来存储数据。
  • 您可以使用统计工具,例如 R、SAS 和 SPSS。

最终,您希望如何存储数据的问题取决于您想用它做什么。例如,如果您有一个具有大量关系数据和功能但具有时间序列数据的系统,那么您可以将时间序列存储在其自己的表中(每个时间单位一行),或者您可以将序列存储为一个 BLOB,因为您要将其返回给应用程序以进行进一步处理。

【讨论】:

  • 另外,可以将列组合成几个表并相应地连接它们。我假设并非所有查询都需要所有 40k 列。这也将有助于更好地缓存热数据。
  • 在 Postgres 中,我可能会为此使用 hstore
  • 数据将主要用于阅读,但有非常具体的限制。例如,我需要在第 1、56、10000 和 29999 列上运行一个函数。或者甚至运行一个子查询。但是为了运行该函数(或子查询),我必须以正确的方式存储该表。 Postgres 目前让我头疼。因为我必须将那个大表拆分成更小的表,然后在一些查询中加入它们(用户仍然“看到”大表)。例如。用户发送一个大表的查询,我必须解析它并从所有表块中获取数据。
【解决方案2】:

也许我弄错了,但这里似乎存在理解和数据排序的问题......

您说您想显示“人数”、18 岁以下、18 到 21 岁的人的列...但这不是存储数据的适当方式...

这里的真实数据是每个人的年龄,他们的性别...然后所有其他列都只是计算...

那么您的查询需要参数化,以便您可以正确选择。

使用 PHP 和 MySQL 的示例:

//These vars come from user input
$ageMin = 18;
$ageMax = 21;
$gender = "male";

$query = "SELECT COUNT(*) FROM MyTable WHERE 
          Age >= {$ageMin} AND
          Age <= {$ageMax} AND
          Gender = '{$gender}' ... "

如果你说它不能预先计算,那么将这些结果作为行存储在一个表中:

Table Calculated
  IDCalculation (INTEGER)
  Name (CHAR(30))
  Criteria
  Result

所以您只需将 40000 列转换为行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2011-06-26
    • 2013-01-18
    • 2017-01-14
    • 2016-11-18
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多