我正在开发一个健康应用程序,我创建了一个数据库(MySQL),用于存储症状和疾病。
症状与疾病之间应该存在N:M关系,因此每种症状都可能有多种疾病,反之亦然。症状也应该有常见的和较少常见的疾病,因此,他们应该有一个排名(1至无穷)。我应该如何设计/添加这个新特性?
当前表结构:
疾病: d_id,d_name
症状: s_id,s_name
发布于 2015-05-21 01:31:06
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 ).
发布于 2015-05-20 14:31:30
您需要另一个表,让我们称之为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 |列示胃痛与感冒呈0级相关,与癌症呈5级关系;头痛与感冒呈0级相关。
https://stackoverflow.com/questions/30352028
复制相似问题