在上一篇文章中,我們認識了Reference,了解Patient、Encounter及Observation等不同Resource如何互相連結。
但是,系統知道一筆Observation屬於哪位病人,仍然不代表它能理解Observation記錄的是什麼。
例如:
{
"code": {
"text": "血糖"
},
"valueQuantity": {
"value": 95,
"unit": "mg/dL"
}
}
人類看到「血糖」兩個字,大概可以理解這是一筆血糖檢驗結果。
但對電腦來說,仍然可能存在許多問題:
為了讓不同系統對醫療資料有更一致的理解,我們需要使用標準化的醫療代碼。
假設三家醫院都在記錄高血壓診斷:
| 醫院 | 記錄內容 |
|---|---|
| A醫院 | 高血壓 |
| B醫院 | Hypertension |
| C醫院 | HTN |
人類可以判斷這些文字可能在描述相同或相近的疾病,但電腦不一定知道。
系統如果只使用文字比對:
高血壓 = Hypertension = HTN
就必須另外建立大量對照規則。
除此之外,自由文字還可能受到以下因素影響:
例如:
第二型糖尿病
第2型糖尿病
Type 2 diabetes
T2DM
如果只依靠文字,系統可能把這些內容當成不同疾病。
標準代碼的作用,是替特定醫療概念提供較一致的識別方式。
例如,在特定ICD-10分類中,原發性高血壓可以使用:
I10
系統除了記錄代碼,也可以保留方便人類閱讀的文字:
{
"system": "http://hl7.org/fhir/sid/icd-10",
"code": "I10",
"display": "Essential (primary) hypertension"
}
其中:
system說明代碼來自哪一套代碼系統。code是電腦主要使用的代碼。display是適合人類閱讀的名稱。這樣即使不同系統顯示「高血壓」、「Hypertension」或其他語言,仍然可以透過相同的system及code辨認概念。
不過,ICD有不同版本及各國修訂版本,實際使用時必須確認採用的版本與規則,不能只看到代碼相同就直接認定意義完全一致。
假設收到:
{
"code": "12345"
}
這個代碼代表什麼?
它可能是:
不同代碼系統可能出現相同的字母或數字,因此不能只看code。
FHIR中的Coding通常會搭配system:
{
"system": "https://hospital.example.org/CodeSystem/local-test",
"code": "12345",
"display": "範例檢驗項目"
}
system就像代碼所屬的字典,code則像字典中的編號。
可以將兩者一起看成:
代碼系統+代碼=較明確的醫療概念
醫療領域有許多不同代碼系統,因為疾病、檢驗、臨床術語及藥品的用途並不相同。
今天先認識幾種常見名稱。
ICD的全名是:
International Classification of Diseases
中文通常稱為「國際疾病分類」。
ICD由世界衛生組織WHO維護,主要用於疾病、健康問題及死亡原因的分類、記錄、統計與報告。
常見版本包括:
ICD可以應用於:
ICD的重要價值之一,是讓不同醫院、地區及國家能以較一致的方式記錄及比較疾病資料。
不過,ICD主要是一套分類系統,不等於完整描述所有臨床細節的醫療術語系統。
LOINC的全名是:
Logical Observation Identifiers Names and Codes
LOINC主要用來識別健康觀察、測量、檢驗項目及醫療文件。
可能使用LOINC的資料包括:
例如,體溫可以使用LOINC代碼:
8310-5
在FHIR Observation中,可以這樣表示:
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "體溫"
}
這表示這筆Observation的測量項目是體溫。
需要注意,LOINC主要識別「測量的是什麼」,而測量結果的數值及單位會放在其他欄位。
例如:
"valueQuantity": {
"value": 37.2,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
}
組合後才能完整表達:
測量項目是體溫,測量結果是37.2°C。
SNOMED CT是一套內容廣泛的臨床醫療術語系統。
它可以表達許多臨床概念,例如:
SNOMED CT的目的不只是將疾病分成統計類別,也能較細緻地描述臨床照護中的概念。
因此,ICD與SNOMED CT雖然都可能描述疾病,但用途並不完全相同:
| 系統 | 主要特色 |
|---|---|
| ICD | 疾病分類、統計及報告 |
| SNOMED CT | 詳細表達臨床醫療概念 |
實務上可能需要將SNOMED CT概念對應到ICD分類,但對應並不一定永遠是一對一,也需要依照版本及使用目的處理。
相同藥物可能同時具有:
假設只記錄:
某某錠
接收方可能無法確定:
因此,交換藥物資料時,也需要清楚表示代碼系統、藥品代碼、顯示名稱、劑型及劑量等資訊。
本系列後續介紹MedicationRequest時,會再回到用藥資料的表達方式。
醫院可以依照自己的作業需要建立院內代碼。
例如,A醫院將體溫設定為:
TEMP001
B醫院則使用:
VITAL-T
這些代碼在院內可能運作得很好,但傳到其他醫院後,對方不一定知道它們代表體溫。
因此,系統可能需要建立對應關係:
| 院內代碼 | 標準代碼 | 意義 |
|---|---|---|
TEMP001 |
LOINC 8310-5 |
體溫 |
VITAL-T |
LOINC 8310-5 |
體溫 |
這個將本地代碼連結到標準代碼的過程,通常稱為Mapping。
Mapping不是單純將名稱翻譯成英文,而是要確認兩個代碼代表的概念是否真的相同。
在Day 10中曾經介紹過Coding資料型別。
完整一點的Coding可能包含:
{
"system": "http://loinc.org",
"version": "範例版本",
"code": "8310-5",
"display": "Body temperature",
"userSelected": true
}
常見欄位包括:
| 欄位 | 用途 |
|---|---|
system |
代碼系統的識別URI |
version |
使用的代碼系統版本 |
code |
實際代碼 |
display |
方便人類閱讀的名稱 |
userSelected |
是否由使用者直接選擇 |
"system": "http://loinc.org"
表示這個代碼來自LOINC。
"code": "8310-5"
是電腦用來辨認概念的代碼。
"display": "Body temperature"
提供方便人類閱讀的文字。
display可能因語言或顯示需求不同而改變,但不能任意改變code原本代表的概念。
CodeableConcept可以包含一個或多個Coding,也可以包含自由文字text。
例如:
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "體溫"
}
這裡可以拆成:
coding提供標準代碼。text提供目前情境下適合人類閱讀的文字。CodeableConcept的結構是:
CodeableConcept
├── coding
│ ├── system
│ ├── code
│ └── display
└── text
因為同一個醫療概念可能同時使用多套代碼表示。
例如:
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
},
{
"system": "https://hospital.example.org/CodeSystem/local-observation",
"code": "TEMP001",
"display": "體溫"
}
],
"text": "體溫"
}
這表示同一項體溫測量同時具有:
如此一來,院內系統可以繼續使用原有代碼,對外交換時也能提供標準代碼。
| 資料型別 | 主要用途 |
|---|---|
| Coding | 表示某個CodeSystem中的一組代碼 |
| CodeableConcept | 表示一個概念,可包含多組Coding及文字 |
Coding範例:
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
CodeableConcept範例:
{
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "體溫"
}
可以將CodeableConcept想成一個盒子,裡面能放入一組或多組Coding,另外再附上一段文字說明。
CodeSystem用來定義一套代碼以及每個代碼的意義。
例如,一套簡單的就醫類型代碼可能包含:
| code | display |
|---|---|
OPD |
門診 |
ER |
急診 |
IMP |
住院 |
CodeSystem會回答:
這套代碼中有哪些代碼?每個代碼代表什麼?
在FHIR中,CodeSystem本身也是一種Resource,可以描述:
ValueSet則是針對特定使用情境,選出允許或適合使用的一組代碼。
它可以:
例如,假設某個CodeSystem共有很多醫療服務代碼,但「就醫類型」欄位只允許:
就可以建立一個ValueSet,只收錄這三個代碼。
可以用字典和選單來比喻:
CodeSystem定義代碼,ValueSet則決定特定情境可以選哪些代碼。
FHIR會將某些code、Coding或CodeableConcept欄位綁定到ValueSet,這個關係稱為Terminology Binding。
不同欄位對ValueSet的要求程度可能不同,FHIR R4常見的Binding Strength包括:
| 強度 | 基本概念 |
|---|---|
required |
必須使用指定ValueSet中的代碼 |
extensible |
如果ValueSet中有合適代碼,應優先使用 |
preferred |
建議使用,但允許其他代碼 |
example |
提供範例用途,不是強制要求 |
因此,看到FHIR欄位資料型別是code,還不能立刻知道可以填入哪些值,仍然要查看該欄位綁定的ValueSet及強度。
將前面學過的Reference、CodeableConcept、dateTime及Quantity組合,可以得到:
{
"resourceType": "Observation",
"id": "temperature-001",
"status": "final",
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "體溫"
},
"subject": {
"reference": "Patient/patient-001",
"display": "王小明"
},
"effectiveDateTime": "2026-09-03T09:30:00+08:00",
"valueQuantity": {
"value": 37.2,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
}
}
可以拆成:
| 欄位 | 表達內容 |
|---|---|
status |
結果狀態為final |
code |
測量項目是體溫 |
subject |
資料屬於王小明 |
effectiveDateTime |
測量時間 |
valueQuantity.value |
測量值為37.2 |
valueQuantity.unit |
顯示單位為°C |
valueQuantity.code |
UCUM單位代碼為Cel |
這筆資料同時使用標準檢驗或觀察代碼及標準單位,讓接收方不只看到「37.2」,也能知道它代表體溫37.2°C。
假設兩筆資料都顯示「血糖」,但實際代碼不同。
這可能是因為:
因此,不能只看display或text相同,就直接判定兩筆資料完全相同。
選擇代碼時需要確認實際的檢體、方法、時間及臨床意義。
不同系統可以透過共同的system及code辨認資料。
介面可以顯示中文或英文,但仍保留相同代碼。
系統可以依照代碼搜尋特定疾病或檢驗項目。
標準化資料較容易進行跨院或跨地區比較。
系統能利用代碼辨認特定診斷、過敏或檢驗結果,進一步提供提醒。
避免因簡稱、拼字、語言及輸入方式不同而無法比對。
標準代碼不能自動解決所有問題,實際使用時仍要注意:
因此,醫療代碼的Mapping及維護通常需要醫療、資訊及編碼專業人員共同處理,不能只依靠名稱相似就自動對應。
請觀察以下CodeableConcept:
{
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
},
{
"system": "https://hospital.example.org/CodeSystem/local-observation",
"code": "TEMP001",
"display": "體溫"
}
],
"text": "病人體溫"
}
可以找出:
coding中有兩組Coding。text提供目前情境下的人類可讀文字。今天認識了醫療代碼的重要性。
自由文字適合人類閱讀,但可能受到語言、縮寫、同義詞及拼字差異影響。標準代碼則能透過system與code,讓不同系統更準確地辨認醫療概念。
今天也認識了:
我認為今天最重要的觀念是:
代碼不能只看code,還要一起確認system、版本及使用情境。
完成FHIR資料結構的基礎介紹後,下一篇將開始進入API的世界,先用生活化的方式理解Client、Server、Request、Response及Endpoint。
Day 13|REST API是什麼?用餐廳點餐來理解
World Health Organization:International Classification of Diseases
https://www.who.int/standards/classifications/classification-of-diseases
LOINC:About LOINC
https://loinc.org/about/
SNOMED International:SNOMED CT
https://www.snomed.org/
HL7 FHIR R4:Terminologies
https://hl7.org/fhir/R4/terminologies.html
HL7 FHIR R4:Data Types-Coding及CodeableConcept
https://hl7.org/fhir/R4/datatypes.html#Coding
HL7 FHIR R4:CodeSystem
https://hl7.org/fhir/R4/codesystem.html
HL7 FHIR R4:ValueSet
https://hl7.org/fhir/R4/valueset.html