首先感谢您阅读我的问题,希望您能帮助我。
所以我正在创建一个API,以便稍后在我的Android应用程序中使用,但我怀疑我需要创建正在使用的数据库的正确方法。我现在拥有数据库设置的方式是这样的:
但这看起来不太好,并且对我在API中想要做的事情没有帮助。我希望我的用户能够输入症状,然后我的API根据用户的输入输出疾病。
所以,我认为我需要改变我的数据库设计,但它应该是什么样子?过去一天我一直在努力解决这个问题,我似乎无法找到正确的答案。
再次感谢阅读!
答案 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
的更多信息