系统定制开发数据库课程设计 医院管理系统 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 病房表(病房号,所属科室名,收费标准,床位总数,已使用床位数)

五、建表以及

(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));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(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));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)科室表

(科名,科电话,科地址,主任医生姓名)

表语句:

create table office (	office_name varchar(50) primary key,	office_phone varchar(50),	office_address varchar(50),	office_leader varchar(50));
  • 1
  • 2
  • 3
  • 4
  • 5

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

六、功能模块详细设计

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

Create procedure patient_info(no varchar(50))BeginSelect 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

Create procedure doctor_work()BeginSelect doctor.doctor_no,doctor.doctor_name,patient.patient_name from doctor left join patient on patient.patient_doctor=doctor.doctor_no;End
  • 1
  • 2
  • 3
  • 4

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

Create procedure doctor_front10()BeginSelect doctor.*,count(doctor.doctor_no) from patient,doctor where patient.patient_doctor=doctor.doctor_noGroup by doctor.doctor_noOrder by count(doctor.doctor_no) descLimit 0,10;End
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

Create procedure office_front10()BeginSelect office.*,countn(doctor.doctor_no)From office,doctor,patientWhere patient.patient.doctor=doctor.doctor_no and office.office_name=doctor.doctor_officeGroup by office.office_nameOrder by count(doctor.doctor_no) descLimit 0,10;End
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5、存储过程5:费用计算

Create procedure cost(no varchar(50),out_time date)BeginDeclare 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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

Create trigger in_hospitalAfter insert on patientFor each rowBeginUpdate room set room_usebed=room_usebed+1 where room_no=new.patient_roomno;End
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

Create trigger out_hospitalAfter delete on patientFor each rowBeginUpdate room set room_usebed=room_usebed-1 where room_no=old.patient_roomno;End
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

七、测试结果

稍微放两个
调用存储过程4:查询科室负责的病人人数

调用存储过程5:费用计算


总结

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发