Fall 2026
2026-09-11
The Observational Medical Outcomes Partnership (OMOP) Common Data Model (CDM) is an open community data standard, designed to standardize the structure and content of observational data and to enable efficient analyses that can produce reliable evidence
The OMOP Common Data Model organizes data into clinical event tables (facts about a patient over time), a person/demographic table, and standardized vocabulary tables
Every clinical fact is represented using a standard concept, which is why most columns end in _concept_id and resolve through concept
One row per patient, this is the anchor table every other table joins back to via person_id
| Column | Description |
|---|---|
person_id |
Unique patient identifier (primary key) |
gender_concept_id |
Standard concept for sex/gender |
year_of_birth, month_of_birth, day_of_birth |
Birth date components |
race_concept_id, ethnicity_concept_id |
Standard demographic concepts |
location_id |
FK to location (address/geography) |
provider_id |
FK to provider (usual care provider) |
care_site_id |
FK to care_site (usual site of care) |
Defines the span(s) of time during which a patient’s data is considered complete/observable. Critical for cohort eligibility and lookback/washout logic.
| Column | Description |
|---|---|
observation_period_id |
Primary key |
person_id |
FK to person |
observation_period_start_date |
Start of observable window |
observation_period_end_date |
End of observable window |
period_type_concept_id |
How the period was derived (e.g., from EHR, insurance enrollment) |
One row per patient encounter (inpatient stay, outpatient visit, ER visit, etc.). Most clinical event tables optionally link back to the visit during which they occurred.
| Column | Description |
|---|---|
visit_occurrence_id |
Primary key |
person_id |
FK to person |
visit_concept_id |
Type of visit (inpatient, outpatient, ER, etc.) |
visit_start_date / visit_end_date |
Encounter start/end |
visit_type_concept_id |
Provenance of the visit record |
care_site_id |
FK to care_site |
admitted_from_concept_id, discharged_to_concept_id |
Admission/discharge disposition |
Diagnoses - problems, complaints, and clinical impressions recorded for a patient.
| Column | Description |
|---|---|
condition_occurrence_id |
Primary key |
person_id |
FK to person |
condition_concept_id |
Standard concept for the diagnosis (joins to concept) |
condition_start_date / condition_end_date |
Onset/resolution dates |
condition_type_concept_id |
Provenance (e.g., primary diagnosis, billing code) |
visit_occurrence_id |
FK to the visit during which it was recorded |
condition_status_concept_id |
e.g., admitting vs. final diagnosis |
Records of drug utilization - prescriptions, administrations, and dispensations.
| Column | Description |
|---|---|
drug_exposure_id |
Primary key |
person_id |
FK to person |
drug_concept_id |
Standard concept for the drug (joins to concept, typically RxNorm) |
drug_exposure_start_date / drug_exposure_end_date |
Exposure window |
quantity, days_supply, refills |
Dosing/supply details |
route_concept_id |
Route of administration |
visit_occurrence_id |
FK to the visit during which it was prescribed/administered |
Quantitative and qualitative clinical measurements - labs, vitals, and other structured test results.
| Column | Description |
|---|---|
measurement_id |
Primary key |
person_id |
FK to person |
measurement_concept_id |
Standard concept for the test (joins to concept, typically LOINC) |
measurement_date / measurement_datetime |
When the measurement was taken |
value_as_number |
Numeric result (e.g., lab value) |
value_as_concept_id |
Coded result, when the value isn’t numeric |
unit_concept_id |
Unit of measure |
range_low, range_high |
Reference range for the test |
Records of procedures performed - surgeries, imaging, therapeutic interventions.
| Column | Description |
|---|---|
procedure_occurrence_id |
Primary key |
person_id |
FK to person |
procedure_concept_id |
Standard concept for the procedure |
procedure_date |
When the procedure occurred |
visit_occurrence_id |
FK to the associated visit |
A catch-all clinical fact table for observations that don’t fit condition/drug/procedure/measurement - e.g., family history, social history, survey responses.
| Column | Description |
|---|---|
observation_id |
Primary key |
person_id |
FK to person |
observation_concept_id |
Standard concept for what was observed |
observation_date |
Date of the observation |
value_as_number, value_as_string, value_as_concept_id |
Result, in whichever form applies |
The vocabulary backbone of OMOP (Standardized Vocabulary). Every *_concept_id column across every table is a foreign key into this table.
| Column | Description |
|---|---|
concept_id |
Primary key - the number stored in every event table |
concept_name |
Human-readable name |
domain_id |
Which clinical area it belongs to (Condition, Drug, Measurement, etc.) |
vocabulary_id |
Source vocabulary (SNOMED, RxNorm, LOINC, ICD10CM, etc.) |
concept_class_id |
Finer-grained classification within the vocabulary |
standard_concept |
'S' if this is the standard concept to use for analysis |
concept_code |
The original code within its source vocabulary |
OMOP maps heterogeneous source codes (ICD-10, local lab codes, etc.) onto a single standard vocabulary per domain, so analytic queries only need to filter on standard concept_id values
The concept_relationship and concept_ancestor tables support mapping between source and standard, and traversing concept hierarchies (e.g., “all descendants of Type 2 Diabetes”)
Every clinical event table has a person_id (who) and usually a visit_occurrence_id (during which visit), and every *_concept_id resolves through concept (what, in standardized concept term)