Php 创建mysql表的更好方法是什么?
根据我的情况,我应该将所有症状合并成一行,作为下面的方法1还是创建更多行的方法2。我不喜欢方法1的原因是我必须使用-来分离每个症状,然后我需要使用php explode('-')来分离它们,并使用like来匹配它们 方法2将创建更多的行,我想我将创建更多的表来分隔它们 方法1:Php 创建mysql表的更好方法是什么?,php,mysql,Php,Mysql,根据我的情况,我应该将所有症状合并成一行,作为下面的方法1还是创建更多行的方法2。我不喜欢方法1的原因是我必须使用-来分离每个症状,然后我需要使用php explode('-')来分离它们,并使用like来匹配它们 方法2将创建更多的行,我想我将创建更多的表来分隔它们 方法1: disease symptoms HIV pain-cough-hair loss Flu cought-running nose-fever
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
... ...
... ...
这取决于您希望数据库规范化的程度。更规范化的方法是创建一个包含所有症状的症状表,一个包含所有疾病的疾病表,另一个表可能通过疾病id和症状id将疾病与症状链接起来。标准化程度较低的方法类似于方法1,其中将所有症状作为字段包含在表中,并用分隔符分隔,或者如果使用支持数组的数据库,则将其放入数组中 为
疾病
和症状
创建两个主表
。然后创建第三个表,例如。disease\u symptom
包括两个外键列,例如disease\u id
&symptom\u id
,并参考相应的主表。在两种方法中,方法2是首选方法。正如@jnevil所指出的,在搜索或过滤数据时,在一列中存储多个数据段会成为一场噩梦
然而,我的全部建议是使用选项3。请看下面的设计:
表1:疾病
+------+-----------+
|id |名称|
+------+-----------+
|1 |艾滋病毒|
|------|-----------|
|2 |流感|
|------|-----------|
|3 |癌症|
+------+-----------+
主键:
id
+------+-----------+
|id |名称|
+------+-----------+
|1 |疼痛|
|------|-----------|
|2 |咳嗽|
|------|-----------|
|3 |脱发|
+------+-----------+
主键:
id
+-------------+--------------+
|疾病|症状| id|
+--------------+--------------+
| 1 | 1 |
|--------------|--------------|
| 1 | 2 |
|--------------|--------------|
| 1 | 3 |
+--------------+--------------+
主键:
(疾病id、症状id)
->DISEASES.id
DISEASES\u SYMTPOMS.disease\u id
->SYMTPOMS.id
疾病\症状\ id
疾病
和症状
。然后建立第三个表,表示前两个表的连接。这种数据规范化将简化应用程序的结构,并防止数据重复,因为每个疾病都可能有多个症状,每个症状都可能属于多个疾病
示例查询(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;
示例查询结果:
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 |疾病|症状|名称|
+------+----------------+----------------+
|1 | HIV |疼痛|
|------|----------------|----------------|
|1 | HIV |咳嗽|
|------|----------------|----------------|
|1 | HIV |脱发|
+------+----------------+----------------+
方法2。在一个字段中存储多个值不会导致痛苦和遗憾是非常罕见的。我想我可以用DISTINCT来解决这个问题,可以吗?DISTINCT来解决哪个问题?问题在于适当的正常化以及未来的规模。想象一下,如果您想从现在起一年后开始存储症状的属性,然后使用method1。你会得到地狱的加入。谢谢你的时间。