我有一点入门级的关系数据库设计问题。我在做一个项目,从科学期刊文章中获取信息,并将其存储在Postgres数据库中。我的主要目标之一是定义一个足够灵活的模式,覆盖大多数我可能在一系列文件中遇到的情况。实际上,文章倾向于报告一组半标准的细节,但一旦你进入细节,肯定会有差异。这些东西是为人类而不是机器写的。
在大多数情况下,定义模式是非常简单的,但我一直在研究的一件事是如何合理地构造一组表来捕获关于研究的主题组和主题子集的详细信息。
以一个简单的随机对照试验为例-你通常有一组人被确定为合格,一组被确定为合格,一组被随机分配到对照组,一组被随机分配到治疗组。在这些组中,您可以以各种特定方式定义子组,但通常是通过某种间隔(例如26-32岁)或类别(例如怀孕/未怀孕)。
目前,我已经设置了这个设置,以便Study记录可以有许多Subject记录,Subject记录可以有许多Interval_Subgroup记录和许多Categorical_Subgroup记录。

Subject
-----------------------------------------
id | groupType  | measure | value | study
-----------------------------------------
13 |  treatment |  count  |  578  |  17
14 |   control  |  count  |  552  |  17

Interval_Subgroup
---------------------------------------------------------------
id | factor | factorMin | factorMax | measure | value | subject
---------------------------------------------------------------
41 |  age   |     18    |     24    |  count  |  125  |   13
42 |  age   |     25    |     32    |  count  |  204  |   13

Categorical_Subgroup
-----------------------------------------------------
id | factor | factorValue | measure | value | subject
-----------------------------------------------------
74 |  sex   |     male    |  count  |  251  |   13
75 |  sex   |    female   |  count  |  327  |   13

这看起来可行,但感觉很笨拙,因为我有两个表用于捕获相同类型的信息。同时它也有局限性,因为它不允许我捕捉任何亚组集合的组合,比如18-24岁的男性。有些研究报告了这种细节,有些则没有,但我希望能够捕捉到论文提供的任何深度的子组信息。
什么是更灵活的方式来构造这些表比我上面所描述的?我试着勾勒出我认为这应该如何工作,现在,我有主题组有许多子组,子组有许多子组定义。只有一个表捕获关于子组的度量,另一个表用于定义每个子组是什么。我不确定方向是否正确。也许有一个更简单的解决方案,你可能知道。
谢谢你抽出时间来帮忙-非常感谢!
编辑:
修复了示例表中唯一的id。

最佳答案

从你的描述来看,似乎factor是一个东西,每个subgroup都有一个或多个factors。对我来说,这意味着factor需要自己的表。因素又可以是intervalcategorical类型,这意味着single table inheritance可能是有序的。
示例表可能如下所示:

subgroups
------------------------------
id | measure | value | subject
------------------------------
41 |  count  |  125  |   13
42 |  count  |  204  |   13

factors
id | type        | factor | category | interval_min | interval_max | subgroup
-----------------------------------------------------------------------------
68 | interval    | age    | NULL     | 18           | 24           | 13
69 | categorical | sex    | male     | NULL         | NULL         | 13

在本例中,41亚组有两个因素,年龄18-24岁和性别男性。
这也可能是因为STI在这里被过度杀死了,在这种情况下,您将factor分成两个表,categorical_factorsinterval_factors,并且一个子组可以有零个或多个。
据我所知,使用STI的复杂性主要取决于你使用的ORM。Rails/ActiveRecord有很好的支持,其他框架各不相同。
希望能有帮助!

关于postgresql - 组和子组关系的最佳关系设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46329333/

10-08 22:15