3. 源数据系统剖析
在FHIR资源映射工程中,源系统剖析是决定映射策略成败的前置环节。不同源系统的结构范式差异极大:HL7 V2是事件驱动的段-字段消息流,C-CDA是层级化的XML临床文档,关系型数据库是规范化表结构,CSV/JSON则常以扁平或半结构化形式出现。若跳过源系统剖析直接编写映射规则,往往会在字段语义、基数约束、编码体系上反复返工。本节围绕四类常见源系统的结构特征、数据质量评估方法和映射前准备清单展开。
一、四类源系统的结构特征
HL7 V2消息以消息类型(如ADT^A01、ORU^R01)和触发事件为核心,采用段(Segment)、字段(Field)、组件(Component)、子组件(Sub-component)四级分隔结构,分隔符由MSH段定义。其关键特征是:同一语义字段在不同消息类型中位置可能不同;字段可重复(如PID-3患者标识符可重复出现);字段可空但位置必须保留;编码值常以CE/CWE类型携带本地编码与标准编码双轨。映射时需先解析MSH-1、MSH-2确定分隔符,再按消息结构定义逐段提取。
C-CDA文档是HL7 CDA R2的约束实现,采用XML树形结构,由header和body组成。header承载患者、作者、保管机构等文档级元数据;body通过section嵌套组织临床内容,section内可含text叙述块和entry条目。entry中的clinicalStatement(如observation、substanceAdministration)是结构化数据的主要来源。C-CDA的难点在于:同一临床概念可能同时存在于text和entry中,且templateId决定了解析路径;nullFlavor用于表达“未知”“未做”等否定语义,不能简单当作空值处理。
关系型数据库以表、主外键、约束和索引为特征,数据高度规范化。映射前需梳理目标临床概念涉及的表连接路径,识别主键、外键、状态字段和软删除标记。常见陷阱包括:代码字段使用本地字典表而非标准编码;日期时间以字符串或时间戳存储且时区不明确;患者标识分散在多个表且存在合并历史。
CSV/JSON结构灵活但约束弱。CSV依赖首行表头和分隔约定,JSON依赖键名和嵌套层级。两者常见问题是:同一字段在不同文件中命名不一致;日期格式混杂;布尔值以“Y/N”“1/0”“true/false”多种形式出现;JSON数组与单值混用。映射前必须建立字段名到FHIR路径的对照表,并明确空值、缺失和默认值的处理规则。
二、数据质量评估方法
数据质量评估应围绕完整性、一致性、准确性、唯一性四个维度展开,且必须用真实样本数据量化,而非凭印象判断。
完整性:统计必填字段的缺失率。例如对1000条ADT^A01消息检查PID-5(患者姓名)、PID-7(出生日期)、PID-8(性别)的空值比例。若PID-7缺失率超过5%,需在映射规则中定义“出生日期未知”时的FHIR处理方式(如不生成birthDate或使用dataAbsentReason)。对C-CDA,需统计nullFlavor出现频率,区分“未记录”与“明确否定”。
一致性:检查编码体系是否统一。例如同一检验项目在部分消息中使用LOINC、部分使用本地码,需建立本地码到LOINC的映射表。日期格式需统一为ISO 8601(YYYY-MM-DDTHH:MM:SS+时区),对V2的YYYYMMDDHHMMSS格式和数据库的字符串日期分别编写转换规则。
准确性:通过值域校验和逻辑矛盾检测发现异常。例如性别字段出现“M/F/O/U”之外的值;出院日期早于入院日期;检验结果值超出仪器参考范围。这些异常需在映射前标记,决定是修正、丢弃还是保留并标注数据质量问题。
唯一性:识别患者主索引重复。V2中PID-3可携带多个标识符(病历号、身份证号、医保号),需确定哪个作为FHIR Patient.identifier的首选。数据库中需检查患者表是否存在同一身份证号多条记录,以及合并历史表是否影响当前有效标识。
三、映射前准备清单
完成源系统剖析和数据质量评估后,应形成一份可执行的映射前准备清单,作为后续映射规则编写的输入。清单至少包含以下五项:
- 字段对照表:逐字段列出源系统字段名、数据类型、示例值、目标FHIR资源与路径、转换规则说明。例如V2 PID-7 → Patient.birthDate,转换规则为“YYYYMMDD → YYYY-MM-DD,空值不生成”。
- 编码映射表:列出所有需要转换的编码字段,包括源编码体系、源编码值、目标编码体系(LOINC/SNOMED CT/ICD-10等)、目标编码值、映射状态(已确认/待确认/无对应)。
- 空值与缺失处理规则:明确区分“字段不存在”“字段存在但为空”“字段值为nullFlavor”“字段值为明确否定”四种情况,并规定每种情况在FHIR中的表达方式。
- 基数与约束对齐表:列出源系统字段的重复性(0..1、0..*、1..1)与目标FHIR元素的基数,标记不匹配项及处理策略。例如V2中患者标识可重复,FHIR Patient.identifier为0..*,可直接映射;但若源系统某字段为1..1而目标为0..1,需确认是否允许丢弃。
- 样本数据集:选取覆盖正常值、边界值、异常值的样本记录,用于映射规则编写后的验证。样本应包含至少一条完整记录、一条含空值记录、一条含异常编码记录。
以某医院ADT消息映射为例:源系统为HL7 V2.4 ADT^A01,目标为FHIR R4 Patient资源。剖析发现PID-3有3个重复标识符(病历号、身份证号、医保号),PID-7出生日期缺失率2.3%,PID-8性别存在“U”值,PID-11地址为自由文本。数据质量评估后,准备清单中明确:PID-3取第一个标识符作为Patient.identifier,其余作为secondary identifier;PID-7缺失时不生成birthDate;PID-8的“U”映射为unknown;PID-11需拆分为line、city、state、postalCode,拆分规则基于逗号分隔并人工校验。该清单直接指导了后续映射规则的编写和测试用例设计。
源系统剖析的深度决定了映射工程的稳健性。对四类源系统分别建立结构认知、完成量化质量评估、输出可执行的准备清单,才能让FHIR资源映射从“能跑通”走向“可维护、可验证”。