如何将 N:M 关系添加到我的 MySQL 症状和疾病数据库?
How to add a N:M relationship to my MySQL symptoms and diseases database?
我正在开发一个健康应用程序,我已经创建了一个数据库 (MySQL),用于存储症状和疾病。
症状和疾病之间应该存在N:M关系,所以一个症状可能有多种疾病,反之亦然。症状还应该有常见和不常见的疾病,因此,它们应该有一个等级(1 到无穷大)。我该如何design/add这个新功能?
当前table结构:
疾病:d_id、d_name
症状:s_id、s_name
你需要另一个 table,我们称之为 symptom_disease
,它显示了症状与疾病之间的关系。换句话说,此 table 的每一行都将显示症状与具有指定等级的疾病相关。所以看看这个:
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
table:
| s_id | d_id | rank |
| 1 | 1 | 0 |
| 2 | 1 | 0 |
| 1 | 2 | 5 |
这几行显示胃痛与感冒相关的等级为 0,与癌症相关的等级为 5;头痛也与感冒有关,等级为 0。
您需要一个普通的关联 table 来解析逻辑 n::m 关系。这样的tables的PK是父tables的两个PK。这给出了所需的行唯一性等。
第二,它有数据列,所以不再是Associativetable,变成了普通的table,二元关系(双亲)
我了解在每种疾病的症状或每种症状的疾病结果集中,行将被排序,但包含table 中的值 不是 rank
。是给每个symptom::disease一个weight
的指标。 rank
是结果集中的顺序,从1到no-of-rows,它是推导出来的,它会一直变化。 weight
是数据库中的一个stable值,从1到无穷大。
I recommend you give all the constraints names.
你能给我一个关于约束名称的查询示例吗?
当然可以。只需在列之后使用显式 CONSTRAINT
子句,而不是将每个约束放置在单个列中。对于复合键,您必须这样做,例如这个。我对 FK 约束使用的命名约定是:
<parent>_<verb_phrase>_<child>_fk
当您有许多 table 时,当您管理数据库中的各种对象时,命名约束的相关性以及此命名约定将变得清晰。
Verb Phrase来自数据模型(如果数据被建模),它描述了主语table和宾语table之间的动作。
在 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 ).
我正在开发一个健康应用程序,我已经创建了一个数据库 (MySQL),用于存储症状和疾病。
症状和疾病之间应该存在N:M关系,所以一个症状可能有多种疾病,反之亦然。症状还应该有常见和不常见的疾病,因此,它们应该有一个等级(1 到无穷大)。我该如何design/add这个新功能?
当前table结构:
疾病:d_id、d_name
症状:s_id、s_name
你需要另一个 table,我们称之为 symptom_disease
,它显示了症状与疾病之间的关系。换句话说,此 table 的每一行都将显示症状与具有指定等级的疾病相关。所以看看这个:
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
table:
| s_id | d_id | rank |
| 1 | 1 | 0 |
| 2 | 1 | 0 |
| 1 | 2 | 5 |
这几行显示胃痛与感冒相关的等级为 0,与癌症相关的等级为 5;头痛也与感冒有关,等级为 0。
您需要一个普通的关联 table 来解析逻辑 n::m 关系。这样的tables的PK是父tables的两个PK。这给出了所需的行唯一性等。
第二,它有数据列,所以不再是Associativetable,变成了普通的table,二元关系(双亲)
我了解在每种疾病的症状或每种症状的疾病结果集中,行将被排序,但包含table 中的值 不是
rank
。是给每个symptom::disease一个weight
的指标。rank
是结果集中的顺序,从1到no-of-rows,它是推导出来的,它会一直变化。weight
是数据库中的一个stable值,从1到无穷大。
I recommend you give all the constraints names.
你能给我一个关于约束名称的查询示例吗?
当然可以。只需在列之后使用显式 CONSTRAINT
子句,而不是将每个约束放置在单个列中。对于复合键,您必须这样做,例如这个。我对 FK 约束使用的命名约定是:
<parent>_<verb_phrase>_<child>_fk
当您有许多 table 时,当您管理数据库中的各种对象时,命名约束的相关性以及此命名约定将变得清晰。
Verb Phrase来自数据模型(如果数据被建模),它描述了主语table和宾语table之间的动作。
在 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 ).