郭一忠 李圣乔 方上兴 张铮
(厦门大学附属第一医院思明分院信息科 福建 厦门 361003)
【摘要】 门诊流程的数据流结构设计是医院信息系统设计开发中的关键环节,运用基于软件工程 “基线”原理的数据分段凝结方法来实现数据流结构设计,能快速有效的进行数据流结构设计和迭代改造,降低数据流失控风险。
【关键词】 数据流;结构设计;数据分段凝结
【中图分类号】R197.32 【文献标识码】A 【文章编号】2095-1752(2015)27-0375-03
Data-flow Structure Design of the Outpatient Service Process in Hospital Information System
Guo Yizhong, Li Shengqiao, Fang Shangxing, Zhang Zheng
(Information Department, The First Affiliated Hospital of Xiamen University, Xiamen 361003, China)
【Abstract】 Data-flow structure design of the outpatient service process is the core of a design for hospital information system. The Data Segment Frozen technique which based on the theory of “Base Line” is used to realize the design, it can improve the rapid design and realization of the data-flow structure design and iterative modification, and can reduce the risk of out of Data-flow control.
【Key Words】 Data-flow; Structure Design; Data Segment Frozen
自上世纪九十年代后期医疗卫生领域信息化建设大幕开启至今,历经十几载的信息化建设,现在大大小小的医疗卫生机构基本上都拥有了自己的信息化系统。医院信息系统(Hospital Information System,HIS)已经是最耳熟能详的词语了,HIS的设计开发技术已经是相当成熟。但是,随着信息化建设的深入,各种大数据的分析、数据平台集成以及新的医疗管理制度所要求的数据监控和统计,都对原始的HIS数据提出了更高的要求。因此,每经过一段时期,对于原有HIS的数据流结构设计进行改造和再设计势在必行。
我们发现,在数据结构更改和再设计的过程中,由于厂商支持不足、政策理解不充分、工期仓促等现实因素,或多或少会导致数据流结构的设计和改造存在不合理性,无法快速有效的定义数据流基线,虽然有可能满足一时的业务需求,但是对后续的数据查询统计和集成分析有可能留下隐患。因此,我们提出了基于“基线”原理的“数据分段凝结”方法,用门诊流程中最为关键的费用明细记录为例来进行数据流结构设计,以清晰明确的方法来刻画数据产生时点的原貌,避免缺陷数据的产生。
1.面向门诊流程的数据流分析
对门诊流程的数据流分析可以从维度建模[1]的角度来审视。单个门诊流程的逻辑业务过程包含挂号、就诊、结算这个主流程以及续诊、取药、退费等辅助流程[2]。对于这些流程所涉及的数据我们可以分为两类:一类是相对动态过程的静态数据表,类似于维度模型中的维度表,主要是诸如诊断代码字典表、价表项目字典表、医保代码对应字典表、人员科室字典表等;另一类则是包含静态数据用来反映动态过程的动态数据表,类似于维度模型中的事实表,诸如诊断记录表、费用明细表、发药记录表、结算记录表等。动态数据表所承载的数据流是分析的重点。
以一个典型的门诊费用明细记录表为例,应该包含能完整体现该记录内容和状态的所有信息:
●对应的患者信息,一般为系统中患者的ID
●对应的处方基本信息,一般为患者的挂号流水号
●费用记录信息,如项目代码、项目名称、单价、数量、金额等
●费用记录的操作信息,如开单申请人、申请科室、操作时间等
●对应的其他信息,如对应的医保编码、结算号、发票号、发票类别、核算类别等
我们运用UML设计门诊费用明细记录的状态图[3]如下:
图1 门诊费用明细记录状态图
2 .数据流结构初步设计
根据对门诊费用明细记录的分析,可设计门诊费用明细记录表字段如下:(表1)
我们不仅要设计每个字段,更重要的是对字段分段并针对分段设计凝结点。分段凝结点设计的原则是遵循以凝结时的数据事实为依据的原则,对凝结点的定义是以门诊费用明细记录的状态转移为准,每一个不同状态之间的转换,都对应着其中相应的分段字段内容的凝结或解冻。凝结点存在的作用就是将状态发生时的数据固定化,因此不可避免的要设计数据冗余,这使数据流结构设计不可能完全遵循关系型数据库的最佳设计原则,需要适当的打破第三范式[4]和参照完整性原则[5]。
3.设计实现
3.1 数据分段
数据分段主要是将相关或具有相似属性的字段分为若干的字段集合,作为凝结点产生时需要处理的内容集合。依此我们对表1里的数据字段进行分段归类,见表2:
表2 门诊费用明细记录表字段分段表
3.2 设计凝结点
凝结点的设计依据数据流在不同状态间转换的动作节点来实现,其功能就是阶段性的“基线”功能。依据图1设计门诊费用明细记录数据流的五个凝结点分别为:开单、扣费、结算、取消结算、退费。需要说明的是,我们在本文中只针对门诊费用明细记录的自身动作设计,而在实际应用环境中还有外部动作会影响门诊费用明细记录的更新。但是内部凝结点的设计,得到的凝结点控制权限同时对外部动作起效,一样决定着外部动作对其更新权限,这也是我们采用凝结点设计的最大价值所在。
凝结动作通常是在将凝结目标字段内容更新后固化其内容,与之逆向的是解冻动作,即根据业务需要对已逻辑固化的内容赋予特殊的操作权限使之回到可再次被更改的状态,解冻必须要判断前置动作是否已冻结了相关字段。
3.3 凝结点控制矩阵
根据前两小节的设计实现,我们可以整理出凝结点的控制矩阵如表3所示:
从控制矩阵中我们可以看到,除了分段D,其他的分段最终都会被凝结,这些凝结点的组合实现可以反过来直接判定目前门诊费用明细记录所处的状态。D段记录的执行人信息主要是用来统计所执行的费用,在此例中它并不直接参与费用明细的生成过程,而是由其他的业务数据流来控制其凝结与否,因此其凝结点并不在表3所示的控制矩阵内,我们暂不予讨论。
凝结动作是用于固化数据流阶段信息,避免被更改,但是当被凝结的信息包含外键信息时,这样的凝结动作会违反数据库的参照完整性约束。例如字段27“医保价项代码”在HIS的数据库设计中一般依赖于另一张医保价项字典表的主键,当它在结算过程中被凝结后,即使医保价项字典表中这条医保价目被删除或修改,字段27依然不能改动。必须这么做的原因显而易见,在结算当时的时点,传送医保接口所有内容,都必须如实保存。而如果取消结算,分段G解冻后,包含在分段G中的字段27就必须完全遵从参照完整性约束,一旦医保价项字典表发生变动,对应字段27也要做相应的改动。
表3 门诊费用明细数据流凝结点控制矩阵
3.4 代码实现
根据控制矩阵,我们在依据数据流的状态改变编写门诊费用明细记录数据更改的代码时,就可以有很清晰的权限边界可以参照,对于我们提高代码编写清晰度,降低错误率有明显的帮助。为了方便阅读,我们用半伪码形式来展示费用明细记录更新存储过程的设计实现的细节:
CREATE OR REPLACE PROCEDURE EDIT_PATIENT_ITEM_LIST
( OP IN INTEGER, --凝结点动作入参,开单1,扣费2,费别转换3,结算4,取消结算5,退费6
V1 IN VARCHAR2,
V2 IN CHAR,
...
V27 IN VARCHAR2 --27个字段入参,根据需要部分可空
)
IS
D INTEGER[8][]:={(1,2,12),(3,4,5,6,7,8,9,10,11,19),(13,14),
(15,16),(17,18),(20,21,26),(21,24,25,26,27),(22,23,20)}; -- 定义数据分段
G INTEGER[6][8]:=
{(1,0,0,0,0,0),(1,1,0,0,0,0),(1,0,0,0,0,0),(1,1,1,1,1,1),
(1,1,0,0,0,0),(0,0,-1,1,0,0),(0,0,0,1,-1,0),(0,0,0,0,0,1)}; -- 定义凝结点控制矩阵
BEGIN
SELECT 费用明细记录R1 FROM 门诊费用明细记录表 WHERE 费用流水号=V1;
根据入参OP值检索G矩阵获得控制值G[i][OP]=1和G[j][OP]=-1(如果存在);
WHILE G[i][OP]值=1 LOOP
用D[OP][]中对应字段序号的入参V?值替换R1生成新的费用明细记录R2;
END LOOP;
IF OP=1 THEN
INSERT 新的费用明细流水号+新的费用明细记录R2 INTO 门诊费用明细记录表;
ELSE
UPDATE 门诊费用明细记录表 SET 费用明细记录R1=新的费用明细记录R2;
IF G[j][OP]值=-1 THEN
校验R1在D[OP][]中对应字段的值是否合法,不合法抛出不能解冻异常;
用D[OP][]中对应字段序号的入参V?值替换R1生成新的费用明细记录R2;
UPDATE 门诊费用明细记录表 SET 费用明细记录R1=新的费用明细记录R2;
EXCEPTION
WHEN 异常 THEN
异常处理 ;
END; -- 门诊费用明细记录变动
3.5 结果讨论
通过上述的设计过程可以看出,凝结点控制矩阵能投影出数据流在不同状态转换之间数据字段的操作权限,使数据流结构在设计和改造时,通过数据分段和凝结点控制矩阵就能实现数据操作权限的控制,极大的方便了代码重用。控制矩阵的准确性取决于数据分段和凝结点设计的合理性,因此这两步设计是实现设计目的的关键,要求开发人员对数据流和业务流具有足够的熟悉度和分析能力。
4 .结束语
数据是信息系统的核心,特别在当前这个数据大爆炸的年代,数据流结构的设计规模已不是十几年前的开发规模可以比拟的了。随着大数据时代的到来,各种分析应用以及数据平台集成的需求,都要求数据的信息内容的改进能快速迭代,满足更新的需要,这对原有系统的数据流的设计和改造都提出了更高更快的要求。运用数据分段凝结方法来设计数据流结构,可以清晰的将控制逻辑单元与繁多的代码细节区分开来,提供直观的控制矩阵视图降低数据流失控风险,对于提升医院信息系统的开发、改造过程的效率和质量都有很大的作用。
【参考文献】
[1] 郭一忠,郭一闽. 面向门诊收费的数据仓库维度建模分析[J]. 中国医疗器械杂志,2008,32(5):355.
[2] 医院信息系统基本功能规范. 中华人民共和国卫生部. 2002.
[3] Meilir Page-Jones. UML面向对象设计基础[M]. 北京:人民邮电出版社,2012:112-122.
[4] Codd, E.F. Further Normalization of the Data Base Relational Model [J]. IBM Research Report RJ909, 1971.
[5] 王珊 萨师煊. 数据库系统概论[M]. 第5版. 北京:高等教育出版社,2014:141-144.
论文作者:郭一忠,李圣乔,方上兴,张铮
论文发表刊物:《医药前沿》2015年第27期供稿
论文发表时间:2015/11/5
标签:数据流论文; 明细论文; 费用论文; 门诊论文; 数据论文; 字段论文; 矩阵论文; 《医药前沿》2015年第27期供稿论文;