使用可选列更正数据库的规范化

时间:2009-08-09 16:55:00

标签: mysql database database-design normalization

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

例如,假设用户为SBP指定了三角形分布,则必须存储最小值,最大值和模式(以及分布类型)。或者,用户可以指定正态分布,需要存储均值和标准差。

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

    Cohort
        id (INT, NOT NULL, PRIMARY)
        name (TEXT, NOT NULL)
        comments (TEXT)
        systolic_blood_pressure_dist (FOREIGN KEY referencing Distributions.id)
        triglyceride_dist (FOREIGN KEY referencing Distributions.id)
        ...other physiological parameters

    Distributions
        id (INT, NOT NULL, PRIMARY)
        distribution_type (TEXT)
        minimum (FLOAT)
        maximum (FLOAT)
        mean (FLOAT)
        mode (FLOAT)
        sd (FLOAT)
        ...other distribution parameters (alpha, beta, shape, scale, etc.)

(distribution_type包含描述分布的字符串:“Triangular”,“Weibull”等。)

我很确定这不是最好的方法,因为我在分配的每一行都留下了大量的NULL字段。

我的另一个想法是为每种分布类型设置单独的表(一个用于三角形,一个用于高斯,一个用于制服等),并且在中间有一个带有id列的表(用作外键)在Cohort表* _dist列中),分发类型列和id列,用于在适当的分发表中存储该行的外键。

查询将使用存储在Cohort列中的id从中间表中查找分发类型和行ID,然后使用id在相应的表中查找参数。但是,使用字符串来选择适当的表,然后另一个用于选择相应行的id远不是传统的JOIN,也不是一种非常干净的方法。

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

非常感谢, 富

5 个答案:

答案 0 :(得分: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.)

答案 1 :(得分:0)

为不同的分发类型设置单独的表听起来对我而言。在你的应用程序逻辑中,你必须特殊情况下每个分布类型,无论如何(我推测),因为它可能需要在UI中进行不同的渲染,或者不同的计算。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

查询时如何使用数据?

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

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

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

答案 4 :(得分:0)

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

这似乎表明,对于每个单独的“测量信息”,您已经在系统设计时预先了解了哪种分发数据。

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

修改

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

这似乎很糟糕。不同的群组拥有不同的分布测量ID,并且不同的分布测量ID可以根据您自己的设计具有不同的分布类型。