[讨论]关于HL7和数据库的一点看法
读了sbf2000关于HL7V3和Cache数据库的多篇大作,非常敬佩sbf2000的钻研精神。本人也想再搞一下Cache数据库,看看它好在那里,只可惜没有时间搞。
对于sbf2000提出的在Cache数据库中实现HL7V3的数据类型的设想,我想还有值得商讨的地方。
在应用系统中,无论是B/S还是C/S结构,也无论是否HL7 ready,对HL7的操作都不会直接访问后台数据库,通常采用应用组件或应用服务器将其“封装”起来。从HL7应用端可访问HL7定义的各种CLASS,包含了HL7的实体、视图、动作、角色...当然,其数据类型就是HL7定义的这30多种类型。
但是,在应用系统内部、在数据库内,数据则需要使用数据库和开发工具所允许的数据类型。
为什么会这样?
首先,HL7的“数据类型”和应用软件、数据库中的“数据类型”不是同一个概念。数据库中的“数据类型”是信息在处理和存储时的表达形式,是相对“底层”的定义。
例如,在“应用层”的概念(如HL7等)上,“名称”和“地址”是不同的类型,有不同的属性。但是,对于以信息处理和存储为目的的应用软件、数据库来说,它们并没有区别。如打印处理,两者均作为字符串来处理,不会因为它们“应用层”上含义不同而采取不同的处理和存储方法。
HL7是特定的“应用层”的定义。它的目标在于交换,并不考虑实际处理和存储的格式。如HL7定义的Person Name、Organization Name等类型,就是为了系统交换的方便而定义的特定类型,属于“交换”这一特定应用所定义的类型。这种类型从编程角度来看并无意义。
由于两个“类型”的层次不同,所以不必强求数据库与HL7的数据类型完全一致。记得HL7对RIM有过如下的声明(大意):
HL7RIM不是数据库模块,不是信息系统,不是医疗组织的计划或者特定的通讯系统。RIM与它们的范围和目的是不同的。HL7主要目的是信息交换,而不是信息存储。
其次,如果一定要数据库与HL7的数据类型一致,即使数据库允许自定义类型,在进行实际处理(如运算)时,因为数据库或开发工具的处理操作(如运算、显示、打印等)大多不支持自定义的类型,还要反复进行类型转换,会严重影响效率。况且,过于复杂的数据类型本身就会影响运行效率。
问题的关键在于,实际运行时没必要使用这些类型,只要在进行HL7处理时由应用组件转换成HL7的格式(包括数据类型),就做到HL7 ready了。
很多朋友提出要按HL7设计医疗系统或电子病历应用。我认为:
首先,HL7体现出的先进的医疗管理理念是值得我们认真学习和研究的。
其次,要充分注意到HL7是用于信息交换的目的,和建立信息系统的要求还是有区别的。完全套用HL7未必可行。事实上,医疗系统的实际结构要比HL7复杂得多。
比如,HL7有一章关于财务的定义,似乎财务在HL7架构中是独立的。但在先进的医疗系统中,财务应用分布在各医疗环节中,并不限于收费处和药房,而在HL7中就没有体现这一特点。因为HL7用于交换,它只注重结果,而不需要关心(财务的)过程。但医疗系统既要注重结果,更要注重过程。
另外,我赞成熟透番薯观点,不要把数据库中的一些思维方式引入到HL7研究中来。我想再补充一句:也不要把HL7研究中的一些思维方式引入到数据库研究中来。
随便说说,请大家指正。