文章目錄
- 前言
- 醫院資訊管理系統
- 摘要
- 1.概述
- 運行環境
- 2. 1需求分析
- 2.1.1基本分類需求分析
- 2.1.2 主要關系流程分析
- 2.2可行性分析
- 3.1概念結構設計
- 3.1.1 抽象出系統的物體
- 3.2 設計分E-R圖
- 3.3.1 全域E-R圖
- 4.1邏輯結構設計
- 5.1資料庫物理設計與實施
- 6.資料操作要求及實作
- 6.1.1 資料查詢、更新操作
- 6.1.2實作藥品的入庫、出庫管理;
- 6.1.3實作科室、醫生、病人的管理;
- (1) 邏輯增刪改
- 6.1.4實作處方的登記管理
- 6.1.5實作收費管理;
- 6.2 視圖
- 6.3 觸發器
- 6.4 存盤程序
- 7.基準測驗
- 8.總結
- 9.參考文獻
- 寫在最后
一節復一節,千枝攢萬葉,我自不開花,免撩蜂與蝶,
皓首猶貪學,謙虛德益豐,潛神無朕際,悟物不言中,
前言
我將其開源.但希望你能從中學習到資料庫設計思想.
誠然,我不是一名DBA,我僅僅讀過半本高性能MySQL(第3版)和一本資料庫系統概論(第5版),一本java開發手冊(華山版).我從中掌握了一些知識將他們運用在了課程設計中.也許我的資料庫課程設計對于這個專案結構來說不是最好,最優秀的.
但是憑借這幾本書的經驗,我覺得還是有可取之處的.在本次資料庫系統設計中我時刻希望以一名優秀的DBA標準要求自己.
不為別的.只希望做一次,就要做好!
由于做之前就萌生了開源的想法.我就完全將mysql表設計思想,避免約束加鎖,避免觸發器,存盤程序…等問題全部考慮到了.
所以本次課程設計不僅有邏輯操作思想,還有學校以教學為目的,對于觸發器,存盤程序的枷鎖要求.
我也因此希望能夠做全面:存盤引擎的考慮,表設計,采用方案的對比,索引優化,資料庫在windows下壓力測驗和linux下時延回應時間的測驗.
這幾個方面都囊括其中.
希望共同學習,共同進步.
可以加入我的qq群:287048847 一起交流資料庫設計和Java/Go的開發!這里的人都充滿激情!
提示:以下是本篇文章正文內容,下面案例可供參考
醫院資訊管理系統
摘要
隨著人們生活水平的不斷提高,人們更重視醫療設施,醫院的業務也不斷增加,而對于醫院來講,資訊管理系統屬于其重要組成部分,確保系統高效、穩定且安全的運行是醫院應關注和解決的問題,為使資訊系統穩定、安全,高可用,作業人員需管理好資訊系統,重視資料庫安全,進而使資訊資料將自身作用與價值充分發揮出來,醫療關系民脂民生,人民健康.設計人員應當格外小心謹慎,做好零失誤.
1.概述
依據資料庫課程設計要求,我將以DBA標準,參照mysql高性能,java開發手冊,資料庫系統概論等撰寫設計本系統.由于考慮諸多因素,對資料庫的了解結合我目前的經驗水平,我將使用java連接mysql資料庫.shell腳本,jmeter測驗工具進行測驗.本系統使用mysql的原因是其在Linux下比sql server更成熟,同時它具有更高的靈活性.選用java作為資料庫連接,因為我對它相較其他語言足夠熟悉,同時它也足夠強大.shell和jmeter都能很好的輔助我進行基準測驗.以DBA的要求,應當多使用邏輯外鍵,少觸發器,存盤程序和外鍵級聯操作.但我會將兩種方案一并給出.具體設計方案詳見下文.
運行環境
mysql-connector-java-8.0.22.jar
Window10
IntelliJ IDEA 2021.2.1
apache-jmeter-5.4.1
linux-centos7
spring配bean連接池
2. 1需求分析
2.1.1基本分類需求分析
1. 控制中心
| ? 人員管理: | 實作對員工,病人的增刪改; |
| ? 藥品管理: | 實作對藥品的入庫,出庫操作和處方藥的登記以及藥品型別,藥品資訊的登記 |
| ? 收費管理: | 對藥品營收的統計; |
2. 查詢
? 員工,病人的基本資訊查詢;
? 藥品資訊的查詢;
? 收費情況的查詢;
2.1.2 主要關系流程分析
病人看病,先掛號等待分配科室.然后醫師給患者看病開票據.病人拿票憑去前臺充值,接著去藥房拿藥.藥師根據患者的票憑刷卡取藥,完成藥品交付和收費流程.
2.2可行性分析
該系統主要包括基本資料維護、基本業務、資料庫管理和資訊查詢四部分,
1、基本資料維護部份應包括提供管理員添加、修改并維護基本的資料途徑,例如添加修改醫院和辦理病人入住與搬出或者換病房,管理醫院里的基本設備,
2、資料庫管理部分是對這個資料庫的管理,包括醫生,病人詳細資訊等,
3、該系統的技術可行性分析:在系統維護中包括醫生和病人資訊檢索,資料庫資訊維護,
4、系統技術的可行性分析:
基于jvm和mysql下本系統可以運行于windows和Linux作業系統當中,可以為系統提供一個穩定的運行環境,該系統應該說有開發的必要性,
該系統主要由兩大部分組成即管理維護和查詢,
3.1概念結構設計
3.1.1 抽象出系統的物體
涉及的目標物件:患者,科室,醫師,藥師,前臺收銀,藥品,掛號單,處方資訊.
3.2 設計分E-R圖







3.3.1 全域E-R圖

4.1邏輯結構設計
| 病人病史 | (身份證號、姓名、性別、年齡、病例); |
| 藥品存放記錄 | (藥品編號、藥品名、進價、售價、藥品數量、生產日期、有效期,存盤位置); |
| 掛號 | (掛號編號、病人編號、性別、掛號科室、醫生編號); |
| 收費 | (收費員編號,收費員姓名,病人編號,藥品編號,數量,金額); |
| 醫生 | (醫生員工號,醫生姓名,醫生性別,醫生年齡,科室,電話); |
| 處方 | (醫生員工號,藥品編號,數量); |
| 支付 | (支付編號,收費編號,價格); |
5.1資料庫物理設計與實施

掛號

醫師資訊

病人資訊

藥品資訊

繳費資訊

取藥票單

處方資訊

支付憑據


6.資料操作要求及實作
6.1.1 資料查詢、更新操作
select * from register where register.is_delete=0;

select * from doctor where doctor.is_delete=0;

select * from patient where patient.is_delete=0;

SELECT * FROM drugs WHERE is_delete=0;

select * from charge WHERE is_delete=0;

select * from PGM WHERE is_delete=0;

select * from recipel WHERE is_delete=0;

select * from pay WHERE is_delete=0;

6.1.2實作藥品的入庫、出庫管理;
1. INSERT INTO drugs(drug_id, drug_name, drug_price, drug_quantity, drug_storage, drug_date, usefull_life)
2. VALUES ('1000237', '長生不老丹', 9999.00, '821', 'C-8-291', '2021-09-01', '2022-09-01');
3.
4. SELECT * FROM drugs WHERE drug_name = '長生不老丹' AND is_delete=0;

1. UPDATE drugs SET drug_name = '聰明草' WHERE drug_id = '1000237';
2.
3. UPDATE drugs SET IS_DELETE=1 WHERE drug_name='聰明草';


對應的java后端實作
1. 增刪改操作
2. package com.vector.hospital_information;
3.
4. import com.vector.config.SpringConfiguration;
5. import org.junit.Test;
6.
7. import org.junit.runner.RunWith;
8. import org.springframework.context.ApplicationContext;
9. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
10. import org.springframework.stereotype.Component;
11. import org.springframework.test.context.ContextConfiguration;
12. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
13.
14. import javax.annotation.Resource;
15. import javax.sql.DataSource;
16. import java.sql.Connection;
17. import java.sql.PreparedStatement;
18. import java.sql.SQLException;
19.
20. @RunWith(SpringJUnit4ClassRunner.class)
21. @ContextConfiguration(classes = {SpringConfiguration.class})
22. @Component("Update_test")
23. public class Update_test {
24. @Resource(name = "dataSource")
25. DataSource dataSource;
26. @Resource(name = "Update_test")
27. Update_test modify;
28. @Test
29. /**
30. * 測驗增刪改
31. */
32. public void TestUpdate() throws SQLException {
33.
34. /**
35. * 測驗增添資料
36. */
37. String sql1 = "INSERT INTO drugs(drug_id,drug_name,drug_price,drug_quantity,drug_storage,drug_date,usefull_life) VALUES (?, ?, ?, ?, ?, ?, ?)";
38. modify.update(sql1,"1000237", "長生不老丹", 9999.00, "821", "A-8-291", "2021-09-01", "2022-09-01");
39.
40. /**
41. * 測驗修改資料
42. */
43. // String sql2 = "UPDATE drugs SET drug_name = ? WHERE drug_id = ?";
44. // modify.update(sql2,"聰明草","1000237");
45. // /**
46. // * 測驗洗掉資料
47. // */
48. // String sql3 = "DELETE FROM drugs WHERE drug_name=?";
49. // modify.update(sql3,"聰明草");
50. }
51. /**
52. * 王佳慧
53. * 通用增刪改
54. * @param sql
55. * @param args
56. * @throws SQLException
57. */
58.
59. //通用的增刪改操作
60. public void update(String sql, Object... args) throws SQLException {//sql當中占位符個數與可變形參的長度一致
61.
62. Connection conn = null;
63. PreparedStatement ps = null;
64. //ApplicationContext app = null;
65. try {
66. //app = new AnnotationConfigApplicationContext(SpringConfiguration.class)
67. //1.獲取資料庫連接
68. conn = dataSource.getConnection();
69. //2.預編譯sql陳述句,回傳PreparedStatement實體
70. ps = conn.prepareStatement(sql);
71. //3.填充占位符
72. for (int i = 0; i < args.length; i++) {
73. ps.setObject(i + 1, args[i]);
74. }
75. //4.執行sql陳述句
76. ps.execute();
77. System.out.println("添加記錄成功");
78. } catch (Exception e) {
79. e.printStackTrace();
80. } finally {
81. //5.資源的關閉
82. conn.close();
83. }
84. }
85.
86. }
1. Sql查詢
2. package com.vector.hospital_information;
3.
4. import com.vector.config.SpringConfiguration;
5. import com.vector.test.DataSourceTest;
6. import org.junit.Test;
7. import org.junit.runner.RunWith;
8. import org.springframework.stereotype.Component;
9. import org.springframework.test.context.ContextConfiguration;
10. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
11.
12. import javax.annotation.Resource;
13. import javax.sql.DataSource;
14. import java.lang.reflect.Field;
15. import java.sql.*;
16.
17. @RunWith(SpringJUnit4ClassRunner.class)
18. @ContextConfiguration(classes = {SpringConfiguration.class})
19. @Component("PreparedStatementQueryTest")
20. public class PreparedStatementQueryTest {
21.
22. @Resource(name = "dataSource")
23. DataSource dataSource;
24. @Resource(name = "PreparedStatementQueryTest")
25. PreparedStatementQueryTest queryTest ;
26.
27.
28. @Test
29. /**
30. * 測驗查詢
31. */
32. public void TestQuery() throws SQLException {
33.
34.
35. /**
36. * 測驗查詢一條記錄
37. */
38. String sql = "SELECT * from drugs where drug_name=?";
39. Drugs drugs = queryTest.getInstance(Drugs.class,sql,"長生不老丹");
40. System.out.println(drugs);
41.
42.
43. }
44. /**
45. * 王佳慧
46. * 針對于不同的表的通用查詢操作,回傳表中的一條記錄
47. * @param clazz
48. * @param sql
49. * @param args
50. * @param <T>
51. * @return
52. */
53. public <T>T getInstance(Class<T> clazz,String sql,Object ...args) throws SQLException {
54. Connection conn = null;
55. PreparedStatement ps = null;
56. ResultSet rs = null;
57. try {
58. conn = dataSource.getConnection();//加載資料庫
59. ps = conn.prepareStatement(sql);
60. for (int i = 0; i < args.length; i++) {
61. ps.setObject(i + 1, args[i]);
62. }
63. //執行,獲取結果集
64. rs = ps.executeQuery();
65. //獲取結果集的元資料
66. ResultSetMetaData rsmd = rs.getMetaData();
67. //獲取列數
68. int columuCount = rsmd.getColumnCount();
69. if (rs.next()) {
70. T t = clazz.newInstance();
71. for (int i = 0; i < columuCount; i++) {
72. //獲取每個列的列值,通過ResultSet
73. Object columnValue = rs.getObject(i + 1);
74. //獲取每個列的列名,通過ResultSetMetaData
75. //獲取列的列名:getColumnName() ---不推薦使用
76. //獲取列的別名:getColumnLabel()
77. String columnLabel = rsmd.getColumnLabel(i+1);
78. //通過反射,將物件指定名columnName的屬性值賦值給columnValue
79. Field field = clazz.getDeclaredField(columnLabel);
80. field.setAccessible(true);
81. field.set(t, columnValue);
82. }
83. return t;
84. }
85. } catch (Exception e) {
86. e.printStackTrace();
87. } finally {
88. conn.close();
89. }
90.
91. return null;
92. }
93.
94.
95. }


6.1.3實作科室、醫生、病人的管理;
(1) 邏輯增刪改
1. INSERT INTO register(r_num, r_patient_id, r_sex, r_dept, r_name)
2. VALUES ('222', '411282xxxxxxx1182', '女', '肛腸科', '塵思宇');
3.
4. SELECT * from register where r_patient_id='41128220230304554X WHERE IS_DELETE=0';
5.
6. START TRANSACTION;
7. BEGIN;
8. UPDATE patient SET p_name = '病人1' WHERE p_atient_id = '41128220230304554X AND IS_DELETE=0;
9. UPDATE register SET r_name = '病人1' WHERE r_patient_id = '41128220230304554X' AND;
10. IS_DELETE=0;
11.
12. UPDATE register SET IS_DELETE=1 WHERE r_num='222';
Java相關事務提交核心代碼
1. try {
2. //app = new AnnotationConfigApplicationContext(SpringConfiguration.class)
3. //1.獲取資料庫連接
4. conn = dataSource.getConnection();
5. conn.setAutoCommit(false);
6. //2.預編譯sql陳述句,回傳PreparedStatement實體
7. ps = conn.prepareStatement(sql);
8. //3.填充占位符
9. for (int i = 0; i < args.length; i++) {
10. ps.setObject(i + 1, args[i]);
11. }
12. //4.執行sql陳述句
13. ps.execute();
14. conn.commit();
15. System.out.println("添加記錄成功");
16. } catch (Exception e) {
17. conn.rollback();
18. e.printStackTrace();
19. } finally {
20. //5.資源的關閉
21. conn.close();
22. }
23. }
(2) 級聯操作
1. -- 級聯操作
2. alter table patient add
3. constraint patient_register_dept
4. foreign key(p_atient_id) references register(r_patient_id) on delete cascade;
5. DELETE FROM patient WHERE p_atient_id='41128220230304554X';
6.1.4實作處方的登記管理

1. /**
2. * 測驗增添資料
3. */
4. String sql1 = "INSERT INTO recipel(id,doctor_id,drug_id,count,patient_name) VALUES (?,?,?,?,?);";
5. modify.update(sql1,1,"001", "100023", "2盒","病人1");
6.1.5實作收費管理;

6.2 視圖
創建視圖查詢各種藥品的庫存總數;


1. SELECT drug_name,sum(drug_quantity) FROM drug_view GROUP BY drug_name ;
6.3 觸發器
藥品出庫操作
1. -- 創建觸發器,當藥品入庫、出庫時自動修改庫存;
2. # 藥品出庫操作
3. delimiter $$ -- 自定義結束符號
4. create trigger recipel_update
5. before insert
6. on recipel
7. for EACH ROW
8. BEGIN
9. SELECT @quantity=drug_quantity into @str
10. FROM drugs WHERE NEW.drug_id = drugs.drug_id;
11. IF @quantity <= 0 || NEW.count > @quantity THEN
12. SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: 藥品數量為零!';
13. ELSE
14. UPDATE drugs SET drug_quantity = drug_quantity - NEW.count WHERE drug_id=NEW.drug_id AND IS_dELETE=0;
15. end if;
16. end
17. $$ -- 自定義觸發器結束
18. delimiter ;

插入前

插入后

藥品入庫操作
插入前

插入后

6.4 存盤程序
創建存盤程序統計某段時間內,各科室的就診人數和輸入情況;
#存盤程序
drop procedure count_people_date;
DELIMITER $$
CREATE PROCEDURE count_people_date(
#IN @begin_date datetime, 這樣寫是錯誤的
IN begin_date datetime,
IN end_date datetime
)
BEGIN
SELECT r_dept '科室',count(*) '問診人數'
FROM register
WHERE update_time BETWEEN begin_date AND end_date AND is_delete=0
GROUP BY r_dept ;
end $$
DELIMITER ;
CALL count_people_date('2021-12-04','2021-12-05');


7.基準測驗
壓力測驗:

時間延遲測驗:


8.總結
對于本次課程設計,考慮到做事就要做完美,做一次了,那就給他開源,設計,優化,除錯,測驗,對比都做一遍.當然在進行資料庫操作的時候,難度最大的有
1.觸發器 由于我使用了mysql,這與sql service有著高度的隔離.這部分內容是完全不一樣的.做遷移時耗費了很大力氣.有很多問題摸索了很久,有些問題是stackoverflow,百度,csdn都解決不了的.比如我使用了update觸發器,但是在觸發器中執行插入操作,總是插不進去!困擾了我很久,尋訪各個dba群中大佬,都無能為力.總之,有些是耗費很長時間都無法解決的,很挫敗.但雖然挫敗,但我也識訓了很多,對于基本的sql操作,以及mysql,sql service都有了深刻認識.
2.新思想 同時在設計資料庫的程序中,也觸發了很多新思想,有了新思想,眼前豁然開朗,邏輯洗掉思想解決了一對多,牽一發而動全身的難題.也保證了資料的永久存盤.
3.Linux下的資料時延測驗. 本以為靠兩個shell自動化腳本很容易做.但是錯誤也是頻繁發生.但在解決問題的程序中,我了解到了sh -x 腳本除錯.這讓我捕獲了錯誤.完成了資料采集,以及qbs在時間維度的測驗.
9.參考文獻
[1]高性能MySQL:第3版/(美)Schwartz,B.(美)Zaitsev,P.,(美)Tkachenko,V.著;寧海元等譯.-北京:電子工業出版社,2013.5 書名原文:High Performance MySQL,Third Edition.
[2]資料庫系統概論/王珊,薩師煊編著.—5版.—北京:高等教育出版社,2014.9 ISBN 978-7-04-040664-1
[3]java開發手冊社區開發者集體智慧的結晶-(華山版)v1.5.0.-杭州:阿里巴巴,2019.06
寫在最后
開源連接----->>>點擊此處
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374858.html
標籤:其他
