2. 医疗数据源与采集层建模
医疗数据分层建模的第一道工程关口,是采集层。采集层不是简单的“把数据抽过来”,而是要在数据源异构、协议多样、时效要求不一的前提下,建立一套可配置、可监控、可追溯的接入机制。理解采集层,必须先理解五类核心数据源在数据形态、更新频率、接口方式和一致性要求上的本质差异。
五类数据源的特征差异
HIS(医院信息系统)是业务主干,承载挂号、收费、医嘱、住院、手术等流程数据。其数据以结构化关系表为主,典型表如 PATIENT_INFO、ORDER_INFO、INP_BILL_DETAIL。HIS 的更新是事务型、高频次的,一条医嘱状态可能经历“开立—审核—执行—停止”多次变更。采集 HIS 时最需要关注的是变更捕获,而非全量快照,否则会产生大量重复数据。
LIS(实验室信息系统)输出检验申请、标本流转、检验结果与危急值。其数据特点是结果型、批次型:一份生化全套可能包含 20~40 个检验项目,每个项目有结果值、单位、参考区间、异常标志。LIS 接口常见 HL7 v2.x 消息或数据库视图,采集时要特别注意结果与申请单的关联键(如 specimen_id、test_order_id),否则会出现“有结果无申请”的孤儿记录。
PACS(影像归档与通信系统)是典型的非结构化数据源。影像文件本身以 DICOM 格式存储,单次 CT 检查可达数百 MB;而影像报告和检查元数据(患者 ID、检查部位、设备、序列号)则以结构化字段存在。PACS 采集通常不直接搬运影像像素,而是通过 DICOM 元数据 + 报告文本 接入,影像本体通过引用路径或对象存储 URL 关联。采集重点是检查级与序列级的层级关系:一次检查(Study)包含多个序列(Series),每个序列包含多张影像(Instance)。
EMR(电子病历)是半结构化与自由文本的混合体。病程记录、入院记录、手术记录多为自然语言文本,而生命体征、护理记录则可能是结构化表格。EMR 采集的难点在于文本中的实体与关系抽取,以及病历文书版本管理——同一份记录可能被多次修改,采集层需要保留版本标识和修改时间,避免覆盖历史。
可穿戴设备与上述四类截然不同。它产生的是高频时序数据:心率、血氧、步数、睡眠分期,采样频率从每秒一次到每分钟一次不等。数据通过蓝牙网关、厂商云 API 或 MQTT 上报,存在断连补传、时间戳漂移、设备时钟不同步等问题。采集层必须处理乱序到达和重复上报,通常以 (device_id, metric, timestamp) 作为去重主键。
采集接口与模式选择
接口选择取决于源系统的开放能力。HIS 和 LIS 通常提供数据库只读账号或 HL7 消息接口;PACS 提供 DICOM C-FIND/C-MOVE 或 WADO-RS;EMR 可能只有文档导出或视图;可穿戴设备则依赖厂商 API 或 MQTT 主题订阅。工程上应优先选择对源系统侵入最小的方式:能读日志就不查表,能订阅就不轮询。
采集模式分为三类。实时流式适用于可穿戴设备、危急值、ICU 监护等秒级场景,典型链路是设备→MQTT Broker→Kafka→Flink 消费,端到端延迟控制在 1~3 秒。准实时微批适用于 HIS 医嘱变更、LIS 结果发布,以 5~15 分钟为窗口做增量拉取,通过水位线(watermark)记录上次采集位置,避免重复和遗漏。批量定时适用于 PACS 元数据同步、EMR 归档病历,通常 T+1 执行,需要设计重跑机制和依赖调度。
实际项目中,混合模式最常见。例如某三甲医院示例方案中,HIS 医嘱采用 5 分钟微批,LIS 危急值走实时流,PACS 元数据 T+1 批量,可穿戴设备走 MQTT 实时接入。这种组合不是随意拼凑,而是根据数据时效价值与源系统负载承受能力共同决定的。
数据接入层设计要点
接入层是采集的“落地缓冲带”,至少包含五个环节:接入缓冲、格式转换、质量校验、元数据登记、监控告警。接入缓冲用 Kafka 或消息队列削峰解耦,防止源系统突发流量冲垮下游;格式转换把 HL7、DICOM、CSV、JSON 统一为内部规范格式,并统一时间戳时区和编码;质量校验检查主键非空、值域合法、关联完整性,不合格数据分流到死信队列而不是直接丢弃;元数据登记记录每个数据源的接口类型、采集频率、字段清单和责任人;监控告警跟踪采集延迟、队列积压和失败率,并支持断点续传与重试。
以 LIS 检验结果接入为例,一个可执行的校验规则可以写成:specimen_id 非空且能在申请表中找到对应记录,result_value 在参考区间内或标记为异常,result_time 不早于 specimen_time。不满足的记录进入死信队列并触发告警,而不是静默写入。这样既保证了数据质量,也保留了问题追溯的线索。
采集层建模的最终目标,是让上层建模与治理工作面对的是可信、可追溯、可重放的数据流,而不是一堆来源不明、格式混乱的原始记录。把采集层做扎实,后续的分层建模才有稳定的地基。