目前我有一个项目(用Java编写),它从微控制器读取传感器输出,并使用Hibernate每秒将其写入多个Postgres表。总共我每秒钟写出大约130列的数据。一旦数据被写入,它将永远保持静态。这个系统在当前条件下似乎表现良好。访问数据库中平均静态数据的最佳方式(休眠,Postgres)
我的问题是关于在未来查询和平均数据的最佳方法。我认为有几种方法可行,但我正在寻找哪种方法可以扩展和表现最好。
因为我们每秒收集和写入数据,我们每个月最终会产生超过250万行。我们目前通过写入JChart2D的JDBC select语句(即选择压力,温度,速度FROM数据WHERE time_stamp BETWEEN startTime AND endTime)绘制该数据。用户必须注意不要指定太长的时间段(startTimem和endTime delta < 1天),否则他们将不得不等待几分钟(或更长时间)才能运行查询。
未来的目标是建立类似于Google财经可视化API的用户界面。关于时间缩放,即数据变得“更平滑”(或更平均)的时间段越长。如下所示
选项我已考虑:
选项A:使用SQL AVG函数的平均数据点返回给用户。如果用户要求查看半年的数据,我认为这个选项会变得昂贵。我想象这种情况下的界面会根据用户的请求将行数增加到平均水平。 I.E.如果用户要求一个月的数据,那么接口将请求每86400行的平均值,这将返回约30个数据点,而如果用户要求数据一天,接口将请求平均每2880行的平均值,这也将返回30个数据点,但粒度更细。
选项B:使用SQL以一定的时间间隔返回所有行并使用Java接口平均数据。我已经简单地测试了这个踢腿,我知道它很贵,因为我要返回86400行/天的间隔时间请求。我不认为这是一个可行的选择,除非我在执行SQL选择时没有考虑到这一点。
选项C:由于所有这些数据在写入后都是静态的,所以我考虑使用Java程序(使用Hibernate)来编写平均数据表以及它当前正在写入的数据。在这个选项中,我有几个“积累”数据的java类,然后对它进行平均并以指定的间隔(5秒,30秒,1分钟,1小时,6小时等)将它写入表中。未来的用户界面绘图程序将采用用户指定的时间间隔,并确定要查询哪个平均值表。这个选项似乎会造成很多冗余并占用更多的存储空间,但是(在我看来)会产生最佳性能?
选项D:来自经验丰富的社区的建议?
我不要求代码,我寻求建议或意见... – babcoccl 2012-04-19 17:26:13
这显然不是编写代码的问题。这是一个使用哪些工具以及组织地将代码放在哪里的问题。 +1只是因为... – JayC 2012-04-19 17:56:04
谢谢,根本没有寻找代码或甚至是深入的描述,只是从那些比我有更多经验的人那里寻找意见。我的意思是这样的事情一定是在对错之前完成的? – babcoccl 2012-04-19 18:21:23