目前我有一个项目(用 Java 编写),它从微控制器读取传感器输出,并使用 Hibernate 每秒将其写入多个 Postgres 表。我每秒总共写入大约 130 列数据。一旦数据被写入,它将永远保持静态。这个系统在当前条件下似乎运行良好。
我的问题是关于将来查询和平均这些数据的最佳方式。我认为有几种方法是可行的,但我正在寻找关于哪种方法可以扩展和表现最好的输入。
由于我们每秒收集和写入数据,我们最终每月生成超过 250 万行。我们目前通过写入 JChart2D 的 JDBC 选择语句绘制这些数据(即从数据 WHERE time_stamp BETWEEN startTime AND endTime 中选择压力、温度、速度)。用户必须注意不要指定太长的时间段(startTimem 和 endTime delta < 1 天),否则他们将不得不等待几分钟(或更长时间)才能运行查询。
未来的目标是拥有一个类似于为 Google Finance 提供支持的 Google 可视化 API 的用户界面。关于时间缩放,即数据变得“更平滑”(或更平均)的时间段越长。
我考虑过的选项如下:
选项 A:使用 SQL avg 函数将平均数据点返回给用户。如果用户要求查看半年的数据,我认为这个选项会变得昂贵。我想这个场景中的界面会根据用户请求将行数缩放到平均水平。IE 如果用户要求一个月的数据,界面将要求每 86400 行的平均值,这将返回约 30 个数据点,而如果用户要求一天的数据,界面将要求每 2880 行的平均值,这也将返回 30 个数据点,但粒度更大。
选项 B:使用 SQL 返回某个时间间隔内的所有行,并使用 Java 接口对数据进行平均。我已经对此进行了简短的测试,并且我知道它很昂贵,因为我要返回 86400 行/天请求的间隔时间。我不认为这是一个可行的选择,除非在执行 SQL 选择时我没有考虑到某些事情。
选项 C:由于所有这些数据在写入后都是静态的,因此我考虑使用 Java 程序(使用 Hibernate)来编写平均值表以及当前正在写入的数据。在这个选项中,我有几个 Java 类“累积”数据,然后将其平均并以指定的时间间隔(5 秒、30 秒、1 分钟、1 小时、6 小时等)将其写入表中。未来的用户界面绘图程序将采用用户指定的时间间隔并确定要查询哪个平均值表。这个选项似乎会产生大量冗余并占用更多存储空间,但(在我看来)会产生最佳性能?
选项 D:来自更有经验的社区的建议?