【问题标题】:Time series data base for scientific experiments用于科学实验的时间序列数据库
【发布时间】:2012-07-26 03:28:15
【问题描述】:

我必须使用时间序列进行科学实验。

我打算使用MySQL作为数据存储平台。

我正在考虑使用以下一组表来存储数据:

Table1 --> ts_id(存储时间序列索引,我要处理好几个时间序列)

Table2 --> ts_id, obs_date, value(应该被{ts_idx,obs_date}索引)

因为会有很多时间序列(数百个),每个可能有数百万个观测值,表 2 可能会变得非常大。

问题是我必须多次重复这个实验,所以我不确定最好的方法是什么:

  1. experiment_id 添加到表中,让它们进一步增长。
  2. 为每个实验创建一个单独的数据库。

如果选项 2 更好(我个人认为是这样),那么执行此操作的最佳逻辑方法是什么?我有许多不同的实验要执行,每个都需要复制。如果我为每个复制创建不同的数据库,我很快就会获得数百个数据库。有没有办法在逻辑上组织它们,例如将每个复制作为其实验master database的“子数据库”?

【问题讨论】:

标签: mysql database time-series


【解决方案1】:

您可能希望从考虑如何分析数据开始。

假设您的分析需要了解实验名称、实验副本编号、内部重复(例如,在每个时间点,每个处理测量 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 划分您的观察表(可能是最大的)。

【讨论】:

  • 谢谢,我喜欢你的设计。如果性能成为问题,我会尝试分区方案。
【解决方案2】:

您是否应该拥有多个数据库,每个实验一个?

您的问题的答案取决于您对以下问题的回答:您是否愿意进行大量分析以将一项实验与另一项实验进行比较?

如果您要进行大量的实验与实验比较,那么每个实验都有一个单独的数据库将是一件令人头疼的事情。

我认为您对观察表中的实验 ID 列的建议是个好主意。这样,您就可以构建一个包含实验总体描述的实验表。该表还可以在您的值列中保存观察单位(例如温度、电压等)。

如果您有多个实验的某种复杂组织,您可以将该组织存储在您的实验表中。

请注意,MySQL 在处理短行数据方面非常有效。您可以花几十个小时的人工成本购买一台不错的服务器,或者花几个小时的人工成本在云服务上租用一台服务器。

还要注意 MySQL 提供了 MERGE 存储引擎。 http://dev.mysql.com/doc/refman/5.5/en/merge-storage-engine.html 这允许访问一堆具有相同列结构的不同表,就好像它是一个表一样。这将允许您将单个实验或一组实验的结果存储在各自的表中,然后一起访问它们。如果您在扩展数据收集系统时遇到问题,您可能需要考虑这一点。但好消息是你可以让你的数据库正常工作,然后转换成这个。

另一个问题:为什么你有一个只有 ts_id 值的表?我不明白。

【讨论】:

  • 我不一定要比较同一个实验的重复。它们主要用于检查统计显着性。我同意experimentId 路由似乎是一个更简洁的设计,但我担心存储观察结果的表可能会增长到数亿条记录,所以我不确定性能。 MERGE 存储引擎似乎很有趣。也许更好的是partitioned 表。表 1 可能不止有 ts_id 列,比如每个时间序列的描述。
  • 分区表确实很棒。但是,如果您有大量数据,它们就没有 MERGE 表那么灵活。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2012-05-22
  • 2012-08-15
相关资源
最近更新 更多