规范此数据库的最佳方法是什么?

What's the best way to normalise this database?

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

所以我正在创建一个 API 稍后在我的 Android 应用程序中使用,但我对创建数据库所需的正确方法存疑一起工作。我现在设置数据库的方式是这样的:

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

所以,我想我需要更改我的数据库设计,但它应该是什么样子的?在过去的一天里,我一直在为这个问题苦苦挣扎,但我似乎找不到正确的答案。

再次感谢阅读!

实际上您可以拥有三个 table: 1. 疾病 Table 2. 症状 Table 3. 疾病症状 Table

1.Illness Table 会有 IllnessID,Illname 2.Symptom table 将有 SymptomID、SymptomName 3.IllnessSymptom Table 将有 IllnessSymptomID,IllnessID,Symptom 将关联疾病和症状

您可以通过加入这些 table

让您的 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

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

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

方式一

制造疾病table:

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

然后创建一个 table,它使用每个疾病的唯一 ID 将其与其症状在 1:n 关系中匹配。

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

illnesstable与方式一相同:

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

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

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

创建第三个 table 将疾病 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)
);

双主键再次确保一种疾病不会多次出现相同的症状

编辑

创建 tables 后,您可以加入他们,将每种疾病与其症状相匹配,如下所示:

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 |鞭打 |头晕

2 |鞭打 |注意力不集中


您可以阅读有关内部联接的更多信息here