我正在设计一个应用程序,它接收来自大约100k传感器的信息,这些传感器用于测量时间序列数据。每个传感器每15分钟测量一个整数数据点,保存这些值的日志,并每4小时将该日志发送到我的应用程序一次。我的申请应该保留大约5年的历史数据。我每4小时收到一次的数据包具有以下结构:
我的应用程序的主要使用场景是显示某些日期的复合信号图。当我说“复合”信号时,我的意思是,例如,我需要显示将传感器A的信号添加到传感器B的信号并减去传感器C的信号的结果。
我的困境是如何将这个时间序列数据存储在我的数据库中。假设我使用关系数据库,我看到两个选项:
每个选项都有明显的优缺点,包括存储大小,性能以及数据库“上方”代码的复杂性。
我想知道是否有针对此类案例的最佳做法。
非常感谢。
答案 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行左右五年]。在我看来,如果你想针对那种数据编写灵活的查询,你需要某种形式的星型模式结构(在数据仓库中使用)。
是将数据直接加载到仓库中,还是让它“逐行”构建,以便每天/每周/每月/无论如何添加到仓库中,具体取决于时间,精力,可用资源等等
最后的建议:当您为新代码设置测试环境时,请使用几年(虚拟)数据加载它,以查看它将如何执行。