目前我有一個項目(用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