根据我的情况,我应该将所有症状合并为一行,如下面的方法1或创建更多行的方法2。我不喜欢方法1的原因是我必须使用 - 来分隔每个症状,后来我需要使用php explode(' - ')将它们分开并使用LIKE来匹配它们。
方法2将创建更多行,我想我会创建更多表来分隔它们。
方法1:
disease symptoms
HIV pain-cough-hair loss
Flu cought-running nose-fever
cacer lose weight-fever-fatigue
方法2:
disease symptoms
HIV pain
HIV cough
HIV hair loss
... ...
... ...
答案 0 :(得分:3)
在您的两种方法中,方法2将是首选。正如 @JNevill 所述,在搜索或过滤数据时,将多个数据存储在一列中会成为一场噩梦。
我的完整建议是使用选项3。看看下面的设计:
表1: DISEASES
+------+-----------+
| id | name |
+------+-----------+
| 1 | HIV |
|------|-----------|
| 2 | FLU |
|------|-----------|
| 3 | Cancer |
+------+-----------+
主键:
id
表2:症状
+------+-----------+
| id | name |
+------+-----------+
| 1 | pain |
|------|-----------|
| 2 | cough |
|------|-----------|
| 3 | hair-loss |
+------+-----------+
主键:
id
表3: DISEASES-SYMPTOMS
+-------------+--------------+
| disease_id | symptom_id |
+--------------+--------------+
| 1 | 1 |
|--------------|--------------|
| 1 | 2 |
|--------------|--------------|
| 1 | 3 |
+--------------+--------------+
主键:
(disease_id, symptom_id)
外键:
DISEASES.id
- > DISEASES_SYMTPOMS.disease_id
SYMTPOMS.id
- > DISEASES_SYMTPOMS.symptom_id
建立基准表DISEASES
和SYMPTOMS
。然后建立一个3 rd 表,表示前两个表中的JOIN
。这种数据的标准化将简化应用程序的结构并防止数据重复,因为每种疾病都可能有多种症状,每种症状都可能属于多种疾病。
SAMPLE QUERY(MySQL):
SELECT
d.id,
d.name,
s.name
FROM DISEASES as d
INNER JOIN DISEASES_SYMPTOMS AS ds ON d.id = ds.disease_id
INNER JOIN SYMPTOMS AS s ON ds.symptom_id = s.id;
示例查询结果:
+------+----------------+----------------+
| id | disease_name | symptom_name |
+------+----------------+----------------+
| 1 | HIV | pain |
|------|----------------|----------------|
| 1 | HIV | cough |
|------|----------------|----------------|
| 1 | HIV | hair-loss |
+------+----------------+----------------+
答案 1 :(得分:1)
这取决于您希望数据库的规范化程度。更常规化的方法是创建一个容纳所有症状的症状表,一个容纳所有疾病的疾病表,以及另一个表可能由疾病和症状与疾病相关联的表。较不规范化的方法就像您的方法1,其中您将所有症状包括在表中由某个分隔符分隔的字段中,或者如果您使用的是支持数组的数据库则将其放入数组中。
答案 2 :(得分:0)
为master tables
创建两个disease
& symptoms
。然后创建第三个表格。disease_symptom
包括两个外键列说disease_id
& symptom_id
并参考相应的主表