团队项目-数据库设计心得
医院内,医院信息系统中用户(病人)的生理数据涉及到用户的隐私,需要被加密保护。但同时,用户或医师,及医院管理人员又需要查询数据获取信息。这就导致了用户数据隐私和医疗信息查询之间的矛盾。
本项目研究的目的是设计开发一个既能加密保护用户数据隐私,又同时支持安全查询,范围查询用户数据的智慧医疗系统。
智慧医疗系统的目标是开发一款Web管理系统。系统可将医疗机构对用户的检查数据通过传统算法加密后上传到云服务器,服务器基于CIPE算法提供安全的查询数据功能。
要想设计好数据库,首先,我们应明确项目的需求,明确功能需求。

上图为根据需求画出的用例图。
三、确定实体
本系统的用户包括病患、医师和管理员。
病患通过手机号注册,并设置身份信息,设置密码之后,可以使用密码或短信验证码登录系统。病患可以查询数据、生成数据图表、查看我的医师、修改医师权限、删除医师、查询报告。
医师注册并设置身份信息后即可登录系统。医师可查询数据、生成数据图表、查看所诊病患列表。
管理员注册并设置身份信息后即可登录系统。管理员可查看日志、删除日志、管理用户,管理用户包括修改用户信息、修改密码,管理员还可查询所有医师可查询的数据,生成数据图表,数据表格加密上传。
通过各方面的分析,我们可以知道实体包括:医生,医生账户,科室,日志,权限,医生-病患关系,血常规体检表,牙科体检表,病患,病人账户。各实体包含的数据项分别如下:
(1)医生:医生编号、科室编号、医生账户编号、医生名字、电话号码、地址、出生日期、性别、简介、擅长领域、主要成就、国籍、民族、毕业院校、籍贯、相关著作、社会评价。
(2)医生账户:医生账户编号、医生编号、用户名、密码、电话号码。
(3)科室:科室编号、科室名称。
(4)日志:日志编号、用户名、类型、操作、时间。
(5)权限:病人编号、医生编号、血液科授权、牙科授权。
(6)医生-病患关系:病人编号、医生编号、日期。
(7)血常规体检表:病人编号、血检表编号、红细胞计数、白细胞计数、血小板计数、日期等。
(8)牙科体检表:病人编号、牙科检查表编号、叩痛、松动度、牙石、日期。
(9)病患:病人编号、病人账户编号、姓名、电话号码、出生日期、性别。
(10)病人账户:病人账户编号、病人编号、用户名、密码、电话号码。
另外,为了后期算法方便,我们还将部分数据建立了索引。
四、确定联系
通过以上分析,我们作如下规定:
(1)一个医生只能属于一个科室,一个科室可以包含多个医生;
(2)一个医生只能绑定一个账户,一个账户只能绑定一个医生;
(3)一个医生可以有多个病人,一个病人也可以有多个医生;
(4)一个病人只能绑定一个账户,一个账户只能绑定一个病人;
(5)一个病人可以有多个血常规体检表,一个血常规体检表只能属于一个病人;
(6)一个病人可以有多个牙科体检表,一个牙科体检表只能属于一个病人;
实体之间的联系有:
(1)医生与科室之间(1:M)
(2)医生与病人之间(M:N)
(3)医生或病人与账户之间(1:1)
(4)病人与体检表之间(1:M)
五、最终设计结果
*科室表(department)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 科室编号 | departmentNo | Integer | TRUE | FALSE | 科室的编号 |
| 科室名称 | departmentName | Variable char(20) | FALSE | FALSE | #必填字段;科室的名称,不超过20个字符 |
*医生信息表(doctor)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 医生编号 | doctorID | Integer | TRUE | FALSE | 医生的编号,一个编号对应一个医生 |
| 医生名字 | doctorName | varchar(255) | FALSE | FALSE | #必填字段;医生的名字 |
| 电话号码 | phoneNo | Char(11) | FALSE | FALSE | #必填字段;医生的电话号码 |
| 地址 | address | varchar(255) | FALSE | FALSE | 医生的家庭住址 |
| 出生日期 | birthday | Char(10) | FALSE | FALSE | 医生的出生日期,格式为:xxxx-xx-xx |
| 性别 | sex | Char(1) | FALSE | FALSE | 医生的性别:'f'表示女性,'m'表示男性 |
| 简介 | introduction | Text | FALSE | FALSE | 该医生的简介 |
| 擅长领域 | expertise | Variable characters (255) | FALSE | FALSE | 该医生擅长的领域 |
| 主要成就 | achievements | Text | FALSE | FALSE | 医生成就 |
| 国籍 | nationality | Variable characters (255) | FALSE | FALSE | 医生国籍 |
| 民族 | nation | Variable characters (255) | FALSE | FALSE | 医生民族 |
| 毕业院校 | college | Variable characters (255) | FALSE | FALSE | 毕业院校 |
| 籍贯 | nativePlace | Variable characters (255) | FALSE | FALSE | 籍贯 |
| 相关著作 | works | Variable characters (255) | FALSE | FALSE | 相关著作 |
| 社会评价 | evaluation | Variable characters (255) | FALSE | FALSE | 社会评价 |
| 科室编号 | departmentNo | int | FALSE | TRUE | |
| 医生账户编号 | daccountNo | int | FALSE | TRUE |
*医生账户表(doc_account)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 医生账户编号 | daccountNo | Integer | TRUE | FALSE | 医生账户的NO |
| 用户名 | userName | Variable characters (16) | FALSE | FALSE | #必填字段; 用户名:不超过16个字符 |
| 密码 | password | Variable characters (16) | FALSE | FALSE | #必填字段;密码,长度为16个字符 |
| 电话号码 | phoneNo | Characters (11) | FALSE | FALSE | #必填字段;电话号码,长度为11位字符 |
| 医生编号 | doctorID | int | FALSE | TRUE |
*管理员账户(admin_account)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 管理员账号编号 | accountID | Integer | TRUE | FALSE | 管理员账户编号 |
| 用户名 | userName | Variable characters (16) | FALSE | FALSE | #必填字段;用户名 |
| 密码 | password | Variable characters (16) | FALSE | FALSE | #必填字段;密码,长度为16位字符 |
| 电话号码 | phoneNo | char(11) | FALSE | FALSE |
*日志表(log)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 日志编号 | logNo | Integer | TRUE | FALSE | 日志编号 |
| 用户名 | userName | Variable characters (16) | FALSE | FALSE | 执行动作的用户名 |
| 类型 | type | Variable characters (10) | FALSE | FALSE | |
| 操作 | action | Variable characters (255) | FALSE | FALSE | 记录用户所做的操作 |
| 时间 | time | Characters (19) | FALSE | FALSE | 记录操作的时间点:格式为xxxx-xx-xx xx:xx:xx |
*权限表(restriction)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 血液科授权 | blood_grant | Boolean | FALSE | FALSE | |
| 牙科授权 | tooth_grant | Boolean | FALSE | FALSE | |
| 病人编号 | patientID | int | TRUE | TRUE | |
| 医生编号 | doctorID | int | TRUE | TRUE |
*医生病人关系表 (doctor_patient_relationship)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 日期 | date | Characters (19) | FALSE | FALSE | |
| 病人编号 | patientID | int | TRUE | TRUE | |
| 医生编号 | doctorID | int | TRUE | TRUE |
*手环表(bracelet)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 手环编号 | braceletID | Integer | TRUE | FALSE | #必填字段;手环的ID |
| 心率 | heartRate | Integer | FALSE | FALSE | 正常人心率60-100每分钟 |
| 步数 | steps | Integer | FALSE | FALSE | 步数,每天走5400-7900为正常 |
| 睡眠时间 | sleepTime | Integer | FALSE | FALSE | 睡眠时间,按分钟计算 |
*病人账户表(patient_account)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 病人账户编号 | paccountNo | Integer | TRUE | FALSE | #必填字段;病人的账户编号 |
| 用户名 | userName | Variable characters (16) | FALSE | FALSE | #必填字段;用户名,最多16个字符 |
| 密码 | password | Variable characters (16) | FALSE | FALSE | #必填字段;密码,长度为16个字符 |
| 手机号 | phoneNo | Characters (11) | FALSE | FALSE | #必填字段;电话号码 |
| 病人编号 | patientID | int | FALSE | TRUE |
*病人信息表(patient)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 病人编号 | patientID | Integer | TRUE | FALSE | #必填字段;病人的编号 |
| 姓名 | patientName | Variable characters (255) | FALSE | FALSE | 病人的名字 #必填字段;# |
| 电话号码 | phoneNo | Characters (11) | FALSE | FALSE | #必填字段;# 病人的手机号码 |
| 出生日期 | birthday | Characters (10) | FALSE | FALSE | 病人的生日 |
| 性别 | sex | Characters (1) | FALSE | FALSE | #必填字段;# 病人的性别:f表示女性,m表示男性 |
| 病人账户编号 | paccountNo | int | FALSE | TRUE |
*血常规体检表表(blood_routine)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 血检表编号 | bloodNo | Integer | TRUE | FALSE | 血常规检测表编号 |
| 红细胞计数 | rbc | Float | FALSE | FALSE | 正常成年人每升血液中所含红细胞的数量:3.5~5.5(单位10^12) |
| 白细胞计数 | wbc | Float | FALSE | FALSE | 白细胞数量,正常成年人范围:5.0~10.0(单位10^9) |
| 血小板计数 | plt | Float | FALSE | FALSE | 血小板数量正常成年人范围:1.5~3.5(单位10^11) |
| 血红蛋白 | hb | Integer | FALSE | FALSE | 血红蛋白数量,正常成年人范围:110-160g/L |
| 日期 | date | Characters (19) | FALSE | FALSE | 检测日期:如2000-01-01 16:10:10 |
| 红细胞压积 | HCT | Integer | FALSE | FALSE | 红细胞压积:参考值40-48单位(%) |
| 平均红细胞体积 | MCV | Integer | FALSE | FALSE | 平均红细胞体积,参考值80-97,单位fL |
| 平均红细胞血红蛋白容量 | MCH | Float | FALSE | FALSE | 平均红细胞血红蛋白含量,参考值26.5-33.5 |
| 平均红细胞血红蛋白浓度 | MCHC | Integer | FALSE | FALSE | 平均红细胞血红蛋白浓度,参考值300-360 |
| 淋巴细胞计数 | LY | Float | FALSE | FALSE | 淋巴细胞计数,参考值0.8-4.0 |
| 病人编号 | patientID | int | TRUE | TRUE |
*牙科检查表(tooth_routine)*
*
| *名称*** | *代码*** | *数据类型*** | *主要的*** | *外来键*** | *注释*** |
|---|---|---|---|---|---|
| 牙科检查表编号 | toothNo | Integer | TRUE | FALSE | 表的编号 |
| 叩痛 | pain | Characters (1) | FALSE | FALSE | 牙科检查之叩痛数据项:由轻到重分五个等级,用字符1-5表示 |
| 松动度 | mobility | Characters (1) | FALSE | FALSE | 松动度检测,不松动-严重松动由1-3表示 |
| 牙石 | tartar | Characters (1) | FALSE | FALSE | 有无牙石,牙石数量从少到多用1-5表示 |
| 日期 | date | Characters (19) | FALSE | FALSE | 检测日期:年-月-日 时:分:秒共19位字符 |
| 病人编号 | patientID | int | TRUE | TRUE |
六、心得
这次的数据库设计,小组同学内部积极讨论,积极提出意见,改进数据库。在数据库设计中,我们要考虑全面,先设计概念模型,然后生成物理模型。
在设计过程中要注意:
一对多,两张表,多的加外键
多对多,三张表,关系表加两个外键
若两个实体之间是一对多的关系,则多的一方加外键。
浙公网安备 33010602011771号