哪个是创建我的mysql表的更好方法?

时间:2016-08-02 20:46:01

标签: php mysql

根据我的情况,我应该将所有症状合并为一行,如下面的方法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
...           ...
...           ...

3 个答案:

答案 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

建立基准表DISEASESSYMPTOMS。然后建立一个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并参考相应的主表