..广西科技大学《校医院门诊管理系统》课程设计说明书课程名称:广西科技大学校医院门诊管理系统班级:姓名:学号:指导老师:原庆能2016年1月14日..一.实训目的1.掌握数据库基本原理,理解关系数据库的设计方法、设计思路。初步掌握一种关系数据库语言,例如SQLServer。2.通过设计数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力;3.学习数据库应用系统开发方法。培养学生初步的软件设计能力,形成良好的编程风格二.实训内容一.需求分析广西科技大学校医院门诊管理系统所要处理的数据有:就诊卡号、姓名、性别、年龄、联系电话、所在部门、就诊科室、就诊大夫、就诊日期、病情描述、处方编号、药品编码、药品名称、类别、库存余量、规格、保质期、用量、数量、金额、医务人员的职工号、姓名、性别、年龄、职称、所在科室、专长、诊病时间,科室名称、科室位置、可容纳医生数等。完整性要求:就诊日期在药品的保质期前;使用的药品数量小于库存余量,在同一时间段、同一科室诊病的医生数小于或等于科室可容纳医生数。安全性要求:学生和教师持就诊卡就诊,可查阅医生的相关信息;医生可填写病例、开处方;药房护士可进行药品的出库、入库进行管理。二.概念设计1.根据需求分析,可抽象出科室、医生、病人、处方和药品5个实体,其中:科室有:科室名称、科室位置、可容纳医生数属性,科室名称为实体标识符。医生有:职工号、姓名、性别、年龄、所在部门、职称、专长、诊病时间属性,职工为实体标识符。病人有:就诊卡号、姓名、性别、年龄、联系电话属性,就诊卡号为实体标识符处方有:处方编号、病情描述、诊断日期属性,处方编号为实体标识符。药品有:药品编码、药品名称、类别、库存余量、规格、保质期、数量、金额属性,药品编码为实体标识符。实体之间的关系说明:1)一个科室可以容纳多个医生2)一个医生可以填写多个处方3)一个病人可以查看多个处方4)一个处方可以使用多个药品,一种药品可以用于不同是处方5)药房护士可以对药品进行出入库管理。2.E-R图如下..1nm11nnnmn三、逻辑设计将上述ER图转化为关系模式集1)将5个实体转化为关系模式病人:就诊卡号、姓名、性别、年龄、联系电话医生:职工号、姓名、性别、年龄、所在部门、职称、专长、诊病时间科室:科室名称、科室位置、可容纳医生数药品:药品编码、药品名称、类别、库存余量、规格、保质期、数量、金额处方:处方编号、病情描述、诊断日期2)对1:n关系“容纳”,“填写”,“查看”转化为关系模式医生:职工号、姓名、性别、年龄、所在部门、职称、专长、诊病时间、科室名称处方:处方编号、病情描述、诊断日期、职工号、就诊卡号3)对m:n关系“填写”,“使用”生成新的关系模式使用:处方编号、药品编码、用量、用法管理:职工号、药品编码、药品原数量、操作时间、数量、出入关系4)所有关系如下病人:就诊卡号、姓名、性别、年龄、联系电话科室:科室名称、科室位置、可容纳医生数药品:药品编码、药品名称、类别、库存余量、规格、保质期、数量、金额医生:职工号、姓名、性别、年龄、所在部门、职称、专长、诊病时间、科室名称处方:处方编号、病情描述、诊断日期、职工号、就诊卡号医生科室药品处方病人容纳填写查看管理使用..使用:处方编号、药品编码、用量、用法管理:职工号、药品编码、操作时间、数量、出入关系四、物理设计医生表doctor:属性数据类型长度或取值范围主键外键空值职工号varchar20是否姓名varchar10否性别varchar10年龄int所在部门varchar10职称varchar10专长varchar25诊病时间varchar20科室名称varchar10是病人表patient:属性数据类型长度或取值范围主键外键空值就诊卡号varchar20是否姓名varchar10否性别varchar5年龄varchar10联系电话varchar20科室表room:属性数据类型长度或取值范围主键外键空值科室名称varchar10是否科室位置varchar10否可容纳医生数Int否药品表drug:属性数据类型长度或取值范围主键外键空值药品编码varchar20是否药品名称varchar20否类别varchar10否库存余量varchar20否规格varchar否保质期datetime否数量smallmoney否金额int否..处方表prescription:属性数据类型长度或取值范围主键外键空值处方编号varchar20是否病情描述datetime诊断日期varchar50职工号varchar20是否就诊卡号varchar20是否使用表userdrug:属性数据类型长度或取值范围主键外键空值处方编号varchar20是是否药品编码varchar20是是否用量int用法varchar20管理表inout:属性数据类型长度或取值范围主键外键空值职工号varchar20是是否药品编码varchar20是是否药品原数量int否操作时间datetime否数量int否出入关系varchar4否创建药品用量触发器tr_insert_user_drug/tr_update_user_drugUSEdisplayGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype='TR'ANDname='tr_insert_user_drug')DROPTRIGGERtr_insert_user_drugGOCREATETRIGGERtr_insert_user_drugONuserdrugFORINSERTASDECLARE@userDgintselect@userDg=用量fromInsertedif(select库存余量fromdrugwhere药品编码=(select药品编码fromInserted))@userDgBEGINPRINT'药品余量不足'ROLLBACKTRANSACTIONEND..USEdisplayGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype='TR'ANDname='tr_update_user_drug')DROPTRIGGERtr_update_user_drugGOCREATETRIGGERtr_update_user_drugONuserdrugFORUPDATEASIFUPDATE(用量)DECLARE@userDgint,@drugnochar(20)select@userDg=用量frominsertedselect@drugno=药品编码frominsertedif(select库存余量fromdrugwhere药品编码=@drugno)@userDgBEGINPRINT'药品余量不足'ROLLBACKTRANSACTIONEND创建药品日期触发器tr_insert_datetime_drug/tr_update_datetime_drugUSEdisplayGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype='TR'ANDname='tr_insert_datetime_drug')DROPTRIGGERtr_insert_datetime_drugGOCREATETRIGGERtr_insert_datetime_drugONuserdrugFORINSERTASDECLARE@drugnochar(20),@presnochar(20),@date1datetime,@drugnamechar(20)select@presno=处方编号fromInsertedselect@drugno=药品编码fromInsertedselect@drugname=药品名称fromdrugwhere药品编码=@drugnoselect@date1=诊断日期fromprescriptionwhere处方编号=@presnoif(select保质期fromdrugwhere药品编码=@drugnoand药品编码in(select药品编码fromuserdrugwhere处方编号in(select处方编号fromprescription)))@date1BEGINPRINT'药品:'+@drugname+'超过使用日期'ROLLBACKTRANSACTIONENDUSEdisplayGO..IFEXISTS(SELECTnameFROMsysobjectsWHEREtype='TR'ANDname='tr_update_datetime_drug')DROPTRIGGERtr_update_datetime_drugGOCREATETRIGGERtr_update_datetime_drugONuserdrugFORUPDATEASIFUPDATE(药品编码)DECLARE@drugnochar(20),@presnochar(20),@date1datetime,@drugnamechar(20)select@presno=处方编号fromInsertedselect@drugno=药品编码fromInsertedselect@drugname=药品名称fromdrugwhere药品编码=@drugnoselect@date1=诊断日期fromprescriptionwhere处方编号=@presnoif(select保质期fromdrugwhere药品编码=@drugnoand药品编码in(select药品编码fromuserdrugwhere处方编号in(select处方编号fromprescription)))@date1BEGINPRINT'药品:'+@drugname+'超过使用日期'ROLLBACKTRANSACTIONEND创建科室医生触发器tr_insert_room_doc/tr_update_room_docUSEdisplayGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype='TR'ANDname='tr_insert_room_doc')DROPTRIGGERtr_insert_room_docGOCREATETRIGGERtr_insert_room_docONdoctorFORINSERTASDECLARE@roomnoint,@roomnamechar(10)select@roomname=科室名称frominsertedselect@roomno=可容纳医生数fromroomwhere科室名称=@roomnameif(selectcount(*)fromdoctorwhere科室名称=@roomname)@roomnoBEGINPRINT'科室医生已满'ROLLBACKTRANSACTIONENDUSEdisplayGOIFEXISTS(SELECTnameFROMsysobjects..WHEREtype='TR'ANDname='tr_update_room_doc')DROPTRIGGERtr_update_room_docGOCREATETRIGGERtr_update_room_docONdoctorFORUPDATEASIFUPDATE(科室名称)DECLARE@roomnoint,@roomnamechar(10)select@roomname=科室名称frominsertedselect@roomno=可容纳医生数fromroomwhere科室名称=@roomnameif(selectcount(*)fromdoctorwhere科室名称=@roomname)@roomnoBEGINPRINT'科室医生已满'ROLLBACKTRANSACTIONEND创建出入库触发器tr_inout_drugUSEdisplayGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype='TR'ANDname='tr_