我正在开发一个健康应用程序,我创建了一个存储症状和疾病的数据库(MySQL)。
症状和疾病之间应该存在N:M关系,因此每种症状都可能有多种疾病,反之亦然。症状也应该有常见和不太常见的疾病,因此,他们应该有一个排名(1到无穷大)。我该如何设计/添加这个新功能?
当前表格结构:
疾病:d_id,d_name症状:s_id,s_name
答案 0 :(得分:3)
您需要一个普通的关联表来解析逻辑n :: m关系。这些表的PK是父表的两个PK。这给出了所需的行唯一性等。
其次,它有数据列,所以它不再是一个关联表,它变成一个普通的表,一个二元关系(两个父)。
据我所知,在每种疾病的症状或每种症状结果集中,行将被排名,但表中包含值的列不是rank
。它是weight
给出每种症状::疾病的指标。 rank
是结果集中的顺序,从1到无行,它是派生的,它将一直在变化。 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
唯一且C
群集。我选择( s_id, d_id )
假设你会有更多查询来查找每种症状的疾病(而不是每种疾病的症状)。如果反之亦然,请将聚类更改为( d_id, s_id ).
答案 1 :(得分:1)
你需要另一张桌子,我们称之为symptom_disease
,它显示症状和疾病之间的关系。换句话说,该表的每一行将显示症状与具有指定等级的疾病相关。所以看看这个:
symptom_disease (s_id,d_id,rank);
其中s_id
是symptom.s_id
的外键,d_id
是disease.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级相关。