2011-08-20 125 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里面)