2013-12-10 45 views
2

有一定的價值,X,其中我記錄每30秒,目前正在與三個字段數據庫:數據庫設計 - 有多少數據存儲,性能VS質量

  • ID
  • 時間
  • 價值

我然後創建一個移動應用程序將利用這些數據來繪製圖表的看法:

  • 最後一小時
  • 過去24小時。
  • 7日
  • 30日

顯然,每30秒保存的最後一年,然後將該數據發送到移動設備將太多(這將意味着發送1051200個值)。 我的第二個想法可能是我可以使用MySQL中的平均函數,例如,收集每7天的所有平均值(創建一年52點),併發送這些點。這會起作用,但MySQL仍然會通過創建平均值來拖網,如果有許多用戶連接,這將會很糟糕。因此,簡單地說,如果這些是我的觀點,那麼我不需要跟蹤所有的數據。沒有人應該關心一年前x的精度爲每30秒,這很好。我應該可以使用「觸發器」來創建一些平均值。

我找人來檢查我有什麼下面是合理的:

  • 商店每隔30s值表(這將被用於小時來看,120點)
  • 當在30s表格中120行(120 * 30s = 60分鐘= 1小時),使用觸發器在「半小時平均」表格中存儲前半個小時,從30s表格中刪除前60個條目。這張新表格需要有一個ID,開始時間,結束時間和價值。這個半小時平均值將用於24小時視圖(48個數據點)。
  • 當半小時表超過24個條目(12小時)時,將前6個平均值存儲在6小時平均表中,然後從表中刪除。這個6小時平均值將用於7天視圖(28個數據點)。
  • 當6小時表中有8個條目時,刪除前4個並將其存儲爲平均一天,以便在30天視圖(30個數據點)中使用。
  • 當日視圖中有14個條目時,刪除前7個並存儲在星期表中,這將用於年視圖。

這似乎不是對我來說最好的方式,因爲它似乎比我想象的要複雜得多。

另一種方法是保留所有數據並讓mysql在需要時查找平均值。這將創建一個巨大的龐大數據庫。我還沒有關於性能的想法。該id是一個int,時間是一個日期時間,值是一個浮點數。 1051200記錄太多了嗎?現在是加入的好時機,我想在一個覆盆子pi上運行它,但是如果沒有,我確實有我可以使用的主機。

+0

您正在尋找一些RRD樂趣。 – frlan

+3

1051200記錄不算什麼,特別是對於像你這樣只有少量列的數據庫,並且使用正確的索引時,您不應該注意到性能問題。 – Ryan

+0

約定,超過一百萬條記錄對於大多數RDBMS(甚至是一些內存條中的內容,尤其是如果這是您唯一的表 - 大約36MB的原始數據)是沒有意義的。我希望在移動系統上避免的一件事情是運營商數據限制,如果您將原始數據下載到設備(每天都是這樣 - 如果是行,則它的大小很普通)。 –

回答

1

您提出的設計看起來不錯。也許有更優雅的方式來做到這一點,但你的建議也應該起作用。

RRD(http://en.wikipedia.org/wiki/Round-Robin_Database)是一個專門設計用來自動執行所有這些操作的專用數據庫,爲了這個專業化目的,它應該比MySQL更具性能。

另一種方法如下:只保留原始表(1051200條記錄),但每次添加新記錄(例如每隔30秒)都會產生一個觸發器,用於生成最後一個小時/天/年等視圖/在某處緩存結果。然後,您的數字處理工作量與您必須提供的請求/客戶端數量無關。

1051200記錄可能會或可能不會太多。測試你的樹莓派找出答案。

+0

我會研究RRD。最簡單的解決方案通常是最好的,我喜歡在插入物上設置觸發器的想法(每30秒)。看完RRD後,我會看到哪一個是最好的,但我懷疑我會使用插入作爲觸發器來計算所需的所有點。我把你的建議和Stanyer的建議結合起來,他建議1051200條記錄不像我原先想象的那麼可怕。我的問題是,我已經與數據庫搞混了,但從來不需要存儲這麼多的記錄。 – ThePerson

+1

只是存儲或處理這麼多記錄本身並不是問題。我有200M +行的數據庫,並且在它們上面運行查詢,也可以查看整個表。問題是你需要多快......如果查詢限於每30秒運行一次,那麼即使在Raspberry Pi上也應該可以管理。 – Ahti

-1

讓我給一個建議,你的桌子上的物理佈局,無論你是否決定保留所有的數據或不時「修剪」這......

既然你生成一個新的行「每30秒「,那麼Time可以作爲一個自然鍵,而不用擔心超出底層數據類型的分辨率並導致重複的鍵。你不需要ID在這種情況下,使你的表很簡單:

Time (PK) 
Value 

而且,由於InnoDB tables are clustered,沒有二級指標意味着整個表存儲在一個單一B樹,它從存儲和查詢角度來看效率很高。最重要的是,Value自動covered,這可能不是你的原始設計的情況,除非你專門設計了你的索引。

使用時間作爲關鍵一般來說可能會非常棘手,但我認爲在這種特殊情況下可能是值得的。


除非有引用它通過外鍵與其它表,或者你已經寫依賴於它太多的代碼。

在原始設計中,爲了支持高效聚合,這是非常必要的。

+0

何時添加到多個時區或生成器的其他實例?我認爲在大多數情況下使用代理鍵是一個好主意,如果某些事情發生變化,就不必重新聚集索引了......而且它不像所保存的幾個字節會產生很大的影響,特別是如果它們不管怎麼樣,最終都會聚集並拋棄它們......(也不會回答問題:S) – Milney

+0

@Milney關於「附加時區/生成器」,請參閱:[YAGNI](https:// en .wikipedia.org /維基/ You_aren't_gonna_need_it)。當你這樣做時(需要它),重構不會太困難。關於「更多字節」,我們正在談論整個新的B-Tree,實際上將「字節」加倍(和/或引入[雙查找]的潛力(http://www.ovaistariq.net/521/understanding -innodb羣集的索引/))。正如我在答覆中所述,我專注於「物理佈局」,我相信你會同意,這是任何數據庫模型中的重要考慮因素...... –