Добавлен: 06.11.2023
Просмотров: 16
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Задача состоит в создании базы данных «ГИБДД» для информационно-справочной системы которая будет обеспечивать хранение данных о расписании приема врачей и записи пациентов на прием. База данных должна учитывать особенности работы поликлиники, такие как: врачи специалисты и участковые врачи, расписания врачей, которые не меняются на протяжении недели, работа врачей в две смены, разбитие приема на интервалы, кабинеты, в которых работают врачи в разное время, учет предоставленных услуг, медицинская страховка пациентов. Информационная система должна предоставлять возможность пациентам записаться на прием к врачу, а также врачам просмотреть очередность записанных пациентов. Администрация должна иметь доступ к данным о количестве пациентов, записавшихся и пришедших на прием, а также к сведениям о загрузке кабинетов и врачей. ER diagram
Таблицы
Ограничения целостности данных
1 Ограничение NOT NULL: Это ограничение гарантирует, что в столбцах, помеченных как NOT NULL, не будет храниться NULL-значение.
2 Ограничение UNIQUE: Это ограничение гарантирует, что значения в указанных столбцах уникальны.
3 Ограничение PRIMARY KEY: Это ограничение гарантирует, что значения в указанном столбце уникальны и не могут быть NULL.
4 Ограничение FOREIGN KEY: Это ограничение гарантирует, что значения в указанном столбце ссылаются на значения в столбце первичного ключа другой таблицы.
5 Ограничение CHECK: Это ограничение гарантирует, что значения в указанном столбце соответствуют определенным условиям
Индексы
Индекс на поле Doctor_ID в таблице Appointments:
CREATE INDEX idx_appointments_doctor_id ON Appointments (Doctor_ID);
Индекс на поля Last_Name и First_Name в таблице Patients:
CREATE INDEX idx_patients_last_name_first_name ON Patients (Last_Name, First_Name);
Индекс на поле Cabinet_Number в таблице Appointment_Intervals:
CREATE INDEX idx_appointment_intervals_cabinet_number ON Appointment_Intervals (Cabinet_Number);
Индекс на поля Appointment_Date и Doctor_ID в таблице Appointments:
CREATE INDEX idx_appointments_appointment_date_doctor_id ON Appointments (Appointment_Date, Doctor_ID);
Индекс на поле Schedule_ID в таблице Doctors:
CREATE INDEX idx_doctors_week_schedule_id ON Doctors (Week_Schedule_ID);
Индекс на поле Service_ID в таблице Appointments:
CREATE INDEX idx_appointments_service_id ON Appointments (Service_ID);
Индекс на поле Area_Number в таблице Local_Doctor_Area:
CREATE INDEX idx_local_doctor_area_area_number ON Local_Doctor_Area (Area_Number);
Индекс на поле Doctor_ID в таблице Week_Schedule:
CREATE INDEX idx_week_schedule_doctor_id ON Week_Schedule (Doctor_ID);
Индекс на поле Cabinet_Name в таблице Cabinets:
CREATE INDEX idx_cabinets_cabinet_name ON Cabinets (Cabinet_Name);
Индекс на поля Appointment_Date и Is_Free в таблице Appointments:
CREATE INDEX idx_appointments_appointment_date_is_free ON Appointments (Appointment_Date, Is_Free);
триггеры для базы данных «ГИБДД»:
1 Триггер для автоматической генерации ID записей приема:
CREATE TRIGGER trg_generate_appointment_id
BEFORE INSERT ON Appointments
FOR EACH ROW
BEGIN
SET NEW.Appointment_ID = CONCAT('AP', LPAD((SELECT COUNT(*) + 1 FROM Appointments), 5, '0'));
END
2 Триггер для удаления связанных записей при удалении врача:
CREATE TRIGGER trg_delete_related_data_on_doctor_delete
BEFORE DELETE ON Doctors
FOR EACH ROW
BEGIN
DELETE FROM Week_Schedule WHERE Doctor_ID = OLD.Doctor_ID;
DELETE FROM Appointment_Intervals WHERE Doctor_ID = OLD.Doctor_ID;
DELETE FROM Appointments WHERE Doctor_ID = OLD.Doctor_ID;
END
3 Триггер для обновления статистики приема пациентов при добавлении новой записи на прием:
CREATE TRIGGER trg_update_statistics_on_appointment_insert
AFTER INSERT ON Appointments
FOR EACH ROW
BEGIN
UPDATE Statistics SET
Appointments_Count = Appointments_Count + 1,
Cabinets_Load = (
SELECT
COUNT(*)
FROM
Appointments
WHERE
Appointment_Date = NEW.Appointment_Date
AND Cabinet_Number = NEW.Cabinet_Number
),
Doctors_Load = (
SELECT
COUNT(*)
FROM
Appointments
WHERE
Appointment_Date = NEW.Appointment_Date
AND Doctor_ID = NEW.Doctor_ID
)
WHERE
Date = NEW.Appointment_Date;
END
Таблицы
Ограничения целостности данных
1 Ограничение NOT NULL: Это ограничение гарантирует, что в столбцах, помеченных как NOT NULL, не будет храниться NULL-значение.
2 Ограничение UNIQUE: Это ограничение гарантирует, что значения в указанных столбцах уникальны.
3 Ограничение PRIMARY KEY: Это ограничение гарантирует, что значения в указанном столбце уникальны и не могут быть NULL.
4 Ограничение FOREIGN KEY: Это ограничение гарантирует, что значения в указанном столбце ссылаются на значения в столбце первичного ключа другой таблицы.
5 Ограничение CHECK: Это ограничение гарантирует, что значения в указанном столбце соответствуют определенным условиям
Индексы
Индекс на поле Doctor_ID в таблице Appointments:
CREATE INDEX idx_appointments_doctor_id ON Appointments (Doctor_ID);
Индекс на поля Last_Name и First_Name в таблице Patients:
CREATE INDEX idx_patients_last_name_first_name ON Patients (Last_Name, First_Name);
Индекс на поле Cabinet_Number в таблице Appointment_Intervals:
CREATE INDEX idx_appointment_intervals_cabinet_number ON Appointment_Intervals (Cabinet_Number);
Индекс на поля Appointment_Date и Doctor_ID в таблице Appointments:
CREATE INDEX idx_appointments_appointment_date_doctor_id ON Appointments (Appointment_Date, Doctor_ID);
Индекс на поле Schedule_ID в таблице Doctors:
CREATE INDEX idx_doctors_week_schedule_id ON Doctors (Week_Schedule_ID);
Индекс на поле Service_ID в таблице Appointments:
CREATE INDEX idx_appointments_service_id ON Appointments (Service_ID);
Индекс на поле Area_Number в таблице Local_Doctor_Area:
CREATE INDEX idx_local_doctor_area_area_number ON Local_Doctor_Area (Area_Number);
Индекс на поле Doctor_ID в таблице Week_Schedule:
CREATE INDEX idx_week_schedule_doctor_id ON Week_Schedule (Doctor_ID);
Индекс на поле Cabinet_Name в таблице Cabinets:
CREATE INDEX idx_cabinets_cabinet_name ON Cabinets (Cabinet_Name);
Индекс на поля Appointment_Date и Is_Free в таблице Appointments:
CREATE INDEX idx_appointments_appointment_date_is_free ON Appointments (Appointment_Date, Is_Free);
триггеры для базы данных «ГИБДД»:
1 Триггер для автоматической генерации ID записей приема:
CREATE TRIGGER trg_generate_appointment_id
BEFORE INSERT ON Appointments
FOR EACH ROW
BEGIN
SET NEW.Appointment_ID = CONCAT('AP', LPAD((SELECT COUNT(*) + 1 FROM Appointments), 5, '0'));
END
2 Триггер для удаления связанных записей при удалении врача:
CREATE TRIGGER trg_delete_related_data_on_doctor_delete
BEFORE DELETE ON Doctors
FOR EACH ROW
BEGIN
DELETE FROM Week_Schedule WHERE Doctor_ID = OLD.Doctor_ID;
DELETE FROM Appointment_Intervals WHERE Doctor_ID = OLD.Doctor_ID;
DELETE FROM Appointments WHERE Doctor_ID = OLD.Doctor_ID;
END
3 Триггер для обновления статистики приема пациентов при добавлении новой записи на прием:
CREATE TRIGGER trg_update_statistics_on_appointment_insert
AFTER INSERT ON Appointments
FOR EACH ROW
BEGIN
UPDATE Statistics SET
Appointments_Count = Appointments_Count + 1,
Cabinets_Load = (
SELECT
COUNT(*)
FROM
Appointments
WHERE
Appointment_Date = NEW.Appointment_Date
AND Cabinet_Number = NEW.Cabinet_Number
),
Doctors_Load = (
SELECT
COUNT(*)
FROM
Appointments
WHERE
Appointment_Date = NEW.Appointment_Date
AND Doctor_ID = NEW.Doctor_ID
)
WHERE
Date = NEW.Appointment_Date;
END