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

时间:2015-05-20 14:03:23

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

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

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

当前表格结构:

疾病:d_id,d_name

症状:s_id,s_name

2 个答案:

答案 0 :(得分:3)

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

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

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

  4.   
        

    我建议您提供所有约束名称。

      
         

    您能告诉我一个关于约束名称的查询示例吗?

    不确定。只需在列之后使用显式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唯一且C群集。我选择( s_id, d_id )假设你会有更多查询来查找每种症状的疾病(而不是每种疾病的症状)。如果反之亦然,请将聚类更改为( d_id, s_id ).

答案 1 :(得分:1)

你需要另一张桌子,我们称之为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级相关。