Какой лучший способ нормализовать эту базу данных?
Прежде всего, спасибо за чтение моей проблемы, и я надеюсь, что вы можете мне помочь.
Поэтому я создаю 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
Надеюсь, что это отвечает на ваш запрос!:)