2016-05-16 37 views
0

我正在设计一个数据库来记录实验结果。基本上,一个实验有几个输入参数和一个输出响应。因此,数据表将类似于以下内容:用于记录实验数据的数据库设计

run_id parameter_1 parameter_2 ... parameter_n响应

1 ... ... ... ...

2 ...... ......

。 。 。

但是,该表的结构并不是决定因素,因为不同的实验具有不同的列数。然后问题是:当用户实例化一个实验时,动态地创建数据表是一个好主意吗?否则,这是什么优雅的解决方案?谢谢。

回答

0

当我发现自己试图在运行时动态创建表时,通常意味着我需要另一个表来解析实体之间的关系。简而言之,我建议将输入参数作为一个单独的实体处理,并将它们存储在一个单独的表中。

这听起来像你的实体是:

  • 实验
  • 的实验运行,这由一个响应和一个或多个:
    • 输入参数

实体之间的关系是:

  • 一个实验,以零个或多个运行
  • 一个运行于一个或多个输入参数值(一对多)

这最后的关系将需要额外的表来解决。您可以有一个存储输入参数的单独表格,并将输入参数与run_id相关联。该表可能看起来像:

run_parameter_id ... run_id_fk ... parameter_keyword ... parameter_value 

run_id_fk是一个外键在奔跑表中的相应行(在你的问题中所述)。 parameter_keyword仅用于跟踪参数的名称(parameter_1_exp1parameter_2_exp1等)。

从数据库读取/写入的查询现在变得稍微复杂一些(需要连接),但不再依赖于即时创建表。

让我知道如果这不清楚,我可以提供一个潜在的数据库图。

+0

非常感谢您的及时回复。我一直在四处搜索,发现了类似的解决方案,名为entity-attribute-value。如上所述,这将创建一个“长而瘦”的表格,并且查询会变得有点复杂。另一个可能的解决方案是将参数配置存储为一个二进制对象BLOB,但是,这不会支持查询,因此需要一些额外的代码来遍历二进制对象。 – Poplong

+0

另一种选择是以JSON对象的形式将参数存储在字符串中。您可以使用JSON库来帮助解析对象,这可能比直接BLOB解析更容易,但是像您提到的那样仍然需要额外的代码。 – Michael