【问题标题】:How to add a N:M relationship to my MySQL symptoms and diseases database?如何在我的 MySQL 症状和疾病数据库中添加 N:M 关系?
【发布时间】:2015-05-20 14:03:23
【问题描述】:

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

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

当前表结构:

疾病:d_id,d_name

症状:s_id,s_name

【问题讨论】:

  • 你能给我看一个关于约束名称的例子吗?完成了。请查看、评论、投票、选择等。

标签: mysql database database-design relational-database relationship


【解决方案1】:
  1. 您需要一个普通的关联表来解析逻辑 n::m 关系。此类表的 PK 是父表的两个 PK。这提供了所需的行唯一性等。

  2. 第二,它有数据列,所以不再是关联表,变成普通表,二元关系(两个父)。

  3. 我了解在每个疾病的症状或每个症状的疾病结果集中,行将被排名,但包含值的列在表中 不是rank。它是weight 的指标,赋予每个症状::疾病。 rank 是结果集中的顺序,从 1 到 no-of-rows,它是派生的,它会一直变化。 weight 是数据库中的一个稳定值,从 1 到无穷大。

我建议你给所有的约束命名。

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

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

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

  • 动词短语来自数据模型(数据已经建模),它描述了主语表和宾语表之间的动作。

在 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 Unique 和 C Clustered。我选择了( s_id, d_id ),假设您将有更多查询来查找每种症状的疾病(而不是每种疾病的症状)。如果反之,则将聚类更改为( d_id, s_id ).

【讨论】:

  • 你的解释真是太棒了!非常感谢您的时间和精力! :)
  • @Engo。谢谢。这是我的荣幸。如果您有兴趣了解此级别的信息,请访问我的个人资料,查看我的答案,然后阅读您感兴趣的任何内容。
  • 我创建了一个与此问题相关的新问题。如果您有兴趣:stackoverflow.com/questions/30374031/…谢谢!
【解决方案2】:

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

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 表:

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

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

【讨论】:

  • 这是正确的查询吗? CREATE TABLE symptom_disease( s_id INT, d_id INT, rank INT, FOREIGN KEY(s_id) REFERENCES symptom(s_id), FOREIGN KEY(d_id) REFERENCES disease(d_id) );
  • 好答案。两个变化 (a) 不要叫它等级,叫它重量。等级有不同的含义,例如。在结果集中,疾病将按症状排序,反之亦然。在这里,在数据行中,它是一个权重。 (b) 给他 CREATE TABLE 命令。
  • @Engo。该命令是正确的,但不完整。 (a) 你需要PRIMARY KEY (s_id, d_id) (b) 我建议你给所有的约束命名。
  • 您能给我看一个关于约束名称的查询示例吗?我是这个领域的新手..
  • 看看这个链接,它将帮助您制作外键并命名它们的约束:w3schools.com/sql/sql_foreignkey.asp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
相关资源
最近更新 更多