Skip to main content

Reference data at a glance

The pieces

PieceIs
Lookup typeOne controlled list
Lookup valueOne entry: a stable code and a readable label
Transcode mapTurns a source system's code into the canonical one
HierarchyA levelled classification for rollup

Code versus label

StoredChangeable
CodeYes — on every recordNo — changing it orphans stored data
LabelNo — resolved when readingYes, freely

This separation is why relabelling a value in the interface does not rewrite a single record.

The one confusion worth pre-empting

ConceptLinksCalled
A record → a source system's identifier for itRecordsCrosswalk
A source system's code value → the canonical oneValuesTranscoding

Some platforms use "crosswalk" for the second. This documentation reserves it strictly for the first.

Why transcoding comes before loading

A code that does not resolve against its lookup type is rejected on write. The record does not land carrying a bad value — the load fails. So a source sending USA where the lookup holds US costs you a failed load, not a quietly mis-scored match.

Transcoding is what turns that rejection into a successful load, by mapping the source's code to the canonical one first.

Transcoding applies on single-record writes, not bulk

The source-system mapping is consulted when a record is created or patched one at a time and the caller identified its source system. A bulk load resolves codes strictly and directly, so translate values before submitting them.

Retire, do not delete

A value in use keeps resolving on historical records after retirement. Deleting it leaves those records displaying a bare code — the records are not wrong, the vocabulary is now incomplete.

Two things both called hierarchy

ConceptIsUsed for
Value treeA value referencing a parent valueConstraining permitted values
Levelled hierarchyA named structure with ordered levelsClassification and rollup

Both are legitimate; they answer different questions.

Next


Last verified against commit 1e1de1ad (2026-08-03)