前面的文章分別介紹了 Patient、Encounter、Condition、Observation、MedicationRequest 與 DiagnosticReport。
單獨閱讀每一種 Resource 時,可能會覺得它們只是不同種類的資料表格。但在真實的醫療情境中,病人基本資料、就醫紀錄、診斷、檢驗結果與藥物處方並不是互相獨立的。
它們通常共同描述一段完整的醫療過程。
今天將透過一次虛構的門診情境,把前面學過的 Resource 串在一起,理解 FHIR 如何利用 Reference 建立資料之間的關係。
本文中的人物、病情與醫療資料均為虛構內容,只用於說明 FHIR 資料結構,不構成任何醫療建議。
假設有一位虛構病人「王小明」,因為最近經常感到口渴、疲倦,到醫院家醫科門診就醫。
門診過程大致如下:
如果使用傳統方式描述,可能會把全部內容放進一份很大的病歷文件中。
FHIR 的做法則不太一樣。它會將不同種類的醫療資訊分成多個 Resource,再透過 Reference 將它們連結起來。
在這個虛構情境中,可能出現以下 Resource:
| Resource | 在本次門診中代表的內容 |
|---|---|
| Patient | 王小明的病人基本資料 |
| Encounter | 這一次家醫科門診 |
| Practitioner | 負責看診的醫師 |
| Organization | 提供醫療服務的醫院 |
| Condition | 醫師記錄的健康問題或診斷 |
| Observation | 血糖數值等檢驗結果 |
| DiagnosticReport | 整體檢驗報告 |
| MedicationRequest | 醫師開立的用藥醫囑 |
這些 Resource 各自負責描述一類資料。
如果只看到其中一筆 Observation,可能知道某次血糖檢驗的結果,卻不知道這筆結果屬於哪一位病人、發生在哪次門診,也不知道相關報告與診斷是什麼。
Reference 的作用,就是建立這些背景關係。
Patient Resource 用來記錄病人的基本資料,例如:
在這次情境中,Patient 代表王小明本人。
Encounter、Condition、Observation、MedicationRequest 與 DiagnosticReport 等臨床資料,通常都會透過 subject 等欄位連結到 Patient。
這樣系統才能知道:
Patient 可以視為整個病人資料網絡中的核心對象,但它不會直接把所有臨床紀錄放進自己的內容裡。
Encounter 代表一次病人與醫療體系之間的互動,例如門診、急診、住院或遠距診療。
在這個案例中,Encounter 代表:
王小明在某一天前往家醫科接受門診服務。
Encounter 可能包含:
Encounter 會透過 subject 連結到 Patient,也可以透過 participant 連結到參與這次就醫的 Practitioner。
其他臨床 Resource 則可以連回同一筆 Encounter,表示它們是在這次門診中產生的資料。
因此,Encounter 很像這次門診的共同資料夾,協助系統將同一次就醫產生的診斷、檢驗及處方串在一起。
Practitioner Resource 用來描述醫師、護理師、藥師、醫檢師等醫療專業人員。
在一次門診中,醫療人員可能以不同角色出現在不同 Resource:
這些角色不一定全部由同一個人擔任。
例如,門診醫師負責問診與開立檢驗,但實際執行檢驗的可能是醫檢師,確認檢驗報告的也可能是另一位專業人員。
FHIR 透過不同欄位連結 Practitioner,能更清楚表達每位人員在醫療過程中的責任。
Organization Resource 可以表示醫院、診所、檢驗機構、藥局或其他組織。
在這個虛構案例中,Organization 可以代表王小明就診的醫院。
Encounter 可以連結到提供此次醫療服務的機構;DiagnosticReport 也可能包含負責出具報告的單位。
如果檢體被送到院外檢驗機構,門診醫院與檢驗機構甚至可能是不同的 Organization。
所以,Organization 可以協助回答:
Condition Resource 用來表示病人的疾病、診斷或健康問題。
在這個案例中,醫師可能根據病人的症狀及現有資料記錄一項健康問題。若診斷尚未完全確定,也可以透過臨床狀態與確認狀態表達目前的判斷程度。
Condition 通常會連結:
subject:這項健康問題屬於哪位病人encounter:這項問題與哪次就醫有關recorder:由誰記錄asserter:由誰判斷或主張這項狀況同一位病人可能有很多筆 Condition,但只有其中一部分與本次門診直接相關。
透過 Encounter 的連結,系統才能區分這次門診新記錄的問題,以及病人過去已存在的疾病史。
Observation Resource 用來記錄檢驗結果、生命徵象及其他可觀察到的資料。
在這次門診中,Observation 可能代表:
假設王小明接受血糖檢驗,Observation 會說明:
Observation 可以透過 subject 連結 Patient,並透過 encounter 連結這次門診。
如此一來,系統不只知道檢驗數值,也知道它的病人與就醫背景。
一次檢驗報告可能包含不只一個檢驗項目。
例如,一份血液檢驗報告可能包含血糖、肝功能、腎功能及其他數值。每一個檢驗項目可以分別使用 Observation 表達,而 DiagnosticReport 則負責描述整份報告。
DiagnosticReport 可能包含:
其中,result 可以連結到一筆或多筆 Observation。
因此,DiagnosticReport 與 Observation 的關係可以理解為:
需要注意的是,DiagnosticReport 並不是取代 Observation。兩者負責的層次不同,通常會互相配合。
MedicationRequest Resource 用來表示醫師對藥物使用提出的請求或醫囑。
在這次門診中,如果醫師決定開立藥物,MedicationRequest 可能記錄:
MedicationRequest 可以透過:
subject 連結 Patientencounter 連結本次門診requester 連結開立處方的 PractitionerreasonReference 連結相關的 Condition 或 Observation這讓系統可以知道藥物是開給誰、在哪一次門診開立,以及可能與哪項健康問題或檢查結果有關。
不過,MedicationRequest 表達的是「用藥請求或醫囑」,不等於藥品已經完成調劑,也不代表病人實際服用了藥物。不同階段可能需要其他 Resource 表達。
這次虛構門診中的主要連結可以整理如下:
| 起點 Resource | Reference 欄位 | 指向的 Resource | 表達的關係 |
|---|---|---|---|
| Encounter | subject |
Patient | 這次門診屬於哪位病人 |
| Encounter | participant.individual |
Practitioner | 哪位醫療人員參與門診 |
| Encounter | serviceProvider |
Organization | 哪個機構提供服務 |
| Condition | subject |
Patient | 這項健康問題屬於誰 |
| Condition | encounter |
Encounter | 問題與哪次就醫有關 |
| Observation | subject |
Patient | 檢驗結果屬於誰 |
| Observation | encounter |
Encounter | 結果在哪次就醫產生 |
| DiagnosticReport | subject |
Patient | 報告屬於誰 |
| DiagnosticReport | encounter |
Encounter | 報告與哪次就醫有關 |
| DiagnosticReport | result |
Observation | 報告包含哪些檢驗結果 |
| MedicationRequest | subject |
Patient | 藥物開給誰 |
| MedicationRequest | encounter |
Encounter | 處方在哪次就醫開立 |
| MedicationRequest | requester |
Practitioner | 由誰開立藥物 |
| MedicationRequest | reasonReference |
Condition或Observation | 開藥可能依據的原因 |
透過這些 Reference,分散的 Resource 便能共同描述完整的門診過程。
假設每一筆 Observation 都重新寫入病人的完整姓名、生日、地址及電話,可能產生幾個問題。
第一,如果病人的地址變更,就必須修改很多筆資料。
第二,如果不同資料中的姓名或生日不一致,系統就難以判斷哪一筆才正確。
第三,大量重複內容會增加資料儲存與維護負擔。
FHIR 透過 Reference 連結 Patient,使其他 Resource 不需要重複保存全部病人基本資料。
這種設計具有幾個優點:
Reference 並不是把資料複製一份,而是告訴系統應該到哪一筆 Resource 尋找相關內容。
可能有人會疑惑:既然所有資料都已經連結到 Patient,為什麼還需要 Encounter?
因為 Patient 只能說明資料屬於哪個人,Encounter 則能說明資料發生在哪一次就醫。
假設王小明一年內看了五次門診,也做過多次血糖檢驗。所有 Observation 都會連到同一位 Patient,但可以連到不同的 Encounter。
這樣系統才能區分:
Patient 提供人物身分,Encounter 提供醫療事件的情境,兩者不能互相取代。
FHIR 的資料關係不一定都是單向或一對一。
例如:
此外,某些關係可以從不同方向查找。
Observation 可能直接記錄自己所屬的 Encounter,但 Encounter 不一定會列出該次門診產生的每一筆 Observation。系統可以透過 Observation 中的 Reference 與查詢條件找出相關資料。
所以閱讀 FHIR 時,不能只看某個 Resource 裡是否「包含」另一筆資料,還要觀察 Reference 指向哪裡。
如果系統需要一次傳送與門診相關的多筆 Resource,可以使用 Bundle 將它們集合起來,例如:
但 Bundle 只是把多筆 Resource 放在同一個交換單位中,不會自動建立它們的臨床關係。
真正表示「這筆 Observation 屬於哪位病人、與哪次門診有關」的,仍然是 Resource 裡面的 Reference。
因此:
即使這些 Resource 沒有放在同一個 Bundle 裡,只要 Reference 可以被正確解析,它們仍然能維持彼此的關聯。
面對多筆互相連結的 FHIR Resource 時,可以先從幾個問題開始理解。
先找出 Patient,確認其他臨床資料的 subject 是否指向同一位病人。
找出 Encounter,再確認 Condition、Observation、DiagnosticReport 與 MedicationRequest 是否與該次 Encounter 有關。
查看 Condition,了解此次就醫記錄了哪些疾病、診斷或健康問題。
查看 Observation,了解檢驗項目、結果、單位及時間。
查看 DiagnosticReport 的 result,找出報告所包含的 Observation。
查看 MedicationRequest,確認藥物、開立者、用法及相關原因。
沿著 Reference 找出 Practitioner 與 Organization,理解醫療服務的參與者。
透過這個順序,就能從多筆看似分散的 Resource,慢慢還原完整的醫療情境。
不一定。
Resource 可以互相連結,只代表資料之間建立了關係,不代表內容一定正確或完整。
系統仍需確認:
如果 Observation 連到錯誤的 Patient,即使格式完全符合 FHIR,也可能造成嚴重的病人安全問題。
因此,FHIR 資料交換除了結構正確,還必須重視資料品質、身分比對、臨床合理性與資訊安全。
一次門診不會只產生一筆資料,而是由病人、就醫、診斷、檢驗、報告、藥物、醫療人員與醫療機構等多種資訊共同組成。
FHIR 將這些內容拆分成不同 Resource,再透過 Reference 建立彼此的關係:
理解這些連結之後,FHIR 就不再只是許多獨立的 JSON 欄位,而是一張能呈現完整醫療過程的資料網絡。
下一篇將來到系列最後一篇:Day 30|完賽回顧:30天後,我真的看懂 FHIR 了嗎?,回顧這30天學過的觀念,以及醫資學生可以如何繼續認識醫療資料交換。