我正在开发一个健康应用程序,并创建了一个数据库(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 ).