Какой лучший способ нормализовать эту базу данных?

Прежде всего, спасибо за чтение моей проблемы, и я надеюсь, что вы можете мне помочь.

Поэтому я создаю API для использования позже в своем приложении для Android, но у меня есть сомнения относительно правильного способа создания базы данных, с которой я работаю. То, как я сейчас настроил базу данных, выглядит так:

Но это не выглядит хорошо и не помогает с тем, что я хочу сделать в моем API. Я хочу, чтобы мои пользователи могли вводить симптомы, а затем мой API выводил болезни на основе данных пользователей.

Итак, я думаю, что мне нужно изменить дизайн базы данных, но как это должно выглядеть? Я боролся за это в течение прошлого дня, и я не могу найти правильный ответ.

Еще раз спасибо за чтение!

2 ответа

Решение

Есть два способа улучшить структуру вашей базы данных. Первый проще, а второй более строгий и полностью нормализованный:

Способ 1

Создать таблицу заболеваний:

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

Затем создайте таблицу, которая использует уникальный идентификатор каждого ilness, чтобы сопоставить его с симптомами в отношении 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

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)
);

Создайте третью таблицу, которая соответствует идентификатору болезни и идентификатору симптома:

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 | Хлыст | головокружение

2 | Хлыст | проблемы с концентрацией


Вы можете прочитать больше о внутреннем соединении здесь

На самом деле у вас может быть три таблицы: 1. Таблица болезней 2. Таблица симптомов 3. Таблица болезней

Таблица 1. Illness будет иметь IllnessID,Illname 2. Таблица симптомов будет иметь 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

Надеюсь, что это отвечает на ваш запрос!:)

Другие вопросы по тегам