数据库课程设计 医院管理系统 SQL_医院数据库管理系统


一、背景资料需求分析

某医院希望建立数据库来管理其主要业务信息业务规则如下
1一个科室有多个病房多个医生
2一个病房属于一个科室
3一个医生只能属于一个科室但可负责多个病人的诊治
4一个病人的主管医生只有一人

二、功能模块

1、基本信息管理模块
1科室基本信息的录入删除修改查询。
其中基本信息包括科名科地址科电话主任医生姓名等信息
2病房基本信息的录入删除修改查询。
其中基本信息包括病房号床位号所属科室名等信息
3医生基本信息的录入删除修改查询。
其中基本信息包括姓名职称所属科室名年龄工作证号等信息
4病人基本信息的录入删除修改查询。
其中基本信息包括病历号姓名性别诊断主管医生病房号等信息。
2、业务功能模块
1信息查询模块
病人信息查询
医生工作情况查询
查询负责病人最多的前 10 个的医生信息及其负责病人的个数
查询负责病人最多的前 10 个的科室信息及其负责病人的个数
2费用计算模块
住院所需费用计算

三、功能设计说明书(要求详细描述各模块功能给出模块结构图SC图

在这里插入图片描述
业务功能模块设计说明
1信息查询模块
病人信息查询设计一个存储过程以病历号作为输入参数检索病人的情况包括病人病历号病人姓名、主治医生姓名诊断结果病房号和病床号。
医生工作情况查询设计一个存储过程检索每一位医生的工作情况包括医生工作证号负责的病人姓名没有治疗过任何病人的医生也应出现在结果中。
查询医生负责的病人人数查询负责病人最多的前 10 个的医生信息及其负责的病人个数
查询科室负责的病人人数查询负责病人最多的前 10 个的科室信息及其负责病人的个数
2费用计算模块
住院费用出院日期-入院日期* 病房收费标准。
设置存储过程输入病人病历号和出院日期计算住院费用。显示病历号病人姓名住院时间病房收费标准住院费用。

四、数据库设计

1、概念模型ER图

在这里插入图片描述

2、逻辑模型

(1) 基础逻辑模型(实体-联系转换的对应表写出关系模式,标出主码)
实体表ER图中的方块
1-1 病人表病历号姓名性别诊断结果病房号病床号入院日期主治医师
1-2 医生表工作证号姓名职称所属科室名年龄
1-3 科室表科名科电话科地址主任医生姓名
1-4 病房表病房号所属科室名收费标准床位总数已使用床位数
联系表ER图中的菱形
2-1 属于表工作证号科名
2-2 包含表病房号科名
2-3 入住表病历号病房号
2-4 诊治病历号工作证号
(2)数据库优化分析和说明包括关系模式的合并和范式检查
2.1关系模式合并
1.病人表和入住表和诊治表的主码相同可以将三个表进行合并
合并后的复合表
3-1病人表病历号姓名性别诊断结果病房号病床号入院日期主治医生
2.医生表和属于表的主码相同将两个表进行合并
合并后的复合表
3-2 医生表工作证号姓名职称所属科室名年龄
3.病房表和包含表的主码相同将两个表进行合并
合并后的复合表
3-3 病房表病房号所属科室名收费标准床位总数已使用床位数
在这里插入图片描述

五、建表以及sql语句

1病人表

病历号姓名性别诊断结果病房号病床号入院日期出院日期工作证号
在这里插入图片描述
表语句

create table patient(
	Patient_no varchar(50) primary key,
	Patient_name varchar(50) NULL,
	Patient_sex varchar(50) NULL,
	Patient_result varchar(50),
	Patient_roomno varchar(50),
	Patient_bedno varchar(50),
	Patient_intime date,
	Patient_doctor varchar(50),
	foreign key (Patient_doctor) references doctor(doctor_no),
	foreign key (Patient_roomno) references room(room_no));

2医生表

工作证号姓名职称所属科室名年龄
在这里插入图片描述
表语句

create table doctor(
	doctor_no varchar(50) primary key,
	doctor_name varchar(50),
	doctor_post varchar(50),
	doctor_office varchar(50),
	doctor_age int,
	foreign key (doctor_office) references office(office_name));

3科室表

科名科电话科地址主任医生姓名
在这里插入图片描述
表语句

create table office (
	office_name varchar(50) primary key,
	office_phone varchar(50),
	office_address varchar(50),
	office_leader varchar(50));

4病房表

病房号所属科室名收费标准, 总床位数已使用床位数
在这里插入图片描述
表语句

create table room(
	room_no varchar(50) primary key,
	room_office varchar(50),
	room_money varchar(50),
	room_bed int,
	room_usebed int,
	foreign key (room_office) references office(office_name));

六、功能模块详细设计

1、存储过程1病人信息查询

Create procedure patient_info(no varchar(50))
Begin
Select patient.panient_no,patient.patient_name,doctor.doctor_name,patient.patient_result,patient.patient_roomno,patient.patient_bedno 
from patient,doctor 
where patient.patient_no=no and patient.patient_doctor=doctor.doctor_no;
End

2、 存储过程2医生工作情况查询

Create procedure doctor_work()
Begin
Select doctor.doctor_no,doctor.doctor_name,patient.patient_name from doctor left join patient on patient.patient_doctor=doctor.doctor_no;
End

3、 存储过程3查询医生负责的病人人数

Create procedure doctor_front10()
Begin
Select doctor.*,count(doctor.doctor_no) from patient,doctor where patient.patient_doctor=doctor.doctor_no
Group by doctor.doctor_no
Order by count(doctor.doctor_no) desc
Limit 0,10;
End

4、 存储过程4查询科室负责的病人人数

Create procedure office_front10()
Begin
Select office.*,countn(doctor.doctor_no)
From office,doctor,patient
Where patient.patient.doctor=doctor.doctor_no and office.office_name=doctor.doctor_office
Group by office.office_name
Order by count(doctor.doctor_no) desc
Limit 0,10;
End

5、存储过程5费用计算

Create procedure cost(no varchar(50),out_time date)
Begin
Declare cost int;
Declare in_time date;
Declare days int;
Declare name varchar(50);
Declare value int;

Select patient_name into name from patient where patient_no=no;
Select patient_intime into in_time from patient where patient_no=no;
Select room.room_money into value from patient,room 
where patient.patient_no=no and patient.patient_roomno=room.room_no;

set days=datediff(out_time,in_time);
set cost=days*value;

select no,name,days,value,cost;
end

触发器1当有新病人入住时相应病房的已使用床位数加一

Create trigger in_hospital
After insert on patient
For each row

Begin
Update room set room_usebed=room_usebed+1 where room_no=new.patient_roomno;
End

触发器2当有病人出院时相应病房的已使用床位数减一

Create trigger out_hospital
After delete on patient
For each row

Begin
Update room set room_usebed=room_usebed-1 where room_no=old.patient_roomno;
End

七、测试结果

稍微放两个
调用存储过程4查询科室负责的病人人数
在这里插入图片描述
调用存储过程5费用计算
在这里插入图片描述


总结

实现的功能相对简单有待完善
基本上只要ER图画好后续功能的实现还是比较容易的

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 数据库