第三节 数据类型
一、数据类型概述
数据类型是通信中最基本的组件,CDA标准中使用的数据类型由HL7 V3数据规范定义,该规范被描述为抽象规范,因为它定义了可以在数据类型上执行的属性、语义和操作,而不是具体的计算表示。XML更详细地描述了这些数据类型在XML中的表示,CDA 2.0标准版中包含了实现技术规范。该规范使这些数据类型的实现更加具体,并指示了如何传输信息。彩图9-4显示了HL7 V3数据类型的层次结构,以及相关的细分内容。
彩图9-4 数据类型图
ANY数据类型是所有HL7数据类型的根。数量数据类型是所有数值数据类型的根。布尔值有两种形式,支持未知值的BL数据类型和不支持未知值的布尔值或BN数据类型。
封装数据(ED)数据类型支持在CDA中包含多媒体内容。在封装的数据类型中发现的比特流表示为文本、XML或文本中的base-64编码内容。元素中的CDA元素使用具有固定媒体类型和XML表示的ED数据类型。字符串(ST)受ED数据类型的约束。
名称和地址可以混合使用文本和XML元素。一个地址可以使用超过25个不同的部分,但通常只使用6个。名称部分可以以任何顺序出现。标识符有一个确保唯一性的部分(在根XML属性中找到)和一个可选的部分(在extension XML属性中找到),可以在必要时用于表示标识符的其余部分。ISO对象标识符(oid)是表示根XML属性的首选形式,但也允许使用通用唯一标识符(uuid)。所有类型的电信地址都使用url表示。如果没有关于未知电信地址含义的贸易伙伴协议,就不能表示特定类型的未知电信地址。
编码是HL7参考信息模型的一个基本特征。编码系统是一组代码的集合,这些代码标识由组织维护的离散概念。使用后协调允许使用更简单的概念来描述复杂的概念。编码系统可以表示有限或无限的概念集。值集是一组代码,可能来自多个代码系统,可以通过列出其中的代码或通过算法描述应该显示哪些代码来定义。
代码在由编码系统定义的概念空间中标识独特的概念。HL7使用OID标识编码系统。概念描述符(CD)数据类型表示一个概念,它可以在编码系统中包含一个代码、描述该概念的原始文本、一些改进原始概念的代码(称为限定符),以及对其他编码系统的转换。所有不同的编码数据类型都源自概念描述符(CD)数据类型。
时间戳以YYYYMMDDhhmmss的形式出现。其中每个字母都是一个数字。时间戳的组件按从最重要到最不重要的顺序排列。时间戳的长度决定了它的精度。IVL_TS数据类型与HL7 V3数据类型中的其他区间类似。比较区间需要注意,因为在比较中没有考虑区间边界的精度。PIVL_TS数据类型允许指定“类脉冲”波形。周期间隔的制度化指定组件(PIVL_TS)以重要的方式影响如何解释它。基于事件的间隔可以使用EIVL_TS数据类型根据睡眠和进食时间指定。
集合、列表和包都是可以与许多HL7数据类型一起使用的不同类型的集合。集合不允许重复,可以指定连续或不连续范围。interval数据类型允许创建连续范围,也是一个集合。可以通过使用各种不同的集合操作来创建集合。列表是有序的,并且允许复制内容。包是无序的,可以重复内容。
二、基础数据
(一)ANY
所有HL7 V3数据类型的属性都来自ANY。所有数据类型的通用特性都可以在这实现。例如,几乎所有HL7数据类型都可以说该值是未知的,此属性通过ANY数据类型在CDA模式中实现。具有单根层次结构的数据类型,允许CDA XML中的元素支持任何任意选择的HL7数据类型。对患者的观察可以采用任何不同的数据类型。在指定观察类型之前,数据类型是未知的,因此CDA 〈observation〉的〈value〉元素被指定为ANY这种类型。
(二)布尔
通常在编程语言中只有一种布尔数据类型。但是,由于使用了null格式,HL7比大多数其他语言有更多的含义。一个典型的布尔值可以有两个非异常值中的一个。HL7版本3使用值“true”和“false”表示两种常见情况。HL7有两种不同的布尔数据类型,下面将对它们进行详细描述。
1.BL Boolean
普通布尔数据类型有两个非异常值:true和false。它还可以表示null的各种形式。BL数据类型用于〈entryRelationship〉和〈reference〉元素中的〈separatableInd〉元素、〈language ecomcommunication〉元素中的〈preferenceInd〉元素,以及〈supply〉元素中的〈independent dentind〉元素。
2.BN BooleanNonNull
BooleanNonNull数据类型稍微传统一些,它只能表示true或false,而不允许取空值“null”。
(三)数量
在CDA 文档中,数量最常用于报告临床观察中的数值测量。数量是数字形式的,也可以有与它们相关联的度量单位(常见)或货币面额(罕见)。CDA 文档中发现的大多数数量将出现在与临床陈述相关的观察(〈观察〉)参考范围(〈观察范围〉)或前提条件(〈前提〉)中的〈值〉元素中。此外,数量还可以以报告列表中项目的序号(数字位置)出现在CDA 模式的其他一些地方。这些数量将始终使用整数数据类型。
三、文本及多媒体数据
(一)二进制
二进制(BIN binary)数据类型是原始位的集合。HL7在概念上将其视为一个BooleanNonNull值列表。二进制数据的空流被认为是异常值(null)。二进制数据类型是一种抽象数据类型,意味着该数据类型不能在CDA文档中使用。
(二)封装数据
封装数据(encapsulated data,ED)是HL7以非HL7定义的格式传输数据的方式。这种数据类型可以包括图像、视频、音频、波形、遗传序列、多媒体等。封装的数据可以以两种方式之一出现在CDA中:被引用(通过URL),或者直接合并到CDA文档中。
ED数据类型最常用的是在CDA文档的〈section〉元素或各种临床陈述元素中找到的〈text〉元素。CDA文档的〈observationMedia〉元素的〈value〉元素中也放置了封装好的数据,用于存储与临床文档相关的多媒体数据。它也可以出现在〈observation〉的〈value〉元素中,用于存储多媒体数据,如以标准(但非hl7)格式存储的基因组序列,也可以出现在临床陈述的〈text〉元素和编码数据的〈originalText〉元素中。
(三)字符串
字符串(ST string)数据类型可能是最容易理解的,它编码简单的文本数据。该数据类型在HL7数据类型中表示为ED数据类型的约束。陈述和媒体类型的XML属性分别固定为TXT值和text/plain值。这些简单的文本字符串没有引用、完整性检查或缩略图,使用language XML属性处理ED数据类型,不需要记录字符集信息,因为文本是使用CDA文档的XML声明中指定的字符集合并到XML文档中的。
四、人口学数据
CDA提供了九种不同的数据类型来记录通常认为的人口统计数据,包括地址部分、地址、名称部分、实体名称、机构名称、个人、俗名、实例标识器和通信端点。
(一)地址部分
可以将邮政地址解析为不同部分的集合。每个部分都在一定程度上确定了地理或政治边界。CDA标准支持识别邮政地址的25个不同部分,包括房屋或建筑编号、街道方向指示、邮政信箱号和公寓号等部分。CDA文档中很少使用这些更详细的地址部分。
(二)地址
地址数据类型用于记录邮政地址。它们被建模为不同层次上的地理或政治边界的集合,用于投递邮件或包裹。CDA标准将地址视为地址部分元素的任意列表和文本。这种文本和元素的混合被XML标准称为混合内容模型。
根据XML模式,〈addr〉元素的每个不同部分可以根据需要出现多次。但是,地址有两个〈state〉或〈postalCode〉元素是没有意义的。其他几个元素也是如此。除了streetAddressLine〉或〈deliveryAddress-Line〉元素外,几乎所有组件都应只出现一次。
(三)名称部分
名称可以解析为不同部分的集合,就像地址一样。实体名称部件数据类型支持名称的这些不同部分的表示。HL7将名称分为3种类型:人员、组织和其他(包括位置)。人名被解析为前缀、后缀、名、姓和分隔符。机构名称可以有前缀或后缀(如Inc或BV)和分隔符。地方和事物的名称没有不同部分。
(四)实体名称
名词是人、地方或事物。实体是名词的另一种说法。实体名称数据类型的存在是为了提供各种名词的名称。它支持以单一数据类型表示机构、人员、位置或事物名称。实体名称是以下机构名称、人员名称和常用名称派生的数据类型。此数据类型仅在CDA中用于命名药物或其他材料。EN数据类型是ENXP数据元素的列表,类似于〈addr〉使用混合内容模型来包含数据。
(五)机构名称
机构名称是表示机构名称的〈前缀〉、〈后缀〉、〈分隔符〉和文本部分的列表。通常出现在机构名称中的后缀是缩写或首字母缩写,如LLC、Inc或Gmbh。组织名称通常在CDA文档中表示,而不需要将组织名称解析为单独的部分。多数CDA实现不使用带有机构名称的前缀或后缀。
(六)人名
人名是〈prefix〉〈given〉〈family〉〈suffix〉和〈delimiter〉元素及文本的列表。PN数据类型存在于〈assignedPerson〉〈associatedPerson〉〈guardianPerson〉〈informationreceiver〉〈maintainingPerson〉〈relatedPerson〉〈playingEntity〉〈specimenPlayingEntity〉和〈subject〉元素的〈name〉元素中,PN数据类型派生自EN数据类型,因此还支持该数据类型的use属性和〈validTime〉元素。
(七)俗名
地点和事物的名字通常以俗名来命名,因为它们不像个人或机构名称那样能被分解成不同的部分。
(八)实例标识器
标识数据类型用于对一个对象进行唯一的标识。Instance Identifier(II)即实例标识器,它是个识别器,在一次注册时能够唯一地标识一个对象、东西或人。CDA规范中广泛使用这种数据类型来标识人员、位置、事物、动作、角色等。II数据类型通常出现在CDA模式中的〈id〉元素中。它还用于〈setId〉〈templateId〉和〈typeId〉元素。在某些情况下,CDA标准允许使用标识符的集合(一组),因为使用不同标识符的不同机构可能知道的是相同事情。
(九)通信地址
通信地址或端点指定如何使用通信设备与某人或某事联系,包括电话、传真机、电子邮件、网络、即时通讯等。所有通信地址都可以用URI表示。TEL数据类型用于在各种实体和角色中找到的〈telecom〉元素,也出现在ED数据类型使用的〈reference〉元素中。
五、代码及词汇表数据
词汇表是HL7 RIM中的一个重要组成部分。HL7 V3 RIM通常被描述为一种关于医疗保健的通信语言。如果RIM是一种语言,那么V3标准所使用的代码就是在不断发展的医疗保健领域赋予这种语言可扩展含义的词汇。随着新思想、新疾病和新疗法的发现,新的规范也会定期出台。CDA中广泛使用代码来沟通问题、药物、过敏、程序和许多其他概念。使用代码在软件应用程序之间进行通信可以追溯到最早的计算机系统。它们执行的指令只是告诉计算机该做什么的代码。代码很短,有很好的定义意义。叙事文本需要更多的注意避免歧义。
(一)概念
名词是一个人、一个地方、一件事或一个想法。代码用于标识这些不同的概念(concepts)。这个概念可能是非常离散的,就像特定的药物在特定的包装中含有特定的活性成分;也可能是非常宽泛的,描述了特定类别的疾病。编码系统使用不同的方法来定义由特定代码表示的概念边界,HL7 V3词汇表为它们所表示的概念提供人类可读的定义;ICD-9-CM和ICD-10-CM提供一组术语,用于确定概念是否包含在特定代码所表示的概念中,或排除在概念之外;LOINC通过描述被测量的(通常是化学)成分、被分析的物质、测量产生的数据类型、用于生成结果的特定实验室方法以及完全定义代码的许多其他属性来描述实验室测试;SNOMED CT为概念提供许多首选和可选的术语(同义词),并使用概念在代码层次结构中的位置来定义概念含义;UCUM使用数学规则来定义其编码概念的含义。
(二)编码
代码标识编码系统中的唯一概念。多个代码可能代表相同的概念,但在编码系统中很少使用。代码可以是不透明的标识符,这意味着代码值本身没有人类可解释的结构。SNOMED CT和UMLS使用不透明标识符。这些类型的编码系统需要某种人工接口来为概念选择合适的代码。一些机构为这些编码系统开发接口词汇表,提供易于理解和容易记住的短语来定位代码。代码也可以有一个可解释的结构。ICD-9-CM和ICD-10-CM编码系统是分层组织的。代码具有不同的可识别块,使人们更容易记住代码值。由于编码系统的结构,编码人员通常可以使用ICD-9-CM编码多个临床文档而不需要查找任何编码。编码系统的结构即其人机界面。
(三)编码系统
编码系统是一组代码,可以是简单的术语列表,彼此之间没有明确的关联(如LOINC);也可以在层次结构中组织(如ICD-9-CM和ICD-10-CM)或通过各种不同的关系(如SNOMED CT)组织。编码系统可以表示的概念数量可能是有限的长度(如LOINC和ICD-9-CM),或通过后协调(如SNOMED CT)或代码构造规则(如UCUM)具有无限的长度。它可以有多个版本,编码的最佳实践表明,代码永远不会在不同版本中重用以表示不同的概念,但这一规则有时也会在某些编码系统(如ICD-9-CM)中被打破。对于这样的编码系统,发送编码系统版本在通信中是很重要的,否则就不会搞清楚使用了代码的哪个定义。编码系统中的每个代码标识一个唯一概念。代码可以是原子的,表示单个简单概念;也可以表示由较小概念组成的复杂概念。
(四)预处理和后处理
当单个代码表示概念的组合时,使用的是所谓的预处理。在其他情况下,几个代码可以以受控的方式一起使用来表示概念的组合。这种类型的编码称为后处理。编码系统可以包含带有不同代码的预处理概念,或者支持多个代码的后处理以表示一个复杂的概念,或两者兼而有之。一些编码系统是为了支持使用不同的代码组合来描述概念的不同属性而特意开发的。SNOMED CT是一种支持后处理的编码系统。这些编码系统可以包含预处理概念来表达复杂的后处理概念。使用这些代码系统的CDA实现应该准备好处理这两个概念的表示。CDA实现还应该考虑交换的业务规则是否应该允许或禁止使用这些替代表示。HL7 TERMINFO规范对后处理SNOMED CT概念的使用提供了指导。其他常用的编码系统在单个代码中指定概念的所有细节,并可在单个代码中合并多个更简单的概念,例如ICD-9-CM中的糖尿病肾衰竭代码将这两个独立的概念合并到一个代码中,这是预处理的一个例子。
(五)值集
值集是可能来自多个编码系统的代码集合,表示一组(通常)不同的概念。值集可以表示用于特定目的的编码系统的子集,通常用于约束实现指南中出现的合法值。通过枚举其中找到的每个代码来定义一个扩展值集。意向值集是通过提供规则(一种算法)来确定代码是否是该集的成员来定义的。意向值集可以是动态的,这意味着它生成的值集可以随底层代码系统的更新而变化;也可以是静态的,使用固定的代码系统版本。扩展值集总是静态的。在可能的情况下,应该从单个代码系统中提取值集。HL7规范(包括CDA)使用的值集由一个称为OID的唯一标识符标识,可以有多个版本。
六、日期及时间数据
(一)时间戳
时间戳(time stamp,TS)即一个时间点。由于这是一个隐含的时间量,是任意选择的时间点,所以它是数量层次结构的一部分。HL7标准没有定义要使用的历元日期,系统可以使用任何历元值,并仍可以正确地处理时间戳。HL7时间戳数据类型的表示基于ISO 8601时间表示标准。这与其他时间表示标准中使用的标准是相同的。ISO 8601标准允许标点符号分隔出现或不出现的时间戳部分。与W 3C Schema数据类型等标准不同,这种数据类型的HL7不使用标点字符。时间戳数据类型记录CDA文档中通常命名为〈time〉或〈effectiveTime〉元素的值XML属性中的时间。
时间的表示 用两位数字分别表示世纪、世纪内的年、月、日、小时、分钟和秒。秒后面可以跟一个小数点和一个秒的小数部分。时间可以包括一个“+”或“-”符号,后面跟着最多4位数字,表示从通用协调时间(UTC)开始的以小时和分钟为单位的偏移量。时间戳仅限于时间戳部分的合法组合。
(二)时间间隔
时间间隔(interval of time,IVL_TS)的数据类型通常用于记录某个观察或事件发生或打算发生的时间间隔。它最多使用以下任意两个组件指定。由于时间戳是一个物理量,CDA模式中的IVL_TS类型对于前面提到的其他时间间隔遵循相同的规则。
(三)周期性时间间隔
周期间隔的时间数据类型用于记录重复的周期事件。可以将这种数据类型视为脉冲波形的表示形式,例如药物通常是每天给药,一天几次(如一天三次)。周期性时间间隔(periodic interval of time,PIVL_TS)数据类型允许记录这些事件之间的周期。有些治疗需要在特定的时间内以给定的频率进行(如每周三次为1小时的PT)。
(四)事件相关的周期性时间间隔
事件相关的周期性时间间隔(event-related periodic interval of time,EIVL_TS)用于表示与吃饭和睡觉相关的周期性事件。
(五)一般的时间规范
通用计时规范允许使用各种不同的集合操作(包括交叉、联合、差异和称为hull周期的复杂操作)将复杂的计时表示为一组时间间隔。周期性的hull操作本质上允许两个不同集合中的操作数对作为它们之间间隔的边界。几乎任何可以想象到的时间表都可以用这种方式表示,包括许多有效的无限长度。
(六)药物使用时间数据类型
CDA标准中上述时间数据类型最复杂的使用情况出现在描述给药频率时。〈 substanceAdministration〉XML元素使用GTS数据类型在〈effectiveTime〉元素中指定剂量频率。这意味着必须使用上述类型的组合来构建完整的表达式。
有许多方法可以使用HL7时间数据类型合法地完成这一任务,而基于HL7 RIM的信息系统将把它们视为相同的。然而,实际情况是系统很少处理这种复杂级别的管理时间安排。集成医疗企业建立了这样一个约定:计时将使用以下两种表示之一进行编码:表示单个管理事件的时间的单个时间戳;一种表示给药方案的开始和停止时间的间隔,与剂量频率相交,表示为周期性时间间隔(PIVL_TS)或事件相关的周期性时间间隔(EIVL_TS)。
七、聚集数据
HL7抽象数据类型规范包括几种不同数据类型的抽象集合,包括包、集合和列表。这些收集数据类型可以与任何其他更简单的数据类型一起使用。与其他对象模型不同,HL7集合类型不从bag集合类型派生集合或列表,即使集合和列表可以被认为是bag类型的专门化。CDA很少直接使用这些集合类型(最常用的是Set集合类型),CDA层次描述符的Message元素类型列是查找此信息的好地方。CDA模式中定义的所有数据类型,包括各种集合类型,都可以出现在〈observation〉元素的〈value〉元素中。必须使用适当的xsi:type声明来使用这些类型。CDA的大多数实现无须深入研究收集数据类型的细节就可以理解。其中的聚集数据类型只处理数量(包括时间戳)和编码概念,不处理多媒体、文本或人口统计数据类型。
关于使用聚集数据类型,比较困难的事情之一是确定在CDA模式中使用哪种类型来表示聚集组件。这是因为datatypes.xsd模式只定义了表示各种聚集类型所需的数据类型,而没有为更受约束的使用创建类型。例如,PQ的一个区间可以表示单个物理量,也可以表示一系列物理量。因此,模式中定义了一种支持一组PQ区间(BXIT_IVL_PQ)的类型,但没有定义只支持一组PQ的类型。
(一)包
一个包(BAG bag)是一个无序的项目集合,可以复制。在XML中,任何数据类型的包通常都是使用与包相关的数据类型,将其编写为项目序列。顺序并不重要,因此可以按不同的顺序将这些信息写出来,而不改变其含义。CDA标准不直接使用BAG数据类型。可以使用BXIT_CD数据类型在〈value〉元素中使用代码包。由于所有编码数据类型都来自CD,因此可以使用该类型创建包含更简单编码类型的包。物理量、整数或实数的包应该在数据类型中使用BXIT_IVL_PQ的datatypes.xsd模式。这是因为IVL_PQ也可以用来表示PQ,而PQ足以表示实数或整数。这种类型足以表示信息,但不会将实现限制为通过模式使用PQ、INT或真实表示,必须使用其他技术应用这些限制。
(二)集合
集合(set)是唯一项的无序集合,其中每个项可能不会重复。在CDA XML实例中,任何数据类型的集合通常都是使用与该集合相关联的数据类型作为项的序列编写的。像包一样,项目设置的顺序并不重要,因此信息可以以不同的顺序写出来,没有任何意义的变化。在CDA 2.0版本中,set类型与地址、名称、标识符、通信地址以及大多数参与方和act关系一起使用,但这些是模式中的匿名类型。匿名类型是在模式中以不允许在其他地方重用的方式在本地定义的类型。但不妨碍在CDA实例中包含这些数据类型的集合,因为有些数据元素(如〈observation〉中的〈value〉元素)允许使用任何数据类型,只需重复〈value〉元素多次,并使用set成员类型(如ADDR、PN、II、TEL等)即可。set集合类型也可以用于连续的范围(如实数或物理量)。CDA中这种功能最常用的地方是出现通用时间规范(general timing specification,GTS),GTS只是一组时间戳。集合可以通过各种集合操作创建,包括联合、差异和与另一个集合的交集。在CDA标准的datatypes.xsd模式中定义的各种SXCM类型,可用于创建代码、整数、实数、时间戳或物理量集。
(三)间隔
间隔(IVL)是一个从一点到另一点的范围,另一种类型的集合也是。间隔只能用于HL7数据类型,这些数据类型表示数量,在数量型数据类中有详细的描述。
(四)列表
列表(list)是可重复项的有序集合。在XML中,任何数据类型的列表都是按照适当的顺序使用与该列表相关联的数据类型以项目序列的形式编写的。由于顺序很重要,因此必须按照与原始顺序相同的顺序将此信息写回,以避免含义被更改。在CDA中,列表集合类型只出现在〈regionOfInterest〉元素中的〈value〉元素中。这些值用于指定图像上的坐标。但是,LIST也可以用作〈observation〉元素中〈value〉的数据类型。HL7定义了另外两种列表数据类型——生成的列表(GLIST)和抽样列表(SLIST)。GLIST数据类型通过算法生成一个列表,非常类似于许多编程语言中的FOR语句。采样列表允许使用原始输出传输来自采样设备(如连接到某个输入信号的模拟到数字信号转换器)的数据。