2016-08-02 22 views
-4

基於我的情況,我應該將所有症狀組合成一行作爲我的方法1或創建更多行的方法2。我不喜歡方法1的原因是我必須使用 - 分隔每個症狀,稍後我需要使用php explode(' - ')來分隔它們並使用LIKE來匹配它們。哪個更好的方法來創建我的mysql表?

方法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 
...   ... 
...   ... 
+6

方法2.這是非常罕見的,在單個字段中存儲多於一個的值沒有按不會以痛苦和遺憾結束。 – JNevill

+0

我想我可以使用DISTINCT來解決這個問題,我可以嗎? – conan

+2

不同的是解決哪個問題?這個問題是適當的正常化,分別是未來的規模。想象一下,如果你想從現在起開始存儲症狀的屬性,並且你使用method1。你最終會得到來自地獄的加入。 – JNevill

回答

3

在兩種方法中,方法2是優選的。由於@JNevill筆記,當在一列中存儲多個數據片段時,在搜索或過濾數據時變成惡夢。

但是我的完整建議是使用選項3。看看下面的設計:

表1:疾病

+------+-----------+ 
| id | name  | 
+------+-----------+ 
| 1 | HIV  | 
|------|-----------| 
| 2 | FLU  | 
|------|-----------| 
| 3 | Cancer | 
+------+-----------+ 

主鍵:

  • id

表2:症狀

+------+-----------+ 
| id | name  | 
+------+-----------+ 
| 1 | pain  | 
|------|-----------| 
| 2 | cough  | 
|------|-----------| 
| 3 | hair-loss | 
+------+-----------+ 

主鍵:

  • id

表3:疾病-症狀

+-------------+--------------+ 
| 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。然後建立一個代表前兩個表的JOIN的表格。數據規範化將簡化應用程序的結構並防止數據重複,因爲每種疾病都可能有多種症狀,每種症狀都可能屬於多種疾病。

示例查詢(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

謝謝你的時間。 – conan

1

這取決於你想要如何規範化數據庫是。更爲標準化的方法是創建一個容納所有症狀的症狀表,一個容納所有疾病的疾病表,另一個表可能與疾病和症狀相關,可能是通過疾病和症狀。而規範化程度較低的方法與您的方法1類似,如果您使用支持數組的數據庫,則將所有症狀作爲表中的字段包含在分隔符中,或放入數組中。

0

disease創建兩個master tables & symptoms。然後創建第三個表格說。 disease_symptom包括兩個外鍵列disease_id & symptom_id並參考對應的主表

相關問題