【问题标题】:Building a database from a time series从时间序列构建数据库
【发布时间】:2012-11-13 05:41:46
【问题描述】:

所以,我有以下问题:

我正在做一些时间序列分析,并且我有一个模型,其中包含 10^7 个身份或 id(例如一个国家/地区的每部手机)。

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

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

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

  2. 1234563第三个事件的日期,接下来的列是该特定日期的该身份的相关属性。

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

感谢您的宝贵时间, 豪尔赫

【问题讨论】:

  • 在我看来,您正在尝试手动构建 OLAP 多维数据集。抱歉,我不熟悉 Mysql 为 OLAP 提供的工具,但我很确定它应该是市场上的东西。
  • 可以在不使用 OLAP 的情况下实现。它看起来像一个简单的事件记录系统,有一个包含事件时间、设备 ID、事件类型和其他属性的大型“事件”表。如果不同的事件具有不同的元数据,那么您需要为每个事件类型创建一个表,并将其挂接到主事件表中。重要的是,“多对多关系不是单个表,而是(至少)三个表,以避免您建议的大量数据。
  • 是的,这种多对多会更简单,因为每个身份只有一个“id”,没有更多信息,时间戳也是如此。不过谢谢,它有帮助。

标签: mysql database database-design


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 好的,谢谢,很好的答案。所以,是的,在给定的日期可能存在缺失数据的项目,是的,大多数项目都有给定日期的值(是的,所有整数)。我要问的是,是否有机会查询这样的 mysql 可以达到我当前的时间尺度,例如10-30m(有 10^7 10^4 条目)如果先验看起来不是这样,那么它甚至不值得尝试。
  • 该问题的答案取决于您的硬件、用于访问数据的引擎以及物理数据结构。我认为你应该在 DB 论坛上问这个问题,更像是“我怎样才能让它与 MySQL 一起工作”。