1

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

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

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

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

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

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

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

  1. 在表格中添加一个experiment_id,让它们增长得更多。
  2. 为每个实验创建一个单独的数据库。

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

4

2 回答 2

0

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

你的问题的答案取决于你对这个问题的回答:你愿意做很多分析来比较一个实验和另一个实验吗?

如果您将进行大量的实验与实验比较,那么为每个实验都有一个单独的数据库将是一件非常痛苦的事情。

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

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

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

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

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

于 2012-07-27T13:05:09.170 回答
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.

于 2012-07-27T13:17:40.597 回答