我正在开发一个健康应用程序,并创建了一个数据库(mysql),其中存储症状和疾病。
症状与疾病之间应该存在n:m关系,因此每个症状都可能有多种疾病,反之亦然。症状也应该有共同的和不太常见的疾病,因此,他们应该有一个排名(1到无限)。我应该如何设计/添加这个新功能?
当前表结构:
疾病:D_id,D_name
症状:S_id,S_name

最佳答案

您需要一个普通的关联表来解析逻辑n::m关系。此类表的pk是父表的两个pk。提供所需的行唯一性等。
其次,它有数据列,因此不再是关联表,而是一个普通表,一个二进制关系(双亲)。
我知道,在每种疾病的症状或每种症状的疾病结果集中,将对行进行排序,但包含表中值的列不是rank。它是对每种症状:疾病的weight指标。rank是结果集中的顺序,从第1行到第0行,它是派生的,它将一直变化。weight是数据库中从1到无穷大的稳定值。
我建议您给出所有约束的名称。
您能给我看一个关于约束名的查询示例吗?
当然。只需在列之后使用显式CONSTRAINT子句,而不是将每个约束放在一个列中。在复合键的情况下必须这样做,比如这个键。我用于FK约束的命名约定是:

    <parent>_<verb_phrase>_<child>_fk

当您有许多表时,当您管理数据库中的各种对象时,命名约束的相关性以及此命名约定将变得清晰。
动词短语来自数据模型(如果数据已经建模),它描述了主语表和宾语表之间的操作。
在sql中,ddl如下所示(您必须为非sql翻译):
    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 ).

08-03 20:06