Reference (Encounter); Observation: CodeableConcept vs Coding
Cara resource saling merujuk, dan JSON Observation yang kemungkinan besar ditunjukkan interviewer
Di lesson 0004 Anda membedakan id dan identifier. Sekarang kita lihat bagaimana resource memakai keduanya untuk saling merujuk (lewat Encounter), lalu membaca nilai berkode di Observation.
status, code, subject, valueQuantity, membedakan Coding dan CodeableConcept,
menjelaskan bahwa beberapa Coding adalah translasi konsep yang sama, serta menyebut bentuk Reference (literal, logical, display).
Semua JSON di lesson ini diadaptasi (dipendekkan) dari contoh resmi spesifikasi FHIR R4 (4.0.1); tautannya ada di setiap blok. Tanpa lab: cukup baca, jawab kuis, lalu latihan lisan. Kuis di sini adalah feedback cepat; bukti penguasaan hanya dari review campuran 0012.
1. Reference, lewat Encounter (±10 menit)
Encounter adalah "An interaction between a patient and healthcare provider(s) for the purpose of providing healthcare service(s) or assessing the health status of a patient": kunjungan rawat jalan, IGD, rawat inap, kunjungan virtual. [4] Potongan contoh resmi (kunjungan kardiologi): [7]
{
"resourceType": "Encounter",
"id": "f001",
"identifier": [{ "use": "official", "system": "http://www.amc.nl/zorgportal/identifiers/visits", "value": "v1451" }],
"status": "finished", // 1..1, planned | arrived | in-progress | finished | ...
"class": { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "AMB", "display": "ambulatory" }, // R4: Coding, bukan CodeableConcept
"type": [{ "coding": [{ "system": "http://snomed.info/sct", "code": "270427003",
"display": "Patient-initiated encounter" }] }],
"subject": { "reference": "Patient/f001", "display": "P. van de Heuvel" },
"participant": [{ "individual": { "reference": "Practitioner/f002", "display": "P. Voigt" } }],
"length": { "value": 140, "unit": "min", "system": "http://unitsofmeasure.org", "code": "min" },
"reasonCode": [{ "coding": [{ "system": "http://snomed.info/sct", "code": "34068001",
"display": "Heart valve replacement" }] }],
"serviceProvider": { "reference": "Organization/f001", "display": "Burgers University Medical Center" }
}
Tipe Reference berisi "at least one of a reference (literal reference), an identifier (logical reference), and a display (text description of target)". [2]
| Bentuk | Contoh | Kapan |
|---|---|---|
| Literal, relatif | "reference": "Patient/f001" | paling umum; relatif terhadap service base URL (atau fullUrl di Bundle) |
| Literal, absolut | "reference": "http://example.org/fhir/Patient/f001" | resource di server lain |
| Versi tertentu | "Observation/1x2/_history/2" | audit/provenance: menunjuk versi persis, bukan yang terbaru |
| Internal (contained) | "reference": "#p1" | menunjuk resource di contained (lesson 0007) |
| Logical | "identifier": { "system": "http://hl7.org/fhir/sid/us-ssn", "value": "000111111" } | hanya tahu business identifier, tidak tahu URL-nya |
+ display | "display": "P. van de Heuvel" | teks pendek untuk UI, bukan kunci |
Semua contoh tabel dari halaman References. [2]
- Logical reference punya harga: "none of the useful mechanisms described for working with references (e.g. chaining, includes) are possible". Kalau keduanya ada, "the literal reference is preferred". [2]
- Definisi elemen membatasi target:
Observation.subjectadalahReference(Patient | Group | Device | Location),Encounter.subjectadalahReference(Patient | Group). [5] [4] - Padanan JS:
reference≈ foreign key (patientId) yang ditulis sebagai path REST;display≈ kolom nama yang di-denormalisasi supaya UI tidak perlu fetch kedua. Mengambil Patient sekaligus dengan Observation-nya (_include) dibahas di lesson 0009.
Latihan 1 — Reference
2. Observation: CodeableConcept vs Coding (±12 menit)
Ini JSON yang kemungkinan besar ditunjukkan interviewer. Contoh resmi berat badan, utuh kecuali narrative: [6]
{
"resourceType": "Observation",
"id": "example",
"status": "final", // 1..1, modifier (?!)
"category": [{ "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs", "display": "Vital Signs" }] }],
"code": { // 1..1 CodeableConcept: APA yang diukur
"coding": [
{ "system": "http://loinc.org", "code": "29463-7", "display": "Body Weight" },
{ "system": "http://loinc.org", "code": "3141-9", "display": "Body weight Measured" },
{ "system": "http://snomed.info/sct", "code": "27113001", "display": "Body weight" },
{ "system": "http://acme.org/devices/clinical-codes", "code": "body-weight", "display": "Body Weight" }
]
},
"subject": { "reference": "Patient/example" }, // SIAPA
"encounter": { "reference": "Encounter/example" }, // DALAM kunjungan mana
"effectiveDateTime": "2016-03-28", // KAPAN (choice type effective[x])
"valueQuantity": { // HASIL (choice type value[x])
"value": 185, "unit": "lbs", "system": "http://unitsofmeasure.org", "code": "[lb_av]"
}
}
Spesifikasi punya dua tipe untuk nilai berkode: [1]
- Coding: "a simple direct reference to a code defined by a code system":
system(URI code system),version,code,display,userSelected. - CodeableConcept: "a text description and/or a list of Codings":
coding(0..*) +text(0..1).
type Coding = { system?: string; version?: string; code?: string; display?: string; userSelected?: boolean };
type CodeableConcept = { coding?: Coding[]; text?: string };
// Cari berdasarkan system, jangan coding[0]: urutan coding tidak bermakna.
const loinc = (cc: CodeableConcept) => cc.coding?.find(c => c.system === "http://loinc.org")?.code;
// Untuk UI: text dulu, lalu display coding mana pun, lalu code.
const label = (cc: CodeableConcept) => cc.text ?? cc.coding?.find(c => c.display)?.display ?? cc.coding?.[0]?.code;
Kenapa empat Coding? [1]
- "The concept may be coded multiple times in different code systems ... Each coding (also referred to as a 'translation') is a representation of the concept". "There is no meaning associated with the ordering of coding within a CodeableConcept."
- "A typical use of CodeableConcept is to send the local code that the concept was coded with, and also one or more translations to publicly defined code systems such as LOINC or SNOMED CT. Sending local codes is useful and important for the purposes of debugging and integrity auditing."
- Kenapa tidak cukup Coding? Pengalaman HL7: "in the general case, systems need to able to exchange multiple translation codes, and/or an original text." Coding dipakai langsung hanya bila daftar kodenya disepakati semua pihak.
textadalah teks seperti yang dimasukkan/dipilih pengguna; kalau tidak ada coding yanguserSelected, "the text (if present) is the preferred source of meaning". CodeableConcept boleh berisitextsaja bila tidak ada kode yang cocok.- Kode hanya bermakna bersama system: "coded values are always treated as a pair composed of 'system' and 'code'". [3] Kode
Hdi sistem interpretasi berbeda artinya denganHdi sistem lain.
Jebakan versi: di R4, Encounter.class bertipe Coding 1..1, jadi JSON-nya objek { system, code, display } tanpa coding: [...] (lihat bagian 1). [4]
Di R5 elemen itu menjadi CodeableConcept 0..*. [8] Bentuk JSON ditentukan oleh tipe di definisi, jadi baca definisinya, jangan menebak.
Latihan 2 — Coding atau CodeableConcept?
Latihan 3 — Ucapkan dengan suara keras
Pasang timer dan jawab dengan suara keras, seolah sedang interview. Jangan buka jawaban contoh sebelum selesai.
Interviewer menunjukkan JSON Observation berat badan dari bagian 2. "Jelaskan JSON ini. Apa itu CodeableConcept, dan kenapa ada beberapa Coding?" (90 detik)
Bandingkan dengan jawaban contoh dan checklist-nya
"Ini Observation, satu pengukuran: status final, subject merujuk Patient/example dengan reference relatif, dan hasilnya di valueQuantity: 185 dengan unit UCUM.
value[x] adalah choice type, jadi nama property-nya ikut tipe. Apa yang diukur ada di code, bertipe CodeableConcept: daftar Coding plus text opsional.
Setiap Coding adalah pasangan system + code (+ display), dan code hanya bermakna bersama system-nya.
Ada empat Coding karena konsep yang sama dikodekan di beberapa sistem: dua LOINC, satu SNOMED CT, dan satu kode lokal. Itu translasi, urutannya tidak bermakna.
Kode lokal berguna untuk debugging, kode standar untuk interoperabilitas. Di kode saya, saya cari Coding dengan system yang saya butuhkan, misalnya http://loinc.org, bukan mengambil coding[0]."
Checklist: apakah Anda menyebut…
- resource Observation: status, subject (Reference ke Patient), dan nilai di valueQuantity?
- CodeableConcept = daftar Coding plus text; Coding = system + code (+ display)?
- beberapa Coding = konsep sama di beberapa code system (translasi), urutan tidak bermakna?
- LOINC untuk Observation.code dan SNOMED CT / kode lokal sebagai translasi?
- code selalu dibaca bersama system; di kode klien cari berdasarkan system, bukan coding[0]?
- value[x] adalah choice type: nama property ikut tipe (valueQuantity, unit UCUM)?
Lulus kalau minimal 4 dari 6.
Ringkasan untuk dicetak: Reference: Anatomi resource + datatype · Istilah: GLOSSARY.md (bagian "Resource dan datatype")
Ada yang belum jelas? Tanyakan ke saya (agent) di terminal, misalnya: "kapan Observation memakai component alih-alih beberapa Observation?", "bagaimana mengetik resource FHIR di TypeScript tanpa menulis semuanya sendiri?", atau "apa beda ValueSet dan CodeSystem?"
Sumber (semua diakses 26 Oktober 2026): [1] Data Types · [2] Resource References · [3] Using Codes in Resources · [4] Encounter · [5] Observation · [6] Contoh Observation (berat badan) · [7] Contoh Encounter f001 · [8] Encounter (R5)