【分享】医疗场景下的数据库构建实践

举报
yd_265102352 发表于 2023/12/07 16:02:38 2023/12/07
【摘要】 记录了数据库实践课程设计的一个案例

案例:医院人事系统

每个科室有多名医生,每名医生只能在一个科室中工作。每名医生可以参加多个医药科研项目,每个医药科研项目可以由多名医生参加。每个医药科研项目由一名医生担任总负责人,一名医生可以负责多个医药科研项目。每名医生参加某医药科研项目,都有“项目职责”和“每年投入几个月”这两个信息。其他相关信息包括:
科室:科室编号、科室描述
医生:工号、姓名、性别、出生日期、进入医院工作日期、职称
医药科研项目:项目编号、项目名称、项目简述

1. ER图绘制

省略了部分属性,用下划线标注了主键。其中,由于将职责这一实体认定为弱实体,因此没有标注主键,但在具体实现时,会通过添加工号和项目编号这两个属性来将职责和医生和项目对应起来):

2. 将ER图转换为关系模式,注明关系的属性、主键和外键。

Department(Dept dept_number, Dept dept_description, Dept doct_num)  #科室编号,科室描述,医生数量
Doctor(Dct doct_id, Dct doct_name, Dept dept_number, Dct doct_gender, Dct doct_birthday, Dct doct_work_began_date, Dct doct_title) 
#医生编号,医生姓名,科室编号,性别,出生日期,进入医院工作日期、职称
Duty(Dct doct_id, Proj proj_id, Duty proj_duty, Duty worktime) #医生编号,项目编号,项目职责,每年投入几个月
Project(Proj proj_id, Proj proj_name, Proj proj_description, Proj proj_leader) #项目编号、项目名称、项目简述,负责人姓名

3. 建立的数据库中定义成视图、存储过程、触发器或函数

通过华为云GaussDB for MySQL平台进行数据库搭建。

首先,点击控制台,选择区域和项目:

接着,在页面左上角单击服务列表,选择“数据库 > 云数据库 GaussDB”。进入云数据库 GaussDB信息页面:

在左侧导航栏选择GaussDB > 实例管理,就可以进入GaussDB信息页面。

通过个人账号按需购买GaussDB数据库,然后等待数据库初始化后登陆,测试连接成功后进入数据库。

【1】视图

功能描述:显示所有担任项目负责人的医生的姓名,工作年限,职称,所在科室

SQL代码:

CREATE view proj_leader as
SELECT `user019db`.`project`.`proj_name` AS `proj_name`,`user019db`.`project`.`proj_leader` AS `项目领导人`,timestampdiff(YEAR,`user019db`.`doctor`.`doct_work_began_date`,now()) AS `工作年限`,`user019db`.`doctor`.`doct_title` AS `职称`,`user019db`.`doctor`.`dept_number` AS `科室编号` 
FROM (`user019db`.`project` join `user019db`.`doctor`) 
WHERE (`user019db`.`project`.`proj_leader` = `user019db`.`doctor`.`doct_name`)

华为云GaussDB执行效果:

【2】存储过程

功能描述:

创建存储过程UpdateDoctorTitle,该存储过程更新doctor表中的职称(doct_title),根据医生的入职时间做不同的更新操作,使用游标:

  1. 对入职时间在2010-01-01之前(含)的,如果之前的职称是副主任医师则设置医生的职称(doct_title)为主任医师;

  2. 对入职时间在2018-01-01之前(含)的,如果之前的职称是实习医师则设置医生的职称(doct_title)为普通医生;

SQL代码:

CREATE PROCEDURE `UpdateDoctorTitle`()
BEGIN
DECLARE d_id INT;
DECLARE work_date DATE;
DECLARE title VARCHAR(255);
DECLARE cur CURSOR FOR SELECT a.doct_work_began_date, a.doct_title, a.doct_id FROM doctor a;
DECLARE exit HANDLER FOR NOT FOUND CLOSE cur;
OPEN cur;
REPEAT
FETCH cur INTO work_date, title, d_id;
IF(work_date<='2010-01-01' and title = '副主任医师') THEN SET title = '主任医师';
ELSEIF(work_date<='2018-01-01' and title = '实习医师') THEN SET title = '普通医生';
END IF;
UPDATE doctor SET doct_title=title WHERE doct_id=d_id;
UNTIL 0 END REPEAT;
END

华为云GaussDB执行效果:

【3】触发器

功能描述:

当有新增的医生后,科室内的医生数量对应更新

SQL代码:

DELIMITER $$
CREATE DEFINER=`DB_USER019`@`%` TRIGGER `UpdateDoctNum` AFTER INSERT ON `doctor` FOR EACH ROW begin
    UPDATE department SET doct_num=(SELECT count(*) FROM doctor WHERE new.dept_number=dept_number) WHERE dept_number=new.dept_number;
end $$
DELIMITER ;

华为云GaussDB执行效果:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。