0

所以,我有以下问题:

我正在做一些时间序列分析,我有一个类似 10^7 身份或 ids 的模型(例如一个国家的每部手机)。

每个 Id 都有关联的事件(例如天),最多可以跨越 10^4 个事件。对于每个事件和身份,都有不同的“属性”(例如电话 X 在那天 Y 发送的消息数量)。

我正在尝试设计一个 mysql 数据库来处理如此大量的信息。我主要感兴趣的是查询时间分布(例如,特定日期的消息数量;或 X 天和 Y 天之间的活动电话数量)。

  1. 我的第一个想法是为每个不同的值使用一个表:在每个表上,行是一个标识,每一列都有一天。如果有 N 个不同的属性,那么我将有 N 个不同的表。这带来了每个表上有 10^4 列的问题;我不确定这是一个好的/标准/有效的做法。

  2. 我的第二个虽然是有一个 10^7*10^4 行的单表(所谓的多对多关系):第一列有一个主键,第二个是身份的 id,第三个是事件的日期,和下一列是该特定日期该身份的相关属性。

我问你有什么建议:“出于历史原因”我已经创建了一个非 mysql 数据库(有很多很多 .txt 文件),在尝试迁移它之前,我想知道它是否真的值得。正如您可能理解的那样,目前我的 *.txt 数据库中的查询可能会尽可能昂贵:我通常必须打开每个 .txt 对查询执行的操作。对于每个查询,这相当于 10-30m。因此,任何低于该限制的建议实际上对我的问题都非常有用。

谢谢你的时间,豪尔赫

4

1 回答 1

0

您正试图在关系数据库中存储一个相当复杂的信息矩阵。在开始之前,您需要回答以下几个问题:

  • 是否有任何一天的数据缺失?也就是说,id=x 是否可以具有 item=y 的实际值,但由于某些操作原因,该值从数据库中丢失。
  • 对于给定的 id,大多数或所有项目在任何给定日期都有值吗?也就是说,您是否在处理稀疏矩阵问题?

将项目存储在单独的列中是不可能的。MySQL 的硬限制是每行 4,096 列(参见此处),小于 10^4。

似乎更规范化的方法是可行的,尽管每一行都需要 id 和 item id 并且值需要类型一致。如果您要存储数字,没问题。如果一些更好地存储为整数,另一些存储为货币值,而另一些存储为字符串,那么您可能会遇到挑战。

我怀疑混合方法可能会奏效。您可能有一些经常使用的项目可以存储在一个表中。更多项目将使用标准化方法存储。然后,您可以考虑分区策略以优化访问。

您没有提供足够的细节来制定这样的策略。通常,方法是按时间对数据进行分区。但是,在这种情况下,最好按项目对数据进行分区,这样所有值都可以在一个分区中获取。

于 2012-11-12T21:41:46.537 回答