2012-07-27 72 views
1

我必須使用時間序列進行科學實驗。科學實驗的時間序列數據庫

我打算使用MySQL作爲數據存儲平臺。

我想用下面的一組表來存儲數據:

Table1 - >ts_id(存儲時間序列指標,我將不得不處理一些時間序列)

Table2 - >ts_idobs_datevalue(應由{ts_idx,obs_date}索引)

因爲會有很多時間序列(上百個)每個可能數以百萬計的觀測,表2可以變得非常大。

的問題是,我要複製這個實驗了好幾次,所以我不知道什麼是最好的方法:

  1. 添加experiment_id對錶,讓他們更加壯大。
  2. 爲每個實驗創建一個單獨的數據庫。

如果選項2更好(我個人認爲是這樣),那麼最好的邏輯方法是什麼?我有許多不同的實驗要執行,每個都需要複製。如果我爲每個複製創建一個不同的數據庫,我很快就會獲得數百個數據庫。有沒有辦法將它們進行邏輯組織,比如每個複製作爲其實驗的「子數據庫」master database

+0

你看過HDF5嗎?見[詳情](http://www.hdfgroup.org/HDF5/)。 – 2012-07-27 13:29:01

回答

0

您可能想從考慮如何分析數據開始。假設您的分析需要了解實驗名稱,實驗複製品編號,內部複製品(例如,在每個時間點,每個處理測量3個「相同」的受試者)。所以你的數據庫架構可能是這樣的:

experiments 

exp_id int unsigned not null auto_increment primary key, 
exp_name varchar(45) 
other fields that any kind of experiment can have 

replicates 

rep_id int unsigned not null auto_increment primary key, 
exp_id int unsigned not null foreign key to experiments 
other fields that any kind of experiment replica can have 

subjects 

subject_id int unsigned not null auto_increment primary key, 
subject_name varchar(45), 
other fields that any kind of subject can have 

observations 

ob_id int unsigned not null auto_increment primary key, 
rep_id int unsigned not null foreign key to replicates, 
subject_id int unsigned not null foreign key to subjects, 
ob_time timestamp 
other fields to hold the measurements you make at each timepoint 

如果你有內部複製你需要另一個表來保存內部複製/主題的關係。

不要擔心你的數百萬行。只要你明智地編制索引,就不會有任何問題。但是如果情況變得更糟糕,你總是可以將觀察表(可能是最大的)劃分爲rep_id

+0

謝謝,我喜歡你的設計。如果性能成爲問題,我會嘗試分區方案。 – 2012-07-27 15:44:08

0

如果你有多個數據庫,每個實驗一個?

您的問題的答案取決於您對此問題的回答:您是否想做大量的分析,將一個實驗與另一個進行比較?

如果您要進行大量的實驗對比實驗,對於每個實驗都有單獨的數據庫,這將是一個可怕的痛苦。

我認爲你的觀察表中的實驗ID列的建議是一個好主意。通過這種方式,您可以構建一個包含實驗總體描述的實驗表。該表還可以在您的值列中保存觀察單位(例如,溫度,電壓等)。

如果您有多種實驗的複雜組織,可以將該組織存儲在實驗表中。

請注意,MySQL在處理短行數據時非常高效。您可以購買一臺不錯的服務器,花費幾十個小時的勞動力,或者在雲服務上租用一臺服務器,花費幾個小時的勞動力。

另請注意,MySQL提供MERGE存儲引擎。 http://dev.mysql.com/doc/refman/5.5/en/merge-storage-engine.html這允許一堆具有相同列結構的不同表被訪問,就像它是一個表一樣。這將允許您將來自單個實驗的結果或其組中的結果存儲在它們自己的表中,然後一起訪問它們。如果您在擴展數據收集系統時遇到問題,您可能需要考慮這一點。但好消息是,你可以讓你的數據庫工作,然後轉換爲此。

另一個問題:爲什麼你只有一個只有ts_id值的表?我不明白。

+0

我不一定要比較相同實驗的複製。它們主要用於檢查統計顯着性。我同意''experimentId'路線似乎是一個更清潔的設計,但我擔心的是存儲觀察值的表可能會增長到數億條記錄,所以我不確定性能。 MERGE存儲引擎看起來很有趣。也許更好的是[分區](http://dev.mysql.com/doc/refman/5.5/en/partitioning.html)表。表1可能不僅僅是'ts_id'列,比如每個時間序列的描述。 – 2012-07-27 13:31:19

+0

分區表的確非常出色。但是如果你有大量的數據,它們不如MERGE表格那樣靈活。 – 2012-07-27 16:21:56