首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在我的MySQL症状和疾病数据库中添加N:M关系?

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

Stack Overflow用户
提问于 2015-05-20 14:03:23
回答 2查看 710关注 0票数 1

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

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

当前表结构:

疾病: d_id,d_name

症状: s_id,s_name

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-21 01:31:06

  1. 您需要一个普通的关联表来解析逻辑n::m关系。这类表的PK是父表的两个PKs。这提供了所需的行唯一性,等等。
  2. 第二,它有数据列,所以它不再是一个关联表,它变成了一个普通的表,一个二进制关系(双亲)。
  3. 我了解到,在症状-每种疾病或疾病-每种症状的结果集中,行将被排列,但是包含表中值的列不是rank。它是weight给出的每一种症状的指标::疾病。rank是结果集中的顺序,从1行到无行,它是派生的,它将一直变化。weight是数据库中的一个稳定值,从1到无穷大。

我建议您给出所有约束的名称。您能给我看一个关于约束名称的查询示例吗?

好的。只需在列之后使用显式CONSTRAINT子句,而不是将每个约束放在单个列中。在复式钥匙的情况下,你必须这样做,比如这个。我为FK约束使用的命名约定是:

代码语言:javascript
复制
    <parent>_<verb_phrase>_<child>_fk
  • 当您管理数据库中的各种对象时,当您有许多表时,命名约束以及这个命名约定的相关性将变得非常清楚。
  • 动词短语来自于数据模型(如果数据是建模的),它描述了主题表和对象表之间的动作。

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

代码语言:javascript
复制
    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 ).

票数 3
EN

Stack Overflow用户

发布于 2015-05-20 14:31:30

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

代码语言:javascript
复制
symptom_disease (s_id,d_id,rank);

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

让我们举个例子。我们有两种像这样的疾病:

代码语言:javascript
复制
|   d_id   |   name   |
|    1     |   cold   |
|    2     |   cancer |

还有两种症状:

代码语言:javascript
复制
|   s_id   |    name    |
|    1     |Stomach Ache|
|    2     |   headache |

现在看看symptom_disease表:

代码语言:javascript
复制
|   s_id   |    d_id    |    rank    |
|    1     |    1       |     0      |
|    2     |    1       |     0      |
|    1     |    2       |     5      |

列示胃痛与感冒呈0级相关,与癌症呈5级关系;头痛与感冒呈0级相关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30352028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档