数据库课设项目(下) 医护人员与患者
文章目录
- 任务
- 过程
- 随机身份数据
- CREATE TABLE Resident
- python代码打印SQL语句
- 实现结果
- 医生信息
- CREATE TABLE Doctor
- 导入数据
- “升职”
- “排班”
- 最终结果
- 患者信息
- CREATE TABLE Patient
- 消费记录
- CREATE TABLE Tally
- 患者操作
- 注册
- CREATE PROC proc_register
- 实现展示
- 充值
- CREATE PROC proc_deposit
- 实现展示
- 消费
- CREATE PROC proc_charge
- 注销
- CREATE PROC proc_logout
- 实现展示
- 总结
任务
接上篇:数据库课设项目(上) 医院。本篇完成需求中的医护人员与患者信息与活动。
最终会将完整项目代码上传至GitHub仓库。
过程
随机身份数据
为了快速将数据导入数据库中测试代码效果,在GitHub上找到随机生成身份信息的项目:https://github.com/gh0stkey/RGPerson,是python代码,运行效果如下:
这里要推荐一下运行python代码的利器JupyterLab, 之前简单写了一下基本的使用方法:JupyterLab入门应用
我们查看一下主函数:
if __name__ == '__main__': age = random.randint(16,60) #可调整生成的年龄范围(身份证),这边是16-60岁gender = random.randint(0,1)sex = u"男" if gender == 1 else u"女"print("姓名: {0}\n年龄: {1}\n性别: {2}\n身份证: {3}\n手机号: {4} {5}\n组织机构代码: {6}\n统一社会信用代码: {7}\n单位性质: {8}".format(genName(), age, sex, genIdCard(age, gender), list(genMobile().keys())[0], list(genMobile().values())[0], genOrgCode(), list(genCreditCode().keys())[0], list(genCreditCode().values())[0]))
那我们就可以根据这个随机生成的信息建表,如下:
CREATE TABLE Resident
CREATE TABLE Resident(
姓名 nvarchar(20) NULL,
年龄 tinyint NULL CONSTRAINT cc_age CHECK( 年龄>0 and 年龄<120) ,
性别 nvarchar(4) NULL,
身份证 char(18) NOT NULL,
手机号 char(11) NULL,
运营商 varchar(20) NULL,
组织机构代码 varchar(40) NULL,
统一社会信用代码 varchar(20) NULL,
单位性质 nvarchar(20) NULL,
CONSTRAINT pk_resident PRIMARY KEY( 身份证)
)
python代码打印SQL语句
为了方便插入数据,我们一方面通过循环获取多条随机身份信息;另一方面直接以SQL语句的格式输出,便可以直接通过复制粘贴放到SQL中执行。修改后的主函数如下:
if __name__ == '__main__':
for i in range(1000):age = random.randint(16,60) #可调整生成的年龄范围(身份证),这边是16-60岁gender = random.randint(0,1)sex = u"男" if gender == 1 else u"女"print("INSERT INTO Resident VALUES ('{0}',{1} ,'{2}','{3}','{4}','{5}','{6}','{7}','{8}')".format(genName(), age, sex, genIdCard(age, gender), list(genMobile().keys())[0], list(genMobile().values())[0], genOrgCode(), list(genCreditCode().keys())[0], list(genCreditCode().values())[0]))
打印结果如下:
此外,为符合医疗场景,我们将单位性质生成函数作如下修改,把原本为其他的一些条目改为医护工作者:
实现结果
最终导入数据库中执行语句如下:
医生信息
CREATE TABLE Doctor
doctor (ID, position, workday,hospitalName, workDeptName,directDeptNumber)
CREATE TABLE Doctor
(
ID char(18) NOT NULL ,
position nvarchar(20) NULL,
workday nvarchar(20) NULL,
hospitalName nvarchar(40) NOT NULL ,
workDeptNumber int NOT NULL,
directDeptNumber int NULL, CONSTRAINT pk_doctor PRIMARY KEY(ID,workDeptNumber,hospitalName),CONSTRAINT fk_doctor_ID FOREIGN KEY(ID)REFERENCES Resident(身份证) ON DELETE CASCADE,CONSTRAINT fk_doctor_workDept FOREIGN KEY(workDeptNumber,hospitalName)REFERENCES Department(number,hospitalName) ON DELETE CASCADE
)
GO
导入数据
为简化过程,我们把此数据库中所有的医护工作者都分配到同一家医院。并采用随机函数rand()
将他们随机分配至不同科室。
INSERT INTO Doctor (ID ,position,hospitalName,workDeptNumber)
SELECT 身份证,substring(单位性质,4,len(单位性质)),hospitalName,number
FROM Department ,Resident
WHERE
hospitalName='河北大学附属医院' and
convert(int,substring(身份证,10,3))%11+1=number and
单位性质 like '医院%'
“升职”
我们默认主任医师都是所在科室的管理者
UPDATE Doctor SET directDeptNumber=workDeptNumber
WHERE position='主任医师'
“排班”
设定几个工作时间,用临时表存储,通过随机函数安排!
CREATE TABLE #workday
(
code int IDENTITY PRIMARY KEY,
workday nvarchar(20)
)
INSERT INTO #workday VALUES( '一、三、五'),( '二、四、六'),('三、日'),('四、日')
UPDATE Doctor SET workday=#workday.workday
FROM Doctor,#workday
WHERE
convert(int,substring(ID,10,3))%4+1=code
最终结果
患者信息
CREATE TABLE Patient
Patient( ID ,hospitalName, 卡号 ,注册时间)
CREATE TABLE Patient
(
ID char(18) NOT NULL ,
hospitalName nvarchar(40) NOT NULL,
卡号 nvarchar(40) NULL,
注册时间 datetime default getdate(),
CONSTRAINT pk_patient PRIMARY KEY(ID,hospitalName),
CONSTRAINT fk_patient_ID FOREIGN KEY(ID)REFERENCES Resident(身份证) ON DELETE CASCADE,
CONSTRAINT fk_patient_hospital FOREIGN KEY(hospitalName)REFERENCES Hospital(医院名称) ON DELETE CASCADE
)
消费记录
CREATE TABLE Tally
Tally( hospitalName(医院) ,卡号 ,金额 ,时间, departmentNumber(柜台:充值处/科室))
CREATE TABLE Tally
(
hospitalName nvarchar(40) NOT NULL,
卡号 nvarchar(40) NOT NULL,
金额 money NULL,
时间 datetime default getdate(),
departmentNumber int NOT NULL,
CONSTRAINT pk_tally PRIMARY KEY(departmentNumber,hospitalName,卡号,时间),
CONSTRAINT fk_tally_department FOREIGN KEY(departmentNumber,hospitalName)REFERENCES Department(number,hospitalName) ON DELETE CASCADE,
)
患者操作
如之前所述,我们通过存储过程 PROCEDURE实现,其实与编程语言中的函数概念相似,一旦生成,可以反复调用。
存储过程例题分析:数据库每日一题 (4)存储过程
注册
CREATE PROC proc_register
/**************注册******************/
--提供个人姓名与身份证号与所在医院即可注册(选取Resident表中的数据)
CREATE PROC proc_register
@name nvarchar(20),
@ID char(18),
@hospitalName nvarchar(40)
AS
SET nocount ON --不返回计数
BEGINif exists(SELECT * FROM Resident WHERE 身份证=@ID and 姓名=@name)BEGINif exists(SELECT * FROM Patient WHERE ID=@ID)print @ID+'already registered'else BEGINDECLARE @hospitalNumber intSELECT @hospitalNumber=ROW_NUMBER() over(order by 医院名称 desc)FROM HospitalINSERT INTO Patient(ID,hospitalName,卡号)VALUES(@ID,@hospitalName,convert(nvarchar(4),@hospitalNumber)+@ID)ENDEND
END
实现展示
SELECT * FROM Patient
EXECUTE proc_register '郝掂','340321196507203290','河北大学附属医院'
SELECT * FROM Patient
充值
我们默认充值是从收费部进行,通过字符匹配找到相应的部门编号。WHERE hospitalName=@hospitalName and name like '%费%' or name like '%值%'
CREATE PROC proc_deposit
CREATE PROC proc_deposit
@hospitalName nvarchar(40),
@cardNumber nvarchar(40),
@money money
AS
SET nocount ON --不返回计数
BEGINif exists (SELECT * FROM Patient WHERE 卡号=@cardNumber) BEGINDECLARE @departmentNumber intSELECT @departmentNumber=number FROM departmentWHERE hospitalName=@hospitalName andname like '%费%' or name like '%值%'-- SELECT @departmentNumberINSERT INTO Tally(hospitalName,卡号,金额,departmentNumber) VALUES(@hospitalName,@cardNumber,@money,@departmentNumber)END
END
实现展示
SELECT * FROM TALLY
EXECUTE proc_deposit '河北大学附属医院','5340321196507203290',100
SELECT * FROM TALLY
消费
消费与充值基本一致,只是需要提供消费的部门名称
CREATE PROC proc_charge
CREATE PROC proc_charge
@hospitalName nvarchar(40),
@cardNumber nvarchar(40),
@money money,
@departmentName nvarchar(20)
AS
SET nocount ON --不返回计数
BEGINif exists (SELECT * FROM Patient WHERE 卡号=@cardNumber) BEGINDECLARE @departmentNumber intSELECT @departmentNumber=number FROM departmentWHERE hospitalName=@hospitalName andname = @departmentName -- SELECT @departmentNumberINSERT INTO Tally(hospitalName,卡号,金额,departmentNumber) VALUES(@hospitalName,@cardNumber,@money,@departmentNumber)END
END
GO
注销
注销就相对简单,提供必要的信息,删除注册记录。
CREATE PROC proc_logout
CREATE PROC proc_logout
@name nvarchar(20),
@ID char(18),
@hospitalName nvarchar(40)
AS
SET nocount ON --不返回计数
BEGINif exists(SELECT * FROM Resident WHERE 身份证=@ID and 姓名=@name)BEGINDELETE FROM PatientWHERE ID =@ID andhospitalName=@hospitalNameEND
END
GO
实现展示
SELECT * FROM PATIENT
EXECUTE proc_logout'郝掂','340321196507203290','河北大学附属医院'
SELECT * FROM PATIENT
总结
就此,基本的需求完成。接下来可以做的:
- 将代码整合起来统一运行,之前看到的一篇文章会有帮助:使用SQLCMD在SQLServer执行多个脚本
- 通过ODBC接口将SQL语句与编程语言(python等)关联,实现仿真交互
数据库课设项目(下) 医护人员与患者相关推荐
- 数据库课设项目(上) 医院
文章目录 任务 需求分析 过程 CREATE DATABASE 导入地区数据 转义字符 CREATE TABLE 成功导入 注册医院 CREATE TABLE 导入结果 触发器创建默认科室 初始科室 ...
- 数据库课设(足球联赛管理系统)
一:前言 如果有关注博主的粉丝,可能会发现贴心杰又缺更好几天了,但是我是宠粉杰啊,怎么可能会忘了我的宝贝粉丝呢,只不过是临近期末,各种大作业课设如期而至,这几天我在写数据库课设,对于一个没有写过任何项 ...
- HNUST - 数据库课设
HNUST - Python+Mysql数据库课设 一.实验题目 人事管理系统 二.实验目的 企业人事管理系统主要用于员工个人资料的录入.职务变动的记录和管理.使用人事管理系统,便于公司领导掌握人员的 ...
- Java毕业课设项目名称
Java毕业课设项目名称 毕业设计题目 1 网上校友录设计 2 辅导员之家网站设计与开发 3 B/S结构下的OA流程可视化的研究与实现 4 B2C的电子商务系统(J2EE) 5 C/S架构的在线开始系 ...
- 数据库课设记录 Day 3
Day 3 经过各种斟酌,砍了不少一时心血来潮想做的东西,数据库课设的核心内容就定下来了. 公司 Company 名称 字段 数据类型 id id int 公司名 name varchar(20) 地 ...
- JAVA+MySQL 数据库课设的问题及解答的整理 以【学生管理系统】为例
JAVA+MySQL 数据库课设的问题及解答的整理 以[学生管理系统]为例.帅气学长哦! 编写这篇博文初衷 MySQL的一些问题 Eclipse导入项目的一些问题 数据库的建立和连接 最后一步 编写这 ...
- 临近期末,图书管理系统课设项目安排上(附源码)
图书管理系统 项目介绍 项目截图 源码分享 项目介绍 本系统是一个基于java的图书管理系统,用Swing显示信息. 开发环境为IDEA,使用mysql数据库.用 户分为 用户和管理员. 项目截图 源 ...
- 微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...
PianoMFC 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文 ...
- 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...
最新文章
- 【Mac】解决「无法将 chromedriver 移动到 /usr/bin 目录下」问题
- python smtp模块发送邮件
- Android之自定义Adapter的ListView
- 2019支持c99吗_德国LYNX携手北京十方融科科技有限公司成功中标2019年中国联通北京市分公司4K超高清视频信号传输设备购置项目...
- go给Linux安装mysql_Linux安装MySQL-Go语言中文社区
- Win10系列:C#应用控件基础12
- 支票数字大写转换器_信用卡支票数字生成器Java程序
- 在VirtualBox中安装WindowsXP
- 二进制搜索树(BSTs) 和AVL 树
- 怎样才能写好一份高质量的市场需求文档(MRD)
- oracle 转chr,[Oracle]Oracle之Chr函数返回
- cad解除块的快捷命令_CAD解除编组及快捷键命令
- vue页面详情页返回列表页_vue 详情页返回列表页,保留列表页之前的筛选条件...
- 北京交通大学万怀宇:时空交通数据预测方法及应用
- PHP 面试总结(持续更新) --小丑
- Kubeadm 部署企业级高可用Kubernetes(适用于ECS)
- 1567. 乘积为正数的最长子数组长度 ●●
- Java构建HashCode相同字符串算法
- web前端面试--浏览器兼容性问题
- 基于FPGA音乐播放器硬件电路设计
热门文章
- MPLS 虚拟专用网络 Hub and Spoke实验
- 马斯克大举提拔华裔,引发华裔与印度裔哪个更具优势的争论
- h5页面在iphone手机上底部会有留白解决办法
- vim设置编码为urf-8
- Visual Studio 2015安装的Visual Studio Installer生成的msi兼容XP系统
- AI时代的招聘新趋势:数字化人才Mapping
- decode.c:38:18: fatal error: dnet.h: No such file or directory
- EOMS未完成工单统计及催单短信自动生成工具
- python小海龟画小汽车
- uc支持html5么,新版UC浏览器对HTML5支持度简析