1

我需要创建一个数据库表来存储一组假设患者的生理特征(例如收缩压、甘油三酯浓度等)的参数描述。

例如,假设用户为 SBP 指定三角分布,则必须存储最小值、最大值和众数(以及分布类型)。或者,用户可以指定一个正态分布,需要存储平均值和标准偏差。

我正在努力使用正确的方法来规范化这些数据。目前,我有一个 Cohort 表和一个 Distribution 表,其中包含许多一对一的关系,如下所示(省略了一些字段):

    队列
        id(INT,NOT NULL,PRIMARY)
        名称(文本,非空)
        评论(文本)
        systolic_blood_pressure_dist(引用 Distributions.id 的外键)
        triglyceride_dist(引用 Distributions.id 的外键)
        ...其他生理参数

    分布
        id(INT,NOT NULL,PRIMARY)
        分布类型(文本)
        最小值(浮动)
        最大(浮动)
        平均值(浮点数)
        模式(浮动)
        sd(浮点数)
        ...其他分布参数(α、β、形状、比例等)

(distribution_type 包含一个描述分布的字符串:“Triangular”、“Weibull”等)

我很确定这不是执行此操作的最佳方法,因为我在 Distributions 的每一行中都留下了大量的 NULL 字段。

我的另一个想法是为每种分布类型设置单独的表(一个用于三角形,一个用于高斯,一个用于统一等),并在中间有一个带有 id 列的表(用作队列中的外键table *_dist 列),一个分布类型列和一个 id 列,用于存储相应分布表中行的外键。

该查询将使用存储在 Cohort 列中的 id 从中间表中查找分布类型和行 id,然后使用该 id 在适当的表中查找参数。但是,使用一个字符串来选择合适的表,然后另一个 id 来选择合适的行,这与传统的 JOIN 相去甚远,而且感觉也不是一种非常干净的方法。

那么,是否有人对如何最好地实现这一点(在标准化和/或性能方面)有任何建议?

非常感谢,丰富

4

5 回答 5

1
Cohort
    id (INT, NOT NULL, PRIMARY)
    name (TEXT, NOT NULL)
    comments (TEXT)

Parameters
    id (INT, NOT NULL, PRIMARY)
    name (TEXT, NOT NULL) ("systolic blood pressure", "trygliceride", ...)

CohortParameters
    id (INT, NOT NULL, PRIMARY)
    cohort_id (FOREIGN KEY referencing Cohort.id)
    parameter_id (FOREIGN KEY referencing Parameters.id)
    value (TEXT)

DistributionTypes
    id (INT, NOT NULL, PRIMARY)
    name (TEXT, NOT NULL) ("Triangular", "Weibull", ...)

Distributions
    id (INT, NOT NULL, PRIMARY)
    distribution_type_id (FOREIGN KEY referencing DistributionTypes.id)
    cohort_id (FOREIGN KEY referencing Cohort.id)
    parameter_id (FOREIGN KEY referencing Parameter.id)
    minimum (FLOAT)
    maximum (FLOAT)
    mean (FLOAT)
    mode (FLOAT)
    sd (FLOAT)
    ...other distribution parameters (alpha, beta, shape, scale, etc.)
于 2009-08-09T16:59:33.740 回答
0

对我来说,为不同的分布类型设置单独的表听起来很合适。在您的应用程序逻辑中,无论如何(我想),您都必须对每种分发类型进行特殊处理,因为它可能需要在 UI 中进行不同的渲染或不同的计算。

于 2009-08-09T17:00:00.403 回答
0

您可能想要为每种分布类型创建一个表格。这样,您就有了一个定义明确的表格,其中包含特定于您的分配类型所需的每个值。这将节省您的空间,允许您锁定哪些字段可以为空,哪些不可以,并且会提高性能。如果每个分布都有一组共同的参数,您可以将表安排在超类型/子类型关系中,以进一步规范化模式。

于 2009-08-09T17:02:36.327 回答
0

查询时如何使用数据?

如果您正在查询多个群组,并且群组具有不同的分布是合理的,那么您的结果将是一个“联合”,其中许多列确实为空。在这种情况下,您的结果在某种意义上是“不正常的”,但这并不意味着架构应该是。

为不同的分布类型使用不同的表的优点是每个表都会显式定义必须填充以描述该分布的列,您甚至可以将某些列设置为“非空”。

我喜欢你提议的总体思路。

于 2009-08-09T17:03:37.493 回答
0

您的设计似乎表明每项测量信息只能有一种类型的分布数据。在您的设计中,似乎不可能同时拥有关于“收缩压”的“均匀分布”和“三角分布”数据。

这似乎表明,对于每个单独的“测量信息”,您已经在系统设计时预先知道了可用的分布数据类型。

这反过来似乎表明没有必要(从关系的角度来看,这样做是完全不好的)将这些不同类型的分布收集到一个集合中,只是通过添加来恢复任何必要的区别一个多余的“分布类型”列。

编辑

“一旦数据库中有两个或多个具有不同分布的生理参数的群组,分布类型列也变得必要。”

这似乎是废话。不同的群组拥有不同的分布测量 ID,而不同的分布测量 ID 可以根据您自己的设计具有不同的分布类型。

于 2009-08-09T21:46:00.370 回答