2016-10-10 260 views
0

比方說,我們正在爲每10秒收集一種數據類型的設備存儲數據。每個設備可以位於不同的時區。快速查詢以可視化數據的能力非常重要。我們可以要求系統問題,比如下面:按時間間隔對時間序列數據進行分組

1. For a specific device, I want the last 7 days of data grouped by day totals for my local timezone. 
2. For a specific device, I want the last year's data grouped by month totals for my local timezone. 

存儲所有數據,UTC似乎是最乾淨的方法,但它要求數據的本地分組時變得非常棘手。例如,每個時區的日分組具有不同的偏移量。因此,如果我們要存儲日,月,年「桶」,則它們都將按照UTC進行分組,這對於詢問除UTC以外的其他時區是沒有用的。

如果我們將分鐘和小時「桶」中的數據進行分組(忽略不到一小時的時區,例如IST +5:30),我們可以使用小時「桶」來構造答案以上問題。對於問題2,每個分組將有12個分組,每個分組最多744小時。

有分鐘和小時(忽略不到一小時的時區,例如IST +5:30)「桶」的方法是否看起來像樣的設計?有沒有人設計過類似的建議?

+0

提供一個字段來存儲每個設備的時區,例如Java時區ID,並支持基於本地日曆的日曆聚合 - 此方法應該適用於上述情況。我會看看時間序列數據庫。 –

回答

1

是的,通過偏移量創建存儲桶是一個合理的設計,並且這經常發生在數據倉庫(例如)中。

雖然以1小時爲增量意味着忽略許多真實的地方。正如您所指出的那樣,印度是一個使用:30偏移量的位置。如果您想要覆蓋世界上每個現代時區,則實際上需要按15分鐘段數進行反算,因爲有幾個是:30:45偏移量。

當然,如果您覺得可以接受有錯誤的容限,那麼您可以使用任何可以容忍的粒度。理論上,你可能會超過一個小時 - 你只會有一個更大的誤差。

如果您想要考慮另一種方法,則可以使用設備的本地時間將值存儲在date-time-offset表單中。索引此類值時,大多數數據庫都將轉換爲UTC,因此您可能還需要一個計算列來提取和索引本地時間部分。然後,您可以在當地時間按天分組,而無需一定知道如何與UTC聯繫。這種方法的缺點是數據固定在原來的時區。你不能輕易重組來推斷不同的時區。雖然如果這些是真實世界中的實際設備,那通常不是一個問題。

+0

僅供參考 - 您可能還想閱讀:https://github.com/MicrosoftArchive/iot-journey/blob/master/docs/09-time-considerations.md –

+0

謝謝@Matt Johnson - 您提供的鏈接非常有幫助。 –