在数据库中存储信号

时间:2009-07-09 14:20:33

标签: database database-design

我正在设计一个应用程序,它接收来自大约100k传感器的信息,这些传感器用于测量时间序列数据。每个传感器每15分钟测量一个整数数据点,保存这些值的日志,并每4小时将该日志发送到我的应用程序一次。我的申请应该保留大约5年的历史数据。我每4小时收到一次的数据包具有以下结构:

  • 序列开始的数据和时间
  • 要到达的样本数量(假设为了简单起见这是固定的,尽管实际上可能有部分内容)
  • 样本序列,每个正好是4个字节

我的应用程序的主要使用场景是显示某些日期的复合信号图。当我说“复合”信号时,我的意思是,例如,我需要显示将传感器A的信号添加到传感器B的信号并减去传感器C的信号的结果。

我的困境是如何将这个时间序列数据存储在我的数据库中。假设我使用关系数据库,我看到两个选项:

  1. 将每个样本存储在自己的行中:当我收到信号时,将其分解为样本,并将每个样本与其时间戳分开存储。假设时间戳可以跨信号进行标准化。
  2. 将每个4小时信号作为单独的行存储其开始时间。在这种情况下,每当信号到达时,我只需将其作为BLOB添加到数据库中。
  3. 每个选项都有明显的优缺点,包括存储大小,性能以及数据库“上方”代码的复杂性。

    我想知道是否有针对此类案例的最佳做法。

    非常感谢。

4 个答案:

答案 0 :(得分:2)

将每个样本存储在自己的行中听起来简单而合理。除非有充分的理由,否则不要太急于优化。也许您应该使用虚拟数据进行一些测试,以确定是否真的需要进行任何优化。

答案 1 :(得分:1)

我认为以最容易实现主要目标的形式存储数据可能是最不痛苦的。在这种情况下,它也可能更有效。

由于您的主要目标似乎是以有趣且灵活的方式显示信息,因此我会针对每个数据点使用单独的行。我认为编写这个程序所需的大部分工作都可能在显示器方面,你应该尽可能地减少该方面的复杂性。

答案 2 :(得分:1)

如果内容不相关并且您永远不想对其运行查询,那么在BLOB中存储数据是很好的。在这种情况下,您的数据将是数据库的内容,因此非常相关。

我认为你应该:

1.将每个样本连续存储:当我收到信号时,将其分解为样本,并将每个样本与其时间戳分开存储。假设时间戳可以跨信号进行标准化。

答案 3 :(得分:1)

我在这里看到两个数据库操作:第一个是在数据进入时存储数据,第二个是以(可能很大)的方式检索数据。

正如Kieveli所说,由于您将使用数据的离散部分(而不是同时使用所有数据),因此将其存储为blob将无法帮助您阅读时间。因此,对于第一项任务,逐行存储数据将是最佳的。

查询数据时,这也可能“足够好”。但是,如果性能是一个问题,和/或如果您获得大量的数量[100,000传感器x每15分钟x 1小时= 9,600,000行每天,x 5年= 17,529,600,000行左右五年]。在我看来,如果你想针对那种数据编写灵活的查询,你需要某种形式的星型模式结构(在数据仓库中使用)。

是将数据直接加载到仓库中,还是让它“逐行”构建,以便每天/每周/每月/无论如何添加到仓库中,具体取决于时间,精力,可用资源等等

最后的建议:当您为新代码设置测试环境时,请使用几年(虚拟)数据加载它,以查看它将如何执行。