代码之家  ›  专栏  ›  技术社区  ›  Roee Adler

在数据库中存储信号

  •  2
  • Roee Adler  · 技术社区  · 16 年前

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

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

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

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

    1. 将每个样本都存储在自己的行中:当我收到一个信号时,将其分解为样本,并分别存储每个样本及其时间戳。假设时间戳可以跨信号进行规范化。
    2. 每4小时存储一次信号,作为一个单独的行,并显示其开始时间。在本例中,每当信号到达时,我只是将它作为一个blob添加到数据库中。

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

    我想知道是否有这种情况的最佳实践。

    多谢。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Tom Dalling    16 年前

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

        2
  •  1
  •   acrosman    16 年前

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

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

        3
  •  1
  •   Kieveli    16 年前

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

    我认为你应该:

    1.将每个样本存储在一行中:当我收到一个信号时,将其分解为样本,并分别存储每个样本及其时间戳。假设时间戳可以跨信号进行规范化。

        4
  •  1
  •   Philip Kelley    16 年前

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

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

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

    无论您是直接将数据加载到仓库中,还是让它构建“逐行”以添加到仓库中(无论是日/周/月/什么),都取决于时间、精力、可用资源等。

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