2009-10-27 87 views
4

我們有一個數據收集系統,用於收集測量流經河流或河道的水流速度的環境傳感器的測量值。每次測量都會生成固定數量的值(例如日期,時間,溫度,壓力等)以及速度值列表。
最初,傳感器提供三個速度值,所以我只是將每個值存儲在FireBird數據庫中單個表的自己的列中。後來傳感器被引入,可以輸出多達九個速度值,所以我簡單地添加了六個列。即使大多數傳感器使用少於9個值,但我認爲如果大多數列只包含零,這不會成爲問題。
但是現在我正面臨着可以輸出1到256個值的新一代產品,我認爲添加另外247個色譜柱並不是非常有效,特別是因爲大部分測量值仍然只包含3到9個值。
由於每10分鐘收集一次測量數據,並且數據庫包含30到50個傳感器的所有數據,所以在數年後總數據量相當重要,但必須能夠生成任意隨機時間段的概覽/圖表時間。在數據庫中存儲可變數量字段的測量結果的最有效方法是什麼?

那麼什麼是最有效的方式來存儲變量值列表?
由於每條記錄都有自己的唯一ID,因此我假設我可以將所有速度值存儲在單獨的表格中,每個值都用它的記錄ID標記。我只是覺得這樣做效率不高,而且會在一段時間後變得非常緩慢。

回答

4

如果您使用高效的索引,數據庫可以處理表中的大量數據。所以,你可以使用此表結構:

create table measurements (
    id, 
    seq integer, -- between 1 and 256 
    ts timestamp, -- Timestamp of the measurement 
    value decimal(...) 
) 

idid, seqts創建索引。這將允許您通過數據有效地進行搜索。如果你不信任你的數據庫,只需插入幾百萬行並運行一些選擇來查看它的表現如何。

對於比較:我有一個Oracle擁有112萬行此數據庫,我可以選擇120毫秒內(0.12S)

0

通過時間戳或ID的記錄,您可以保存在文本字段序列化的數據,例如JSON - 將測量值編碼爲:

[<velocity-value-1>, <velocity-value-2>, ...] 

然後,在您的代碼中,在查詢後反序列化值。

如果您只是通過其他字段過濾查詢,而不是保存的值,這應該很好。如果你按值過濾,在WHERE子句中使用它們將是一場噩夢。

+0

當我需要它們生成圖表或報告(可能包含數千個測量結果)時,您不認爲對這些值進行反序列化會不會是一個巨大的性能問題? – 2009-10-27 12:04:05

+0

不是真的 - 它們通過線路串行傳輸,並且由您的數據庫庫進行反序列化。性能問題出現在您希望數據庫使用這些值進行智能處理時出現的問題 - 因爲它只是將它們傳遞給您的代碼,您應該不會遇到性能問題。 – orip 2009-10-27 12:28:59

0

我會去與第二個表:

table measurements (Id, DateTime, Temperature, Pressure) 
table velocity (Id, MeasurementId, Sequence, Value) 

Velocity.MeasurementId引用Measurements.Id
Velocity.Sequence是該測量(1-256)的速度值的索引。

使用盡可能接近現實世界的數據填充這些表,並測試sql語句以查找最佳索引。

相關問題