规范化这个数据库的最佳方法是什么?

时间:2016-06-17 12:14:54

标签: mysql sql database api database-normalization

首先感谢您阅读我的问题,希望您能帮助我。

所以我正在创建一个API,以便稍后在我的Android应用程序中使用,但我怀疑我需要创建正在使用的数据库的正确方法。我现在拥有数据库设置的方式是这样的:

enter image description here

但这看起来不太好,并且对我在API中想要做的事情没有帮助。我希望我的用户能够输入症状,然后我的API根据用户的输入输出疾病。

所以,我认为我需要改变我的数据库设计,但它应该是什么样子?过去一天我一直在努力解决这个问题,我似乎无法找到正确的答案。

再次感谢阅读!

2 个答案:

答案 0 :(得分:1)

实际上你可以有三张桌子: 1.疾病表 2.症状表 3.疾病症状表

1.Illness Table将有IllnessID,Illname 2.Symptom表将具有SymptomID,SymptomName 3.IllnessSymptom表将具有IllnessSymptomID,IllnessID,症状,它将关联疾病和症状

您可以通过加入这些表

来获取API获取数据

所以查询就像

 SELECT I.IllnessName IS
 INNER JOIN Illness I ON IS.IllnessID=I.IllnessID 
 INNER JOIN Symptom S OM IS.SymptonID=S.SymptonID
 WHERE S.SymptomName=@YourInputIllness

希望这能回答您的疑问! :)

答案 1 :(得分:1)

有两种方法可以改善数据库的结构。第一个更简单,但第二个更严格,完全正常化:

方式1

创建疾病表:

CREATE TABLE illness(
    id INTEGER NOT NULL AUTO_INCREMENT,
    illnessName VARCHAR(255) UNIQUE NOT NULL,
    PRIMARY KEY(illnessId)
);

然后创建一个使用每个ilness'在1:n关系中将其与症状相匹配的唯一ID。

CREATE TABLE illness_symptom(
    illnessId INTEGER NOT NULL,
    symptom VARCHAR(255),
    FOREIGN KEY (illnessId) REFERENCES illness(id)ON UPDATE CASCADE ON DELETE CASCADE,
    PRIMARY KEY(illnessId, symptom)
);

双重主键确保同一疾病不会包含两次症状。

症状是一个字符串的事实使它不如下面最好的方法严格:

第2天

illness表保持与第1种方式相同:

CREATE TABLE illness(
id INTEGER NOT NULL AUTO_INCREMENT,
illnessName VARCHAR(255) UNIQUE NOT NULL,
PRIMARY KEY(illnessId)
);

创建一个完整的单独表来存储每个可能的症状:

CREATE TABLE symptom(
    id INTEGER NOT NULL AUTO_INCREMENT,
    symptomName VARCHAR(255) UNIQUE NOT NULL,
    PRIMARY KEY(id)
);

创建第三个表格,该表格将疾病的ID与症状的ID匹配:

CREATE TABLE illness_symptom(
    illnessId INTEGER NOT NULL,
    symptomId INTEGER NOT NULL,
    PRIMARY KEY(illnessId, symptomId),
    FOREIGN KEY(illnessId) REFERENCES illness(id),
    FOREIGN KEY(symptomId) REFERENCES symptom(id)
);

双重主键再次确保疾病不会包含多次相同的症状

修改

创建表格后,您可以加入它们,以便将每种疾病与以下症状相匹配:

SELECT i.id, i.illnessName AS illnessName, s.symptomName AS symptomName
FROM (illness AS i JOIN illness_symptom AS is ON i.id=is.illnessId) JOIN symptom AS s ON is.symptomId=s.id
GROUP BY i.id;

示例输出将是这样的:

1 |支气管炎|闷气

1 |支气管炎|疲劳

1 |支气管炎|胸部的光泽

2 |鞭打|头痛

2 |鞭打| dizzyness

2 |鞭打|集中问题

您可以阅读有关内部联接here

的更多信息