【问题标题】:Storing Signals in a Database在数据库中存储信号
【发布时间】:2009-07-09 23:24:29
【问题描述】:

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

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

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

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

  1. 将每个样本单独存储在一行中:当我收到信号时,将其分解为多个样本,并分别存储每个样本及其时间戳。假设时间戳可以跨信号标准化。
  2. 将每 4 小时的信号与其开始时间分开存储。在这种情况下,每当信号到达时,我只需将其作为 BLOB 添加到数据库中。

每个选项都有明显的优缺点,包括存储大小、性能和数据库“之上”代码的复杂性。

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

非常感谢。

【问题讨论】:

  • 所有传感器的时间同步是否完全相同?
  • @KM:正如我所提到的,您可以假设样本时间戳已标准化 - 即假设它们的时间戳完全相同(无论如何都需要进行一些预处理)

标签: database database-design


【解决方案1】:

对我来说,将每个样本存储在自己的行中听起来既简单又合乎逻辑。除非有充分的理由,否则不要急于优化。也许您应该对虚拟数据进行一些测试,看看是否真的有必要进行任何优化。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我认为你应该:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-02
          • 2015-10-08
          • 2010-12-05
          • 2013-11-28
          • 1970-01-01
          • 2020-07-01
          • 2011-06-19
          • 1970-01-01
          • 2019-05-19
          相关资源
          最近更新 更多