CHƯƠNG 1 : GIỚI THIỆU VỀ ỨNG DỤNG Hệ thống Quản lý Bệnh viện (Hospital Management System - HMS), được thiết kế để tối ưu hóa việc quản lý thông tin y tế và hành chính trong bệnh viện. Hệ thống lưu trữ, quản lý và theo dõi toàn diện thông tin của nhân viên, bệnh nhân, khoa, thuốc, và các dịch vụ y tế. Với mục tiêu tăng cường hiệu quả hoạt động, ứng dụng cho phép quản lý thông tin bác sĩ, y tá, chuyên khoa, lịch sử làm việc và phân công trách nhiệm. Đồng thời, thông tin bệnh nhân được lưu trữ một cách chi tiết với mã định danh duy nhất, bao gồm hồ sơ y tế, phân loại nội trú/ngoại trú, và chi tiết điều trị.
Ứng dụng còn tích hợp các tính năng quản lý lịch sử khám chữa bệnh, tự động cập nhật tình trạng bệnh nhân (như xuất viện sau khi hồi phục), và theo dõi quá trình sử dụng thuốc, bao gồm thông tin về nhà cung cấp và hạn sử dụng. Đối với thuốc hết hạn, hệ thống sẽ tự động đánh dấu để tránh sử dụng. Ngoài ra, hệ thống cung cấp các báo cáo chi tiết về bệnh nhân, tài nguyên y tế, và trạng thái hoạt động của bệnh viện, hỗ trợ ban quản lý đưa ra quyết định nhanh chóng và chính xác. Với giao diện thân thiện, ứng dụng hướng tới đối tượng sử dụng là nhân viên y tế, quản lý bệnh viện, nhà cung cấp, và bệnh nhân.
Công nghệ hiện đại và khả năng triển khai trên nền tảng web hoặc di động giúp ứng dụng dễ dàng tích hợp và mở rộng, mang lại trải nghiệm vận hành tối ưu cho bệnh viện và nâng cao chất lượng chăm sóc bệnh nhân. 5 Báo cáo đồ án: HOSPITAL DATABASE CHƯƠNG 2 : PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 2. Mô hình nghiệp vụ Một bệnh viện X cần xây dựng hệ thống thông tin quản lý để quản lý thông tin bệnh nhân, bác sĩ và y tá. Cơ sở dữ liệu của bệnh viện X cần lưu trữ thông tin của nhân viên (bác sĩ và điều dưỡng) bao gồm: mã duy nhất, họ tên đầy đủ gồm tên và họ, ngày sinh, giới tính, địa chỉ, ngày bắt đầu (ngày làm việc đầu tiên), số điện thoại và chuyên khoa có tên liên quan và năm cấp bằng.
Bệnh viện có nhiều khoa. Mỗi khoa có một mã duy nhất, một chức danh và một khoa trưởng là bác sĩ. Nhân viên phải thuộc một khoa cụ thể. Một khoa có ít nhất một hoặc nhiều nhân viên.
Trưởng khoa phải có chuyên môn cụ thể và có hơn 5 năm kinh nghiệm kể từ ngày được cấp bằng chuyên môn. Bệnh nhân phải cung cấp cho bệnh viện thông tin của họ như: họ và tên đầy đủ (tên và họ), ngày sinh, giới tính, địa chỉ và số điện thoại. Sau khi nhận được thông tin của họ, hệ thống sẽ lưu trữ chúng vào cơ sở dữ liệu và tạo ra một mã duy nhất để xác định từng bệnh nhân cùng một lúc. Bệnh nhân được chia thành hai loại: bệnh nhân ngoại trú và bệnh nhân nội trú.
Bệnh viện cũng muốn sử dụng hai ký tự đầu tiên để xác định loại bệnh nhân bằng mã duy nhất. Nếu một người là bệnh nhân ngoại trú, mã duy nhất cho người đó bắt đầu bằng "OP", sau đó là bằng 9 chữ số như “OP000000001.” Nếu là bệnh nhân nội trú, mã duy nhất của bệnh nhân đó bắt đầu bằng “IP,” sau đó là 9 chữ số như “IP000000001. Đối với bệnh nhân ngoại trú, cần lưu trữ thông tin của bác sĩ khám. Bệnh nhân ngoại trú có thể khám nhiều lần với bác sĩ khám.
Bệnh viện cần lưu trữ thông tin chi tiết của từng lần khám như: ngày khám, chẩn đoán, ngày khám tiếp theo nếu có, thuốc và lệ phí. Đối với bệnh nhân nội trú, một số thông tin được thêm vào như: ngày nhập viện, bác sĩ điều trị, điều dưỡng chăm sóc, chẩn đoán, phòng bệnh, ngày xuất viện và phí. Sau khi nhập viện, bệnh nhân có thể được điều trị từ ít nhất một bác sĩ. Một bác sĩ có thể điều trị cho nhiều bệnh nhân cùng một lúc, hoặc đôi khi, không có bệnh nhân nào để điều trị.
Bệnh viện cần thông tin chi tiết về từng lần điều trị như: thời gian điều trị (ngày bắt đầu và ngày kết thúc), kết quả và thuốc. Mỗi bệnh nhân nội trú được một y tá chăm sóc; một y tá có thể chăm sóc nhiều bệnh nhân nội trú cùng một lúc. Hơn nữa, khi một bệnh nhân hồi phục và lần điều trị cuối cùng của bệnh nhân đó được bác sĩ xác nhận là “hồi phục”, bệnh 6 Báo cáo đồ án: HOSPITAL DATABASE nhân đó sẽ được xuất viện. Do đó, ngày xuất viện phải được hệ thống ghi lại.
Thông tin về thuốc cũng được lưu trữ trong cơ sở dữ liệu. Thông tin này bao gồm một mã duy nhất, tên thuốc, tác dụng, giá và ngày hết hạn. Một loại thuốc được cung cấp bởi một hoặc nhiều nhà cung cấp và một nhà cung cấp có thể cung cấp nhiều loại thuốc. Một nhà cung cấp được theo dõi bằng số hiệu, tên, địa chỉ và số điện thoại duy nhất của mình.
Hơn nữa, bệnh viện cũng muốn giữ thông tin thuốc nhập khẩu bao gồm ngày nhập khẩu, giá và số lượng. Trong trường hợp một loại thuốc đã hết hạn, nó sẽ tự động được đánh dấu như vậy trong cơ sở dữ liệu. Thiết kế cơ sở dữ liệu 2. Mô hình liên kết thực thể (ER) Hình 1.
Mô hình liên kết thực thể E-R 8 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng USER và ROLES Quan hệ giữa bảng EMPLOYEE và USER Quan hệ giữa bảng EMPLOYEE và DEPARTMENT 9 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng EMPLOYEE và DISTRICT Quan hệ giữa bảng EMPLOYEE và WARD Quan hệ giữa bảng EMPLOYEE và CITY 10 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng DOCTOR và DEPARTMENT Quan hệ giữa bảng DOCTOR và EXAMINATION Quan hệ giữa bảng DOCTOR và ADMISSION 11 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng NURSE và ADMISSION Quan hệ giữa bảng PROVIDER và DISTRICT Quan hệ giữa bảng PROVIDER và CITY Quan hệ giữa bảng PROVIDER và WARD 12 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng PROVIDER và MEDICATION Quan hệ giữa bảng PATIENT và CITY Quan hệ giữa bảng PATIENT và WARD 13 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng PATIENT và DISTRICT Quan hệ giữa bảng WARD và DISTRICT Quan hệ giữa bảng DISTRICT và CITY Quan hệ giữa bảng DEPARTMENT và ROOM 14 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giũa bảng OUTPATIENT và EXAMINATION Quan hệ giữa bảng INPATIENT và ADMISSION Quan hệ giữa bảng EXAMINATION và MEDICATION 15 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng MEDICATION và TREATMENT Quan hệ giữa bảng TREATMENT và TREATMENT_STATUS 16 Báo cáo đồ án: HOSPITAL DATABASE Quan hệ giữa bảng TREATMENT và ADMISSION 2. Mô hình quan hệ Hình 2. Mô hình quan hệ 2. Các bảng dữ liệu vật lý Bảng CITIES CREATE TABLE IF NOT EXISTS `springbootweb`.`cities` ( `city_id` INT NOT NULL AUTO_INCREMENT, `city_code` VARCHAR(10) NOT NULL, `city_name` VARCHAR(100) NOT NULL, `index_id` INT NULL DEFAULT NULL, 17 Báo cáo đồ án: HOSPITAL DATABASE `is_active` BIT(1) NULL DEFAULT NULL, `is_delete` BIT(1) NULL DEFAULT NULL, PRIMARY KEY (`city_id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; Bảng DISTRICT CREATE TABLE IF NOT EXISTS `springbootweb`.`districts` ( `district_id` INT NOT NULL AUTO_INCREMENT, `district_code` VARCHAR(10) NOT NULL, `district_name` VARCHAR(100) NOT NULL, `city_id` INT NULL DEFAULT NULL, `order_id` INT NULL DEFAULT NULL, `dan_so` INT NULL DEFAULT NULL, `is_active` BIT(1) NULL DEFAULT NULL, `is_delete` BIT(1) NULL DEFAULT NULL, PRIMARY KEY (`district_id`), INDEX `FK3g7x8w4lc7qxth7ibrr5j73mn` (`city_id` ASC) , CONSTRAINT `FK3g7x8w4lc7qxth7ibrr5j73mn` FOREIGN KEY (`city_id`) REFERENCES `springbootweb`.`cities` (`city_id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; Bảng WARD CREATE TABLE IF NOT EXISTS `springbootweb`.`wards` ( `ward_id` INT NOT NULL AUTO_INCREMENT, 18 Báo cáo đồ án: HOSPITAL DATABASE `ward_code` VARCHAR(255) NOT NULL, `ward_name` VARCHAR(255) NOT NULL, `district_id` INT NULL DEFAULT NULL, `is_active` BIT(1) NULL DEFAULT NULL, `is_delete` BIT(1) NULL DEFAULT NULL, `order_id` INT NULL DEFAULT NULL, PRIMARY KEY (`ward_id`), INDEX `FKfjqt744bo800mb5uax74lav8k` (`district_id` ASC) , CONSTRAINT `FKfjqt744bo800mb5uax74lav8k` FOREIGN KEY (`district_id`) REFERENCES `springbootweb`.`districts` (`district_id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; Bảng EMPLOYEE CREATE TABLE IF NOT EXISTS `springbootweb`.`employee` ( `id` INT NOT NULL AUTO_INCREMENT, `first_name` VARCHAR(255) NOT NULL, `code` VARCHAR(255) NOT NULL, `last_name` VARCHAR(255) NOT NULL, `dob` DATE NOT NULL, `gender` VARCHAR(255) NOT NULL, `phone_number` VARCHAR(255) NOT NULL, `department_id` INT NOT NULL, `street` VARCHAR(255) NOT NULL, `city_id` INT NULL DEFAULT NULL, `district_id` INT NULL DEFAULT NULL, 19 Báo cáo đồ án: HOSPITAL DATABASE `ward_id` INT NULL DEFAULT NULL, `degree_year` INT NOT NULL, `start_date` DATE NOT NULL, `specialty` VARCHAR(255) NOT NULL, `user_id` INT NULL DEFAULT NULL, `is_active` TINYINT(1) NULL DEFAULT '1', `created_at` DATETIME(6) NULL DEFAULT NULL, `created_by` VARCHAR(255) NULL DEFAULT NULL, `is_deleted` TINYINT(1) NULL DEFAULT '0', `updated_at` DATETIME(6) NULL DEFAULT NULL, `updated_by` VARCHAR(255) NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `UKnbyivu8qgmx0r7wtbplf01gf8` (`code` ASC) VISIBLE, UNIQUE INDEX `phone_number_UNIQUE` (`phone_number` ASC) VISIBLE, UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC) VISIBLE, INDEX `FKigbpniownw9b9to1b3ovhd70f` (`city_id` ASC) VISIBLE, INDEX `FKbejtwvg9bxus2mffsm3swj3u9` (`department_id` ASC) VISIBLE, INDEX `FK7gt4p8et7e09w4odi5ajoyw0r` (`district_id` ASC) VISIBLE, INDEX `FKhoyb92v8jphc9pf5bv9ns4jh7` (`ward_id` ASC) VISIBLE, CONSTRAINT `FK7gt4p8et7e09w4odi5ajoyw0r` FOREIGN KEY (`district_id`) REFERENCES `springbootweb`.`districts` (`district_id`), CONSTRAINT `FKbejtwvg9bxus2mffsm3swj3u9` FOREIGN KEY (`department_id`) 20 Báo cáo đồ án: HOSPITAL DATABASE REFERENCES `springbootweb`.`department` (`id`), CONSTRAINT `FKhal2duyxxjtadykhxos7wd3wg` FOREIGN KEY (`user_id`) REFERENCES `springbootweb`.`users` (`id`), CONSTRAINT `FKhoyb92v8jphc9pf5bv9ns4jh7` FOREIGN KEY (`ward_id`) REFERENCES `springbootweb`.`wards` (`ward_id`), CONSTRAINT `FKigbpniownw9b9to1b3ovhd70f` FOREIGN KEY (`city_id`) REFERENCES `springbootweb`.`cities` (`city_id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; Bảng DOCTOR CREATE TABLE IF NOT EXISTS `springbootweb`.`doctor` ( `id` INT NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `FKrelirtfpv90ue5n7jismnxf6` FOREIGN KEY (`id`) REFERENCES `springbootweb`.`employee` (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; Bảng NURSE CREATE TABLE IF NOT EXISTS `springbootweb`.`nurse` ( `id` INT NOT NULL, PRIMARY KEY (`id`), 21 Báo cáo đồ án: HOSPITAL DATABASE CONSTRAINT `FK4tfs9a53fmepirsr30a931dqd` FOREIGN KEY (`id`) REFERENCES `springbootweb`.`employee` (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; Bảng DEPARTMENT CREATE TABLE IF NOT EXISTS `springbootweb`.`department` ( `id` INT NOT NULL AUTO_INCREMENT, `code` VARCHAR(255) NOT NULL, `doctor_id` INT NOT NULL, `title` VARCHAR(255) NOT NULL, `created_at` DATETIME(6) NULL DEFAULT NULL, `created_by` VARCHAR(255) NULL DEFAULT NULL, `is_deleted` TINYINT(1) NULL DEFAULT '0', `is_active` TINYINT(1) NULL DEFAULT '1', `updated_at` DATETIME(6) NULL DEFAULT NULL, `updated_by` VARCHAR(255) NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `UKq8ymhgj6pt1msox0o3bg51uvo` (`code` ASC) VISIBLE, UNIQUE INDEX `doctor_id_UNIQUE` (`doctor_id` ASC) VISIBLE, INDEX `FKg72fcdoas3uuljy08ugxafh6b_idx` (`doctor_id` ASC) VISIBLE, CONSTRAINT `FKg72fcdoas3uuljy08ugxafh6b` FOREIGN KEY (`doctor_id`) REFERENCES `springbootweb`.`doctor` (`id`) ON DELETE NO ACTION 22 Báo cáo đồ án: HOSPITAL DATABASE ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci Bảng ROOM CREATE TABLE IF NOT EXISTS `springbootweb`.`room` ( `room_no` INT NOT NULL AUTO_INCREMENT, `capacity` INT NOT NULL, `room_name` VARCHAR(255) NOT NULL, `depart_id` INT NOT NULL, PRIMARY KEY (`room_no`), INDEX `FKaq2gdhj8qswr3b1l40qu9wlt` (`depart_id` ASC) VISIBLE, CONSTRAINT `FKaq2gdhj8qswr3b1l40qu9wlt` FOREIGN KEY (`depart_id`) REFERENCES `springbootweb`.`department` (`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci Bảng USERS CREATE TABLE IF NOT EXISTS `springbootweb`.