VN Core Deep Dive

How to read a VN Core Profile

A Profile is where VN Core turns FHIR base into a Vietnam data contract. Reading a profile correctly tells you which elements are required, which are Must Support, which codes are allowed, which extensions matter, and which examples prove valid payloads.

TL;DR

  • Read differential before snapshot. Differential shows what VN Core added; snapshot is mainly for tooling.
  • Must Support is not the same as required. Required is cardinality min > 0; Must Support is a system obligation within the IG scope.
  • Slicing is where Vietnam identifiers become explicit. Patient.identifier may contain CCCD, BHYT, BHXH, MRN, birth certificate, and passport slices.
  • Read binding with its ValueSet. Coding.display is for rendering; system + code + version carries machine-readable meaning.

1. Eight signals to read on every Profile

Canonical URL

The stable profile identifier. Instances declare it in `meta.profile`; validators use it to select constraints.

Differential

The part VN Core actually adds or tightens relative to the base or parent profile. Read this first.

Snapshot

The full merged structure after base + differential. Essential for validators, too long as a first read.

Cardinality

How often an element may appear. `1..1` means exactly once; `0..*` means optional and repeatable.

Must Support

Systems in scope of the IG must understand and handle the element; this does not mean it always appears.

Slicing

Partitioning arrays such as `identifier[]` into meaningful slices: CCCD, BHYT, BHXH, MRN.

Binding

Constraining a coded element to a ValueSet. Binding, not `display`, decides machine-readable validity.

Example

The fastest way to understand profile use in a real workflow and avoid reference or slice mistakes.

2. Must Support versus cardinality

Cardinality answers whether an instance must contain an element. If an element is 1..1, a payload missing that element will not validate. If it is 0..1, the payload may omit it and remain valid.

Must Support answers whether systems in the IG scope must understand and handle the element. A 0..1 MS element may be absent in an individual payload, but a conforming VN Core system must not ignore it when present.

Review rule: do not scan only for 1..1. Read the Must Support column and capability narrative as well. Vendors can pass validation while still failing a workflow if they ignore Must Support data.

3. Identifier slicing: Vietnam Patient example

FHIR base only says Patient.identifier is an array of identifiers. VN Core must distinguish identifier types because each has a different authority, format, and workflow. Slicing lets the same array carry named slices:

Patient.identifier
  ├── identifier[CCCD]  system = .../sid/cccd   value = 12 digits
  ├── identifier[BHYT]  system = .../sid/bhyt   value = BHYT card number
  ├── identifier[BHXH]  system = .../sid/bhxh   value = 10 digits
  ├── identifier[MRN]   system = hospital MRN   value = local medical record number
  └── identifier[GKS]   system = birth certificate value = certificate number

When a HIS adapter sends Patient data, the validator checks not only that identifier exists, but also which slice matches, whether the system URI is correct, whether the value matches the expected pattern, and whether slice cardinalities are satisfied.

4. Binding and terminology

Coded elements such as Condition.code, Observation.code, Patient.gender, or ethnicity extensions are not free-text fields. The profile binds them to a ValueSet with a binding strength. With required, the code must be in the ValueSet. With extensible, systems should use the ValueSet when a suitable code exists and only go outside it for a real gap.

In Vietnam data, binding is especially important because the same display label may appear in multiple code systems. "01", "DN", or "I10" only become unambiguous with the right system. That is why VN Core maintains separate CodeSystems and ValueSets for each domain.

5. Checklist before claiming VN Core conformance

The payload declares the correct `meta.profile` for the profile being validated.
Identifiers use the correct `system` URI, not only a plausible value format.
Required elements are present; Must Support elements are handled when present.
CodeableConcept values use the correct `system + code`; decisions do not depend on `display`.
Extensions use the correct canonical URL and the expected value[x] type.
References point to resources/profiles in the expected scope, not arbitrary string IDs.
Examples pass validation with the VN Core package version used by the release.