如何将 N:M 关系添加到我的 MySQL 症状和疾病数据库?

How to add a N:M relationship to my MySQL symptoms and diseases database?

我正在开发一个健康应用程序,我已经创建了一个数据库 (MySQL),用于存储症状和疾病。

症状和疾病之间应该存在N:M关系,所以一个症状可能有多种疾病,反之亦然。症状还应该有常见和不常见的疾病,因此,它们应该有一个等级(1 到无穷大)。我该如何design/add这个新功能?

当前table结构:

疾病:d_id、d_name

症状:s_id、s_name

你需要另一个 table,我们称之为 symptom_disease,它显示了症状与疾病之间的关系。换句话说,此 table 的每一行都将显示症状与具有指定等级的疾病相关。所以看看这个:

symptom_disease (s_id,d_id,rank);

其中s_idsymptom.s_id的外键,d_iddisease.d_id的外键。

举个例子。考虑一下我们有两种这样的疾病:

|   d_id   |   name   |
|    1     |   cold   |
|    2     |   cancer |

还有两个症状:

|   s_id   |    name    |
|    1     |Stomach Ache|
|    2     |   headache |

现在看symptom_disease table:

|   s_id   |    d_id    |    rank    |
|    1     |    1       |     0      |
|    2     |    1       |     0      |
|    1     |    2       |     5      |

这几行显示胃痛与感冒相关的等级为 0,与癌症相关的等级为 5;头痛也与感冒有关,等级为 0。

  1. 您需要一个普通的关联 table 来解析逻辑 n::m 关系。这样的tables的PK是父tables的两个PK。这给出了所需的行唯一性等。

  2. 第二,它有数据列,所以不再是Associativetable,变成了普通的table,二元关系(双亲)

  3. 我了解在每种疾病的症状或每种症状的疾病结果集中,行将被排序,但包含table 中的值 不是 rank。是给每个symptom::disease一个weight的指标。 rank是结果集中的顺序,从1到no-of-rows,它是推导出来的,它会一直变化。 weight是数据库中的一个stable值,从1到无穷大。

I recommend you give all the constraints names.

你能给我一个关于约束名称的查询示例吗?

当然可以。只需在列之后使用显式 CONSTRAINT 子句,而不是将每个约束放置在单个列中。对于复合键,您必须这样做,例如这个。我对 FK 约束使用的命名约定是:

    <parent>_<verb_phrase>_<child>_fk
  • 当您有许多 table 时,当您管理数据库中的各种对象时,命名约束的相关性以及此命名约定将变得清晰。

  • Verb Phrase来自数据模型(如果数据被建模),它描述了主语table和宾语table之间的动作。

在 SQL 中,DDL 如下所示(您必须为 NONsql 进行翻译):

    CREATE TABLE symptom_disease (      -- associative table
        s_id      INT  NOT NULL, 
        d_id      INT  NOT NULL, 
        weight BIGINT  NOT NULL,        -- plus a data column

        CONSTRAINT UC_PK                -- named constraints
            PRIMARY KEY ( s_id, d_id ),

        CONSTRAINT symptom_indicates_symptom_disease_fk
            FOREIGN KEY            ( s_id ) 
                REFERENCES symptom ( s_id ), 

        CONSTRAINT disease_is_indicated_by_symptom_disease_fk
            FOREIGN KEY            ( d_id ) 
                REFERENCES disease ( d_id ) 
        )

对于 PK,您需要 U 唯一和 C 集群。我选择 ( s_id, d_id ) 的假设是您将有更多的查询来查找每种症状的疾病(而不是每种疾病的症状)。如果相反,则将聚类更改为 ( d_id, s_id ).