2. FHIR资源模型精读
FHIR 的资源模型不是一张“大宽表”,而是一组围绕医疗业务边界划分的独立资源。每个资源都有唯一的 resourceType、由 id 标识的实例身份、可选的 meta 元数据,以及一组语义明确的字段。理解核心资源的关键,不是背字段名,而是弄清三件事:这个资源代表什么业务对象、它通过哪些字段描述该对象、它与其他资源如何引用。本节以 Patient、Practitioner、Organization、Encounter、Observation 五个最常用资源为主线,逐层拆解字段语义与引用关系。
一、五个核心资源的业务定位
先建立整体认知:Patient 描述“接受医疗服务的对象”,Practitioner 描述“提供医疗服务的个人”,Organization 描述“承担医疗服务的机构或组织单元”,Encounter 描述“一次具体的医疗服务交互”,Observation 描述“在服务过程中产生的观察测量结果”。这五者构成了最小可用的临床数据骨架:谁(Patient)在什么机构(Organization)由谁(Practitioner)服务,产生了什么交互(Encounter)和什么结果(Observation)。
需要特别强调:FHIR 中“人”和“角色”是分离的。Practitioner 表示医疗从业者这一身份,而 PractitionerRole 才表示“某人在某机构担任某职务、提供某类服务”。初学阶段常把 Practitioner 直接当作“医生”,但在多机构执业场景下,必须通过 PractitionerRole 才能正确表达“张医生在 A 医院是心内科主任医师,在 B 诊所是兼职顾问”。
二、Patient 的字段语义
Patient 的核心字段可分为四组。身份标识组:identifier 承载业务系统分配的患者号、医保号、身份证号等,每个 identifier 通过 system 和 value 唯一确定;active 表示记录是否有效。姓名组:name 是 HumanName 类型,包含 family(姓)、given(名)、text(完整显示名),中文场景下通常 family 填姓、given 填名。人口学组:gender 取 male/female/other/unknown,birthDate 为日期,deceasedBoolean 或 deceasedDateTime 表示死亡状态。联系方式组:telecom 记录电话、邮箱,address 记录地址,contact 记录紧急联系人。
一个常见误区是把患者姓名直接当作唯一标识。正确做法是:用 identifier 做业务主键,用 name 做展示。例如某医院 HIS 中患者号 system 为 http://hospital-a.example/mrn,value 为 P202400123,这才是跨系统交换时可靠的匹配依据。
三、Practitioner 与 Organization 的字段语义
Practitioner 的字段结构与 Patient 高度相似:identifier(执业证号、工号)、name、telecom、address、qualification(资质,含 code、issuer、period)。区别在于 Practitioner 通常不记录 birthDate 和 gender 的完整人口学信息,而更强调专业资质。
Organization 的核心字段包括:identifier(机构代码)、active、type(机构类型,如医院、科室、检验中心)、name、telecom、address,以及 partOf 引用——这是 Organization 最重要的结构字段,用于表达“科室属于医院”“分院属于总院”的层级关系。partOf 指向另一个 Organization,形成树状组织结构。
四、Encounter 的字段语义与状态机
Encounter 描述一次医疗服务交互,其字段围绕“谁、在哪、何时、什么类型、什么状态”展开。status 是 Encounter 的状态机核心,取值包括 planned、arrived、triaged、in-progress、onleave、finished、cancelled 等,表示就诊流程的不同阶段。class 表示就诊类别(住院、门诊、急诊、虚拟),type 表示更细的服务类型。subject 引用 Patient,participant 引用 Practitioner 或相关方,period 记录起止时间,location 引用 Location,serviceProvider 引用 Organization。
Encounter 是连接患者、医生、机构与临床结果的枢纽资源。一次门诊就诊的典型链路是:Patient → Encounter(subject)→ Encounter.participant(Practitioner)→ Encounter.serviceProvider(Organization)→ Observation(encounter 引用回 Encounter)。
五、Observation 的字段语义
Observation 是临床测量与检验结果的核心载体。关键字段包括:status(registered/preliminary/final/amended/cancelled)、category(vital-signs、laboratory、imaging 等)、code(测量项目,通常用 LOINC 编码)、subject(引用 Patient)、encounter(引用 Encounter)、effectiveDateTime(测量时间)、performer(执行者)、valueQuantity 或 valueCodeableConcept 或 valueString(测量值)、interpretation(高低异常判断)、referenceRange(参考范围)。
以血糖为例:code 使用 LOINC 2339-0(Glucose [Mass/volume] in Blood),valueQuantity 为 {value: 5.6, unit: "mmol/L", system: "http://unitsofmeasure.org", code: "mmol/L"},interpretation 为 N(正常),referenceRange 为 3.9–6.1 mmol/L。这样一条 Observation 才能被下游系统正确解析和判读。
六、引用关系全景
五个资源之间的引用关系可以用下图表示。图中实线箭头表示直接引用,箭头旁标注引用字段名;虚线表示通过中间资源间接关联。这张图是理解 FHIR 资源网络的基础。
七、业务映射中的关键判断
把 FHIR 资源映射到实际业务系统时,有三个高频判断点。第一,患者主索引匹配:跨系统交换时不能只靠姓名和生日,应优先使用 identifier 的 system+value 组合,必要时结合 name、gender、birthDate 做模糊匹配,并记录匹配置信度。第二,就诊与检验的关联:Observation 通过 encounter 字段关联到具体就诊,如果业务系统没有就诊号,可以只保留 subject 引用,但会丢失就诊上下文。第三,机构层级:Organization 的 partOf 可以表达科室与医院的关系,但不要用它表达“医生属于科室”——那是 PractitionerRole 的职责。
最后给出一个可直接参考的字段映射检查表,用于验证五个核心资源的关键字段是否完整:
| 资源 | 必查字段 | 典型业务来源 | 常见问题 |
|---|---|---|---|
| Patient | identifier、name、gender、birthDate | HIS 患者主索引 | identifier 缺失或 system 不统一 |
| Practitioner | identifier、name、qualification | HRP / 医师执业注册系统 | 与 PractitionerRole 混淆 |
| Organization | identifier、name、type、partOf | 机构注册 / 科室管理 | partOf 循环引用 |
| Encounter | status、class、subject、period | 挂号 / 住院 / 急诊系统 | status 与业务状态不一致 |
| Observation | status、code、subject、value、effectiveDateTime | LIS / 护理站 / 设备网关 | code 未用标准编码,value 单位缺失 |