SNOMED CT Guide
SNOMED CT is the world's most comprehensive clinical terminology, used in EHRs, FHIR, and clinical decision support. Learn the concept model, database design, ICD-10 mapping, and implementation patterns.
What is SNOMED CT?
SNOMED CT (Systematized Nomenclature of Medicine — Clinical Terms) is a structured clinical vocabulary that enables consistent, computable representation of clinical information. Unlike ICD-10 which classifies diseases for billing, SNOMED CT is designed for precise clinical documentation and interoperability.
SNOMED CT contains over 350,000 concepts covering clinical findings, diseases, procedures, body structures, organisms, substances, pharmaceuticals, and more — with 1.5 million descriptions (names) and 2 million relationships linking concepts together in a rich semantic network.
SNOMED CT is required or recommended by US Core FHIR profiles, ONC certification criteria, and numerous national health information exchange frameworks worldwide.
The Three Core Components
Concepts
Each clinical idea is a unique concept with a permanent numeric identifier (SCTID). A concept never changes meaning, and retired concepts are never reused.
Descriptions
Human-readable names for concepts. Each concept has exactly one Fully Specified Name (FSN), one Preferred Term, and optionally many Synonyms — all in multiple languages.
Relationships
Logic-based links between concepts that define their meaning. The "Is a" hierarchy enables subsumption testing — a powerful query feature.
SNOMED CT Hierarchy (Top-Level Concepts)
| SCTID | Top-Level Hierarchy | Examples |
|---|---|---|
| 404684003 | Clinical finding | Diseases, symptoms, lab findings |
| 71388002 | Procedure | Surgeries, medications, lab tests |
| 123037004 | Body structure | Organs, tissue types, anatomical sites |
| 410607006 | Organism | Bacteria, viruses, parasites |
| 105590001 | Substance | Drugs, chemicals, nutrients |
| 373873005 | Pharmaceutical / biologic product | Medication products |
| 308916002 | Environment or geographical location | Healthcare settings |
| 272379006 | Event | Accidents, exposures |
SNOMED CT Database Schema
-- SNOMED CT Concepts
CREATE TABLE snomed_concept (
id BIGINT PRIMARY KEY, -- SCTID (e.g., 44054006)
effective_time DATE NOT NULL,
active BOOLEAN NOT NULL DEFAULT TRUE,
module_id BIGINT, -- Module (e.g., US Extension)
definition_status BIGINT, -- Primitive vs Fully Defined
CONSTRAINT chk_def_status CHECK (definition_status IN (900000000000074008, 900000000000073002))
);
CREATE INDEX idx_snomed_concept_active ON snomed_concept(active);
-- SNOMED CT Descriptions (names/synonyms)
CREATE TABLE snomed_description (
id BIGINT PRIMARY KEY,
effective_time DATE NOT NULL,
active BOOLEAN NOT NULL DEFAULT TRUE,
concept_id BIGINT NOT NULL REFERENCES snomed_concept(id),
language_code CHAR(2) DEFAULT 'en',
type_id BIGINT NOT NULL, -- FSN: 900000000000003001, Synonym: 900000000000013009
term TEXT NOT NULL,
case_significance BIGINT
);
CREATE INDEX idx_desc_concept ON snomed_description(concept_id, active);
CREATE INDEX idx_desc_term ON snomed_description USING gin(to_tsvector('english', term));
-- SNOMED CT Relationships (logical links between concepts)
CREATE TABLE snomed_relationship (
id BIGINT PRIMARY KEY,
effective_time DATE NOT NULL,
active BOOLEAN NOT NULL DEFAULT TRUE,
source_id BIGINT NOT NULL REFERENCES snomed_concept(id),
destination_id BIGINT NOT NULL REFERENCES snomed_concept(id),
relationship_group INTEGER DEFAULT 0,
type_id BIGINT NOT NULL, -- Is a: 116680003, Finding site: 363698007, etc.
characteristic_type BIGINT,
modifier BIGINT
);
CREATE INDEX idx_rel_source ON snomed_relationship(source_id, type_id, active);
CREATE INDEX idx_rel_dest ON snomed_relationship(destination_id, type_id, active);
-- SNOMED to ICD-10 Map (SNOMED refsets)
CREATE TABLE snomed_icd10_map (
id BIGINT PRIMARY KEY,
effective_time DATE NOT NULL,
active BOOLEAN DEFAULT TRUE,
refset_id BIGINT,
referenced_concept BIGINT REFERENCES snomed_concept(id), -- SNOMED SCTID
map_group INTEGER,
map_priority INTEGER,
map_rule TEXT,
map_advice TEXT,
map_target VARCHAR(10), -- ICD-10 code
correlation_id BIGINT
);
CREATE INDEX idx_map_snomed ON snomed_icd10_map(referenced_concept, active);
CREATE INDEX idx_map_icd10 ON snomed_icd10_map(map_target, active);SQL Query Examples
Find All Children of a Concept (Subsumption)
-- Get all diabetes concepts (children of SCTID 73211009)
WITH RECURSIVE diabetes_hierarchy AS (
-- Base: the parent concept
SELECT id, 73211009 AS parent_id
FROM snomed_concept
WHERE id = 73211009 AND active = TRUE
UNION ALL
-- Recursive: all "Is a" children
SELECT r.source_id, r.destination_id
FROM snomed_relationship r
JOIN diabetes_hierarchy dh ON r.destination_id = dh.id
WHERE r.type_id = 116680003 -- "Is a" relationship
AND r.active = TRUE
)
SELECT
dh.id AS sctid,
d.term AS preferred_term
FROM diabetes_hierarchy dh
JOIN snomed_description d ON d.concept_id = dh.id
AND d.type_id = 900000000000013009 -- Synonym type
AND d.active = TRUE
ORDER BY d.term;Map SNOMED Concept to ICD-10
-- Get ICD-10 equivalent for a SNOMED concept SELECT sc.id AS snomed_id, sd.term AS snomed_term, sim.map_target AS icd10_code, sim.map_group, sim.map_priority, sim.map_advice FROM snomed_concept sc JOIN snomed_description sd ON sd.concept_id = sc.id AND sd.type_id = 900000000000013009 -- Synonym AND sd.active = TRUE JOIN snomed_icd10_map sim ON sim.referenced_concept = sc.id AND sim.active = TRUE WHERE sc.id = 44054006 -- Type 2 Diabetes ORDER BY sim.map_group, sim.map_priority;
SNOMED CT Best Practices
- •Always store SCTIDs, not terms: Terms change between releases; SCTIDs are permanent. Store the SCTID and look up display text at render time
- •Use the Preferred Term for display: The Preferred Term (not FSN) is appropriate for clinical display — FSNs include semantic tags like "(disorder)" intended for disambiguation
- •Leverage subsumption for queries: Query using "Is a" hierarchies to find all related concepts — "find all patients with any type of diabetes" should traverse the concept hierarchy
- •Update releases regularly: SNOMED CT is released monthly (International) — new concepts are added, old ones retired. Keep your release current
- •Map to ICD-10 for billing: Use the official SNOMED-to-ICD-10 maps maintained by NLM for billing translation — don't create ad-hoc mappings
Frequently Asked Questions
What is SNOMED CT?
SNOMED CT (Systematized Nomenclature of Medicine — Clinical Terms) is the world's most comprehensive multilingual clinical healthcare terminology. It provides a consistent way to represent clinical content in EHRs, covering diseases, findings, procedures, body structures, substances, and more. It is maintained by SNOMED International.
What is the difference between SNOMED CT and ICD-10?
ICD-10 is primarily a classification system for billing and statistical reporting — each condition maps to a single code. SNOMED CT is a rich clinical terminology for precise clinical documentation — a single condition may have multiple representations. Many systems use SNOMED CT for data entry and map to ICD-10 for billing.
What is a SNOMED CT concept?
A SNOMED CT concept is a unique clinical idea, identified by a concept ID (SCTID). Each concept has descriptions (human-readable names — one Fully Specified Name and potentially multiple Synonyms) and relationships to other concepts (e.g., "Is a" hierarchy, "Finding site", "Causative agent").
How are SNOMED CT and FHIR related?
SNOMED CT is one of the primary terminology systems used in HL7 FHIR resources. FHIR Coding elements reference SNOMED CT with system "http://snomed.info/sct". US Core and many FHIR Implementation Guides require SNOMED CT for conditions, procedures, and observations.
Is SNOMED CT free to use?
SNOMED CT is free for use in 40+ member countries including the US, UK, Australia, and Canada. US users access SNOMED CT through the NLM (National Library of Medicine). Non-member countries require an Affiliate License from SNOMED International.