如何在 MySQL 数据库中添加新关系并使权重依赖?

How to add new relations and making weight dependent in MySQL database?

我正在开发一个健康应用程序,并且正在设计一个数据库 (MySQL),该数据库应存储症状、疾病和身体部位。该应用程序将按如下方式工作:

  1. 用户选择性别、年龄和身体部位(front/back)
  2. 应用程序显示所选身体部位的所有(common/less 常见)症状
  3. 用户选择症状
  4. 应用程序显示所选症状的所有(common/less 常见)疾病。
  5. 用户选择疾病
  6. 应用程序显示疾病信息

到目前为止我得到了一些帮助,但我仍然需要一些帮助来找到解决方案:

Note: The weight determines if a symptom/disease is common or less common. The common symptoms/diseases are listed above the less common symptoms/diseases.

您可以使用一种方法根据频谱单位(在本例中为年龄)将一系列选择分成几类。

create table Symptom_Disease(
    Sex       char( 1 ) not null,
    Age       smallint not null,
    Weight    smallint not null,
    BodyPart  int not null references BodyPart( BP_ID),
    SymptomID int not null references Symptoms( S_ID ),
    DiseaseID int not null references Disease( D_ID ),
    constraint PK_Symptom_Disease primary key( Sex, Age )
);

您查询时有性别、年龄、body部位和症状:

select  sd.Sex, sd.Age, d.*, sd.weight
from    Symptom_Disease sd
join    Disease d
    on  d.D_ID = sd.D_ID
where   sd.Sex = :Sex
    and sd.BodyPart = :BodyPart
    and sd.Symptom = :Symptom
    and sd.Age =(
            select  Max( Age )
            from    Symptom_Disease
            where   Sex = sd.Sex
                and BodyPart = sd.BodyPart
                and Symptom = sd.Symptom
                and Age <= :Age )
order by weight;

例如,您可能有 0、2、12、21、35 和 70 岁的条目(不同权重)。年龄代表该年龄组的下限。所以第一个记录是 2 岁或以下的,第二个记录是 12 岁及以下的,但不包括 2 岁,依此类推。如果您的患者年龄为 25 岁,则此查询将为 21 岁的每组(性别,Body 部位,症状)的每个重量的所有疾病 return - 这是小于或等于的最高年龄等于患者的年龄。

只需将 sd.Symptom = :Symptom 更改为 sd.Symptom in( :S1, :S2,...) 即可出现多种症状。如果是这样,您可能希望将症状添加到 order by 子句。

The weight determines if a symptom/disease is common or less common. The common symptoms/diseases are listed above the less common symptoms/diseases.

没关系。有点简单,但很好。即按 weightORDER BY weight.

排名

Making weight in symptom_disease dependent on the selected age and gender (order of the listed diseases should depend on the selected age and gender)

这告诉我你想要的结果(这也很好)。但是产生该结果所需的数据...

  • 每个年龄每种疾病每种症状的体重,或

  • 每种疾病每种症状每种年龄每种性别的体重

...不存在。无中生有。

概念

整个概念不成熟。 (当然,我说的是给你这份工作的一方,而不是你,你正在努力实施它。)例如。我们知道:

  • 生活在sun-drenched国家的白人患有黑色素瘤等,而当地人不会

  • south-east生活在西方社会的亚洲人患糖尿病和心脏病的人数比在自己国家的人多

  • 许多疾病,例如。乳腺癌,有遗传因素

关键是,这个概念非常简单。当 medically-trained 和经验丰富的专业人士仔细考虑这种简单的方法时,他们会想出比 symptom_disease.weight 更具指示性的东西,然后必须根据以下因素向上或向下调制年龄和性别。他们会想出许多影响 weight, 年龄和性别的因素只是其中的两个因素。

系统实施后,如果不是之前,您将需要:

  • 更多因素或类别

  • 每个都必须有一个权重值或一个因子值

  • (a) 用户选择,(b) 影响最终结果(患病概率)

此外,在这样的解决过程中:

  • 其中一些因素可能会变成一个权重(另一个权重,在该因素级别)而不是一个因素

  • 在那个过程中,可能会发现symptom_disease.weight实际上是一个中间结果,而不是symptom_disease级别的存储值

  • 可能导致 weightdisease 水平,由每个因素调节。

结果权重

一旦数据被结构化和组织化,就很容易根据用户对症状、类别和因素的选择获得最终权重。它只是针对数据库的单个 SELECT。

  • 我会使用 Dynamic SQL 构造查询,然后执行它,因为另一种方法是对每个可能的查询进行编码,select 相关的查询根据用户要求。

  • 但是,对于概念验证的起点,只需编写几个单独的查询。

您不需要数据库端的功能。在代码方面,函数是个好主意,因为它消除了重复代码。

记录 ID

这个生物带来了很多问题,并保证 non-database。请阅读this Answer。您可能会发现整个 post 有用,如果没有,您需要的最低限度是从顶部开始,直到并包括 False Teachers.

同样,在列名前加上文件标识符也是错误的。在 SQL 中,您可以根据需要使用文件名限定列名。而不是 s_namebp_name:

    SELECT  symptom.name,
            bodypart.name,
            ...

数据模型

在这个早期阶段最重要的问题是提供一个易于扩展的数据库,按照那些预期的变化,这意味着纯关系和遵守标准。您必须放置所有数据;关于数据的规则;与数据相关的所有内容,都在数据库中(而不是在代码中)。

Symptom Disease Data Model (Demonstrative)

无论如何,现在,鉴于您所描述的内容,并考虑到我上面的解释,我们有两个选择。我为每个人提供了一个单独的数据模型。

1 调制权重

您的客户仅提供每种疾病每种症状的权重,以及每个年龄、性别等因素。

  • 这些因素将用于调整权重。

  • 注意,age Key是一个年龄范围,eg. 1-18; 19-25; 26-35; 35-55;等等

  • 因子是介于 0 和某个合理最大值(例如 100)之间的实数。例如。 1.0 for age表示体重不随年龄变化; 0.5表示体重随年龄减半; 2.0表示体重随年龄增加一倍;等等

  • 向量或维度在顶部。当确定新因素(例如种族)时,您可以添加另一个因素(维度),方法与添加年龄和性别相同。

2比重

您的客户提供每种疾病每种症状每种年龄每种性别的具体权重等等。没有任何因素。

讨论

在这两个模型中,wh当确定新因素时,会添加 n 个表格,核心(五个表格,顶部中心)不会改变。但是,在第二个模型中,我在此基础上区分了年龄和性别:

  1. 性别被建模为一个决定性的,一个维度,因此我通过核心表将其作为关系键进行了处理。关系键对于导航(如减少它)和提供强大的功能很重要。除此之外,我说性别是确定的。

    推论是,您不希望将确定性因素排除在核心表的 Key 之外,因为这会降低导航能力和速度。

  2. 年龄被建模为一个额外的维度,可以在核心表稳定后轻松添加,作为识别新因素时的维度。

一个并不比另一个好。我在这里要说的是,这适用于两个模型,但在特定重量模型中更明显,需要仔细考虑构成核心表的维度。不是因为你在关系键中所做的任何事情都更难改变(并且对现有代码有影响),而是相反,核心表真正确定的部分,构成了核心 symptom::disease指标,稳定。一定要早定,早建模。

  • 例如。我不明白为什么你把 symptom 作为 bodypart 的 child,我可以想象 symptoms 不是特定于 bodypart,但我暂时保留原样。

    • 不改变结构的ugly-as-sin修复是有一个特殊的bodypart表示整个body。

    • 而不是 {Head/Behavioural/...},考虑 symptom 类别的类别,例如 { Physical |心理 |行为 }。或行为 { 吸烟 |酒精 } 可能是导致疾病的另一个因素。

  • 例如。我可以想象 symptoms 是特定的男性或女性。我用两种方式对性别建模,以便您可以评估差异和影响:

    • 离婚和隔离 1 调制重量

    • 作为 bodypart, symptom,disease 在 2 Specific Weight 中的分类器(因此也是标识符)。

这一切的重点是:

  1. 决定因素需要暴露;评估;尽早确定,以便核心表稳定。

  2. 必须确定并实施与疾病诊断相关的所有因素。不仅是年龄和性别,还有种族;遗传性疾病;行为;地点;等等

欢迎大家留言、提问等