2011-08-20 180 views
1

我有點停留在一個棘手的情況與MySQL數據庫設計我webservice.The DB們最初這種結構:MySQL數據庫結構

CREATE TABLE IF NOT EXISTS `Disease` (
    `Name` varchar(20) NOT NULL, 
    `Age` int(10) unsigned NOT NULL, 
    `Descriptin` text NOT NULL, 
    `Sex` varchar(10) NOT NULL, 
    `Ethnicity` varchar(20) NOT NULL, 
    PRIMARY KEY (`Name`,`Sex`,`Ethnicity`), 
    KEY `Sex` (`Sex`), 
    KEY `Ethnicity` (`Ethnicity`) 
    ) 

    ALTER TABLE `Disease` 
    ADD CONSTRAINT `Disease_ibfk_1` FOREIGN KEY (`Sex`) REFERENCES `Sex` (`Sex`)  ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `Disease_ibfk_2` FOREIGN KEY (`Ethnicity`) REFERENCES `Ethnicity` (`Ethnicity`)  ON DELETE CASCADE ON UPDATE CASCADE; 

所以基本上疾病(名稱,年齡,說明, 性別種族)性別和種族是兩個性別和種族表的外鍵,因爲它們可以具有多個價值。

我們的問題,我需要添加另一列稱爲症狀,這將是多值的,但我不能聲明爲外鍵,我需要的是這樣的:一排

例如

Disease(Name="DiseaseName",Age="40",Description="is caused by...",Sex="male",Ethnicity="Caucasian",Symptoms"Headache,sorethroat,fever") 

所以基本上我需要症狀來包含一個字符串的數組,但顯然我不能這樣做,因爲它的RDBMS

謝謝大家的時間和精力!

回答

3

不要這樣做。相反,使數據模型標準化:製作一個新表格「症狀」,用外鍵「疾病」約束,併爲每個症狀製作一個記錄。

每當您開始考慮將數據集合放入單個字段時,您就有效地試圖在數據庫內部構建自己的迷你數據庫。認爲你可以超越並勝過你的關係型數據庫,最好是樂觀的,並且最可能導致以後不可維護的代碼。

順便問一下,Sex真的必須在單獨的表格中查找嗎?對於這樣的微分類你可能想要考慮某種枚舉類型。

+0

是的,我實際上已經實施了其他兩列性別和種族你說的方式,問題是,他們不解決我的需要。有沒有其他解決方法? – rosa

+0

@羅莎:那麼,恩呢怎麼樣? –

+0

其實只是通過性的枚舉:),它的作品謝謝!但是對於原來的問題,它不會起作用,因爲使用枚舉可以爲每個記錄存儲一個值 – rosa

0

您可以通過規範化數據來完成要查找的「字符串數組」。將一個新的密鑰列添加到「疾病」表中。然後創建一個名爲「Symptom」的子表。用外鍵將每個字符串的記錄插入「疾病」表父記錄。

+0

讓我解釋一下我想要的東西:對錶疾病的查詢將匹配患者的性別,種族和年齡以及他擁有的症狀的「列表」,然後返回疾病的名稱。我該如何做?可能嗎? – rosa

0

如果您沒有注意到您拼寫錯誤說明在您的表格創建查詢中。

+0

其實原來是意大利語,只是爲了更好的理解,在這裏改變它的英文,謝謝反正。 – rosa

0

您需要M:N的關係:

  • 表:疾病
    • 名稱
    • 性別
    • 種族
  • 表:症狀
    • ID
    • 名稱
  • 表:Disease_has_Symptoms
    • 名稱(FK到病)
    • 性別(FK到病)
    • 種族(FK到病)
    • ID(FK到症狀)

(也許更容易添加一個I D列疾病和參考,在Disease_has_Symptoms裏面)