Schéma OMOP v5.4
Source : OHDSI Common Data Model v5.4
Click on a table to see its complete documentation.
PERSON
Table Description
This table serves as the central identity management for all Persons in the database. It contains records that uniquely identify each person or patient, and some demographic information.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
person_id |
It is assumed that every person with a different unique identifier is in fact a different person and data from two different persons should not be combined. | Any person linkage that needs to occur to uniquely identify Persons should happen before writing this table. This identifier can be the original id from the source data provided if it is an integer, otherwise it can be an autogenerated number. | integer | Yes | PK | - | - | - |
gender_concept_id |
This field is meant to capture the biological sex at birth of the Person. This field should not be used to study gender identity issues. | Use the gender value present in the data under the assumption that it is the biological sex at birth. If the source data captures gender identity it should be stored in the OBSERVATION table. | integer | Yes | - | FK | CONCEPT | Gender |
year_of_birth |
Compute age using year_of_birth. | For data sources with date of birth, the year should be extracted. If no year of birth is available, drop the person's data from the CDM instance. | integer | Yes | - | - | - | - |
month_of_birth |
- | For data sources that provide the precise date of birth, the month should be extracted and stored in this field. | integer | No | - | - | - | - |
day_of_birth |
- | For data sources that provide the precise date of birth, the day should be extracted and stored in this field. | integer | No | - | - | - | - |
birth_datetime |
This field is not required but highly encouraged. | For data sources that provide the precise datetime of birth, that value should be stored in this field. | datetime | No | - | - | - | - |
race_concept_id |
This field captures race or ethnic background of the person. | Only use this field if you have information about race or ethnic background available in the source data. Mixed races are currently not supported. If a person has more than one race recorded, put Concept_Id 0. | integer | Yes | - | FK | CONCEPT | Race |
ethnicity_concept_id |
This field captures Ethnicity as defined by the OMB: "Hispanic" or "Not Hispanic". | This field should only be used for US-based data sources. Do not infer ethnicity from race. | integer | Yes | - | FK | CONCEPT | Ethnicity |
location_id |
This field represents the last known location of the person. | Put the location_id from the LOCATION table representing the most granular location information for the person. | integer | No | - | FK | LOCATION | - |
provider_id |
This field represents the last known primary care provider (General Practitioner). | Put the provider_id from the PROVIDER table of the last known primary care provider. | integer | No | - | FK | PROVIDER | - |
care_site_id |
This field represents the Care Site where the Provider typically provides care. | - | integer | No | - | FK | CARE_SITE | - |
person_source_value |
Use this field to link back to persons in the source data. | This field allows for the storing of the person value as it appears in the source. Not required but strongly recommended. | varchar(50) | No | - | - | - | - |
gender_source_value |
This field is used to store the biological sex of the person from the source data. | Put the biological sex as it appears in the source data. | varchar(50) | No | - | - | - | - |
gender_source_concept_id |
Due to the small number of options, this tends to be zero. | If the source data codes biological sex in an OMOP supported vocabulary, store the concept_id here. | integer | No | - | FK | CONCEPT | - |
race_source_value |
This field is used to store the race of the person from the source data. | Put the race as it appears in the source data. | varchar(50) | No | - | - | - | - |
race_source_concept_id |
Due to the small number of options, this tends to be zero. | If the source data codes race in an OMOP supported vocabulary, store the concept_id here. | integer | No | - | FK | CONCEPT | - |
ethnicity_source_value |
This field is used to store the ethnicity of the person from the source data. | Put the ethnicity as it appears in the source data. | varchar(50) | No | - | - | - | - |
ethnicity_source_concept_id |
Due to the small number of options, this tends to be zero. | If the source data codes ethnicity in an OMOP supported vocabulary, store the concept_id here. | integer | No | - | FK | CONCEPT | - |
User Guide
All records in this table are independent Persons.
ETL Conventions
All Persons in a database needs one record in this table, unless they fail data quality requirements specified in the ETL. Persons with no Events should have a record nonetheless. If more than one data source contributes Events to the database, Persons must be reconciled, if possible, across the sources to create one single record per Person. The content of the BIRTH_DATETIME must be equivalent to the content of BIRTH_DAY, BIRTH_MONTH and BIRTH_YEAR.
For detailed conventions, refer to the THEMIS repository.
OBSERVATION_PERIOD
Table Description
The OBSERVATION_PERIOD table defines spans of time during which clinical events are expected to be recorded for a person. It establishes the period when events indicate actual occurrences, and their absence suggests non-occurrence.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
observation_period_id |
Identifies each distinct observation span per person. | Assign unique ID to each discrete period per person. | integer | Yes | PK | - | - | - |
person_id |
Links to the person experiencing the observation period. | Must correspond to valid PERSON table entry. | integer | Yes | - | FK | PERSON | - |
observation_period_start_date |
Determines period start. | Often inferred as earliest event date; in insurance claims, represents enrollment start. | date | Yes | - | - | - | - |
observation_period_end_date |
Determines period end when all events are captured. | Often inferred as latest event date; in insurance claims, represents enrollment end. | date | Yes | - | - | - | - |
period_type_concept_id |
Shows provenance source (enrollment, EHR, other). | Select concept representing determination method; standard Type Concept domain. | integer | Yes | - | FK | CONCEPT | Type Concept |
User Guide
Each person may have multiple non-overlapping OBSERVATION_PERIOD records. Events can exist outside these periods but cannot be assumed absent. Incidence and prevalence calculations should only use active observation periods. When defining cohorts, events outside these spans can inform inclusion criteria, though completeness isn't guaranteed. Short periods (single days) can distort rate calculations, so applying minimum observation time requirements is recommended.
ETL Conventions
Every person requires at least one OBSERVATION_PERIOD representing intervals with high clinical event capture. These may derive from enrollment periods (insurance data) or require inference (EHR systems). The start typically reflects the earliest clinical event, and the end reflects either the latest event or database cutoff. Single-event periods are valid. Overlapping or adjacent periods must be merged into one.
DEATH
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
person_id | Unique identifier linking to the person who died. | Links to PERSON table. | INTEGER | Yes | PK | FK | PERSON | |
death_date | The date the person died. | If the precise date is not known, estimate the date. | DATE | Yes | ||||
death_datetime | The date and time the person died. | If no time is given, set to midnight (00:00:00). | DATETIME | No | ||||
death_type_concept_id | Provenance of the death record. | Use this field to identify the provenance of the death record (e.g., EHR, death certificate, claims). | INTEGER | Yes | FK | CONCEPT | Type Concept | |
cause_concept_id | Standard concept representing the cause of death. | Map the cause of death to a Standard Concept in the Condition domain if available. | INTEGER | No | FK | CONCEPT | Condition | |
cause_source_value | The source code for the cause of death. | Store the original source value. | VARCHAR(50) | No | ||||
cause_source_concept_id | Concept representing the source cause of death. | If the source data codes cause of death in an OMOP supported vocabulary, store the concept_id here. | INTEGER | No | FK | CONCEPT |
Table Description
The DEATH table contains the clinical event documenting how and when a Person dies. A Person can have at most one record in this table if evidence of death exists in the source data.
User Guide
Living persons should not have a record in this table. Each person can have at most one death record. If multiple death records exist in source data, choose the most reliable one based on data quality assessment.
ETL Conventions
If death information comes from multiple sources (e.g., EHR and claims), reconcile them to create a single death record. The death_type_concept_id should reflect the most reliable source. Cause of death should be mapped to a Standard Concept in the Condition domain when available.
VISIT_OCCURRENCE
Table Description
The VISIT_OCCURRENCE table contains events representing periods when persons engage with the healthcare system. These encounters are configured by specific circumstances including patient location (institutional vs. remote), provider availability, and stay duration.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
visit_occurrence_id |
Unique identifier for each interaction. | Created by assigning distinct ID to each patient-healthcare system encounter. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
visit_concept_id |
Standard Visit domain concept representing encounter type. | Populate this field based on the kind of visit that took place. | integer | Yes | - | FK | CONCEPT | Visit |
visit_start_date |
Admission date for inpatient; patient-provider interaction date for others. | If this information is not available the record should be dropped. | date | Yes | - | - | - | - |
visit_start_datetime |
Start time of visit. | If no time is given for the start date of a visit, set it to midnight (00:00:0000). | datetime | No | - | - | - | - |
visit_end_date |
Discharge date for inpatient; same as start date for same-day visits. | Visit end dates are mandatory. | date | Yes | - | - | - | - |
visit_end_datetime |
End time of visit. | Defaults to midnight if unavailable. | datetime | No | - | - | - | - |
visit_type_concept_id |
Indicates provenance (EHR vs. claims). | Populate this field based on the provenance of the visit record. | integer | Yes | - | FK | CONCEPT | Type Concept |
provider_id |
Single associated provider. | If there are multiple providers associated with a visit, you will need to choose which one to put here. | integer | No | - | FK | PROVIDER | - |
care_site_id |
Healthcare facility location. | Link to CARE_SITE table. | integer | No | - | FK | CARE_SITE | - |
visit_source_value |
Verbatim source data value indicating visit type. | Store the original source code. | varchar(50) | No | - | - | - | - |
visit_source_concept_id |
Source system coding concept if OMOP-supported. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
admitted_from_concept_id |
Standard visit domain concept indicating admission origin. | If a person was admitted from home or was self-referred, set this to 0. | integer | No | - | FK | CONCEPT | Visit |
admitted_from_source_value |
Verbatim source value for admission origin. | Store the original source value. | varchar(50) | No | - | - | - | - |
discharged_to_concept_id |
Discharge destination concept. | It is assumed that a person is discharged to home therefore there is not a standard concept id for 'home'. Use concept id = 0. | integer | No | - | FK | CONCEPT | Visit |
discharged_to_source_value |
Verbatim source value for discharge destination. | Store the original source value. | varchar(50) | No | - | - | - | - |
preceding_visit_occurrence_id |
Links to immediately prior visit for same person. | Use to chain visits chronologically. | integer | No | - | FK | VISIT_OCCURRENCE | - |
User Guide
Visit types are organized hierarchically using standardized concepts from the Visit Domain. Common visit configurations include: Inpatient Visit (hospital admission with bed stay exceeding one day), Emergency Room Visit (same-day emergency department care), Outpatient Visit (same-day ambulatory care without bed), Home Visit (provider delivers service at patient location), Telehealth Visit (remote patient-provider interaction), Pharmacy/Laboratory Visits (specialized same-day visits), Case Management Visit (administrative interaction without providers). Visit duration, or 'length of stay', is defined as VISIT_END_DATE - VISIT_START_DATE.
ETL Conventions
Visit concepts derive from healthcare coding systems (CPT, Place of Service). When unavailable, visits must be inferred through defined ETL assumptions. Visits may be adjacent but cannot overlap on non-boundary dates. Multi-day visits cannot share days except at start/end points.
VISIT_DETAIL
Table Description
The VISIT_DETAIL table represents granular details of parent VISIT_OCCURRENCE records. It maintains a 1:n relationship where each VISIT_OCCURRENCE may have zero or more associated VISIT_DETAIL records. Examples include unit transfers during hospital stays or individual claim lines within insurance claims.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
visit_detail_id |
Unique identifier for each visit detail record. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
visit_detail_concept_id |
Standard concept for visit detail type. | Should be a descendant of the parent visit's VISIT_CONCEPT_ID. | integer | Yes | - | FK | CONCEPT | Visit |
visit_detail_start_date |
Start date of the visit detail. | Required field. | date | Yes | - | - | - | - |
visit_detail_start_datetime |
Start datetime of the visit detail. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
visit_detail_end_date |
End date of the visit detail. | Required field. | date | Yes | - | - | - | - |
visit_detail_end_datetime |
End datetime of the visit detail. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
visit_detail_type_concept_id |
Provenance of the visit detail record. | Indicates where the data came from. | integer | Yes | - | FK | CONCEPT | Type Concept |
provider_id |
Provider associated with the visit detail. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
care_site_id |
Care site where the visit detail occurred. | Link to CARE_SITE table. | integer | No | - | FK | CARE_SITE | - |
visit_detail_source_value |
Source value for the visit detail type. | Store the original source value. | varchar(50) | No | - | - | - | - |
visit_detail_source_concept_id |
Source concept for visit detail type. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
admitted_from_concept_id |
Concept indicating admission origin. | Use 0 for home or self-referral. | integer | No | - | FK | CONCEPT | Visit |
admitted_from_source_value |
Source value for admission origin. | Store the original source value. | varchar(50) | No | - | - | - | - |
discharged_to_concept_id |
Discharge destination concept. | Use 0 for home discharge. | integer | No | - | FK | CONCEPT | Visit |
discharged_to_source_value |
Source value for discharge destination. | Store the original source value. | varchar(50) | No | - | - | - | - |
preceding_visit_detail_id |
Links to the immediately prior visit detail. | Use to chain visit details chronologically. | integer | No | - | FK | VISIT_DETAIL | - |
parent_visit_detail_id |
Links to a parent visit detail for nested hierarchies. | Use for multi-level visit hierarchies. | integer | No | - | FK | VISIT_DETAIL | - |
visit_occurrence_id |
Links to the parent visit occurrence. | Required link to VISIT_OCCURRENCE table. | integer | Yes | - | FK | VISIT_OCCURRENCE | - |
User Guide
VISIT_DETAIL records must have their associated VISIT_OCCURRENCE_ID specified. Each VISIT_DETAIL_CONCEPT_ID should be a descendant of the parent visit's VISIT_CONCEPT_ID, maintaining hierarchical consistency within the visit domain structure.
ETL Conventions
Population of VISIT_DETAIL is optional but recommended when source data requires roll-up logic to create unified VISIT_OCCURRENCE records. In EHR systems, multiple provider interactions may be consolidated into a single visit using VISIT_DETAIL to preserve granular encounter information.
CONDITION_OCCURRENCE
Table Description
This table documents clinical events indicating a disease or medical condition. Records capture diagnoses, signs, or symptoms either observed by healthcare providers or reported by patients.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
condition_occurrence_id |
Unique identifier for each condition occurrence. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
condition_concept_id |
Standard concept representing the condition. | Map source code to Standard Concept in Condition domain. | integer | Yes | - | FK | CONCEPT | Condition |
condition_start_date |
Date when the condition was diagnosed or began. | Required field. | date | Yes | - | - | - | - |
condition_start_datetime |
Datetime when the condition was diagnosed or began. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
condition_end_date |
Date when the condition resolved. | Often unavailable; use CONDITION_ERA for derived spans. | date | No | - | - | - | - |
condition_end_datetime |
Datetime when the condition resolved. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
condition_type_concept_id |
Provenance of the condition record. | Indicates where the data came from (EHR, claims, etc.). | integer | Yes | - | FK | CONCEPT | Type Concept |
condition_status_concept_id |
Status of the condition (preliminary, final, etc.). | Use Condition Status domain concepts. | integer | No | - | FK | CONCEPT | Condition Status |
stop_reason |
Reason the condition was no longer recorded. | Often unavailable. | varchar(20) | No | - | - | - | - |
provider_id |
Provider who diagnosed the condition. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
visit_occurrence_id |
Visit during which the condition was diagnosed. | Link to VISIT_OCCURRENCE table. | integer | No | - | FK | VISIT_OCCURRENCE | - |
visit_detail_id |
Visit detail during which the condition was diagnosed. | Link to VISIT_DETAIL table. | integer | No | - | FK | VISIT_DETAIL | - |
condition_source_value |
Source code for the condition. | Store the original source value. | varchar(50) | No | - | - | - | - |
condition_source_concept_id |
Source concept for the condition. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
condition_status_source_value |
Source value for condition status. | Store the original source value. | varchar(50) | No | - | - | - | - |
User Guide
Conditions are organized in a hierarchical system within the Condition domain. Record all source conditions without applying analytical filters. Rule-out diagnoses should be excluded. Family history and past medical events belong in the OBSERVATION table.
ETL Conventions
All source codes mapping to standard Condition domain concepts must be recorded in this table. Duplicate conditions within the same encounter require ETL logic to determine whether to consolidate or maintain separate records.
DRUG_EXPOSURE
Table Description
The DRUG_EXPOSURE table captures records documenting a person's exposure to a medication or biochemical substance introduced into the body. Drugs encompass prescription and over-the-counter medicines, vaccines, and biologic therapies.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
drug_exposure_id |
Unique identifier for each drug exposure record. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Person receiving the drug. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
drug_concept_id |
Standard drug concept (mapped from source). | Must map to Drug domain. | integer | Yes | - | FK | CONCEPT | Drug |
drug_exposure_start_date |
Prescription start, fill date, or administration date. | Required field. | date | Yes | - | - | - | - |
drug_exposure_start_datetime |
Start datetime of drug exposure. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
drug_exposure_end_date |
End date of drug exposure. | Inferred from start date and duration if unavailable. | date | Yes | - | - | - | - |
drug_exposure_end_datetime |
End datetime of drug exposure. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
verbatim_end_date |
End date as it appears in source data. | Store the original end date if available. | date | No | - | - | - | - |
drug_type_concept_id |
Provenance (written, dispensed, administered). | Type Concept domain. | integer | Yes | - | FK | CONCEPT | Type Concept |
stop_reason |
Reason drug was discontinued. | Often unavailable. | varchar(20) | No | - | - | - | - |
refills |
Intended refills at time of prescription. | Store as integer. | integer | No | - | - | - | - |
quantity |
Total amount dispensed. | Unit conversion to DRUG_STRENGTH table required. | float | No | - | - | - | - |
days_supply |
Days of supply as recorded. | Exclude negative or erroneous high values. | integer | No | - | - | - | - |
sig |
Verbatim provider instructions for medication. | Store as text. | text | No | - | - | - | - |
route_concept_id |
Route of administration. | Route domain. | integer | No | - | FK | CONCEPT | Route |
lot_number |
Manufacturing lot identifier. | Store if available. | varchar(50) | No | - | - | - | - |
provider_id |
Prescribing or administering provider. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
visit_occurrence_id |
Associated visit. | Link to VISIT_OCCURRENCE table. | integer | No | - | FK | VISIT_OCCURRENCE | - |
visit_detail_id |
Associated visit detail (e.g., ICU stay). | Link to VISIT_DETAIL table. | integer | No | - | FK | VISIT_DETAIL | - |
drug_source_value |
Source code (NDC, Gemscript). | Store the original source value. | varchar(50) | No | - | - | - | - |
drug_source_concept_id |
Source concept (non-standard). | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
route_source_value |
Verbatim route from source data. | Store the original source value. | varchar(50) | No | - | - | - | - |
dose_unit_source_value |
Verbatim dose unit. | Deprecated field. | varchar(50) | No | - | - | - | - |
User Guide
Records in this table indicate exposure to drugs. The table documents prescriptions written, prescriptions dispensed, and drugs administered by providers, with the DRUG_TYPE_CONCEPT_ID differentiating these types.
ETL Conventions
Quantity and dose information arrives in varied formats; ETL should capture as much detail as possible. Multiple records on the same day for identical drugs should not be deduplicated without strong evidence of true duplication. Special attention is required for prescription refills.
PROCEDURE_OCCURRENCE
Table Description
The PROCEDURE_OCCURRENCE table contains records of activities or processes ordered by, or carried out by, a healthcare provider on the patient with a diagnostic or therapeutic purpose.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
procedure_occurrence_id |
Unique identifier for each procedure occurrence. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
procedure_concept_id |
Standard concept representing the procedure. | Map source code to Standard Concept in Procedure domain. | integer | Yes | - | FK | CONCEPT | Procedure |
procedure_date |
Date on which the procedure was performed. | Required field. | date | Yes | - | - | - | - |
procedure_datetime |
Datetime of the procedure. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
procedure_end_date |
End date of the procedure. | Optional; for multi-day procedures. | date | No | - | - | - | - |
procedure_end_datetime |
End datetime of the procedure. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
procedure_type_concept_id |
Provenance of the procedure record. | Type Concept domain. | integer | Yes | - | FK | CONCEPT | Type Concept |
modifier_concept_id |
Procedure modifier (e.g., bilateral, laterality). | Store if available. | integer | No | - | FK | CONCEPT | - |
quantity |
Number of times the procedure was performed. | Store as integer. | integer | No | - | - | - | - |
provider_id |
Provider who performed the procedure. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
visit_occurrence_id |
Visit during which the procedure was performed. | Link to VISIT_OCCURRENCE table. | integer | No | - | FK | VISIT_OCCURRENCE | - |
visit_detail_id |
Visit detail during which the procedure was performed. | Link to VISIT_DETAIL table. | integer | No | - | FK | VISIT_DETAIL | - |
procedure_source_value |
Source code for the procedure. | Store the original source value. | varchar(50) | No | - | - | - | - |
procedure_source_concept_id |
Source concept for the procedure. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
modifier_source_value |
Source value for the modifier. | Store the original source value. | varchar(50) | No | - | - | - | - |
User Guide
Lab tests are distinct from procedures. Measurements represent observed results with expected amounts and units, whereas procedures are actions. Phlebotomy, though technically a procedure, is rarely captured separately since it's typically associated with lab work.
ETL Conventions
When handling duplicate records, the ETL must determine whether to consolidate them into a single record or maintain them separately. Source codes mapped to Standard Concepts in the Procedure Domain must be recorded in this table.
DEVICE_EXPOSURE
Table Description
The Device domain captures information regarding a person's exposure to a foreign physical object or instrument used for diagnostic or therapeutic purposes. This includes implantable objects like pacemakers and stents, medical equipment and supplies, instruments used in medical procedures, and materials used in clinical care.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
device_exposure_id |
Unique identifier for each device exposure record. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
device_concept_id |
Standard concept representing the device. | Map to Device domain. | integer | Yes | - | FK | CONCEPT | Device |
device_exposure_start_date |
Date the device exposure began. | Required field. | date | Yes | - | - | - | - |
device_exposure_start_datetime |
Start datetime of device exposure. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
device_exposure_end_date |
Date the device exposure ended. | Optional. | date | No | - | - | - | - |
device_exposure_end_datetime |
End datetime of device exposure. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
device_type_concept_id |
Provenance of the device record. | Type Concept domain. | integer | Yes | - | FK | CONCEPT | Type Concept |
unique_device_id |
Unique Device Identifier (UDI). | Store if available. | varchar(255) | No | - | - | - | - |
production_id |
Manufacturing production identifier. | Store if available. | varchar(255) | No | - | - | - | - |
quantity |
Number of devices used. | Store as integer. | integer | No | - | - | - | - |
provider_id |
Provider who placed or used the device. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
visit_occurrence_id |
Visit during which the device was used. | Link to VISIT_OCCURRENCE table. | integer | No | - | FK | VISIT_OCCURRENCE | - |
visit_detail_id |
Visit detail during which the device was used. | Link to VISIT_DETAIL table. | integer | No | - | FK | VISIT_DETAIL | - |
device_source_value |
Source code for the device. | Store the original source value. | varchar(50) | No | - | - | - | - |
device_source_concept_id |
Source concept for the device. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
unit_concept_id |
Unit of measure for the device. | Unit domain. | integer | No | - | FK | CONCEPT | Unit |
unit_source_value |
Source value for the unit. | Store the original source value. | varchar(50) | No | - | - | - | - |
unit_source_concept_id |
Source concept for the unit. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
User Guide
The distinction between Devices or supplies and Procedures are sometimes blurry, but the former are physical objects while the latter are actions, often to apply a Device or supply.
ETL Conventions
Source codes and source text fields that map to Standard Concepts within the Device Domain must be recorded in this table.
MEASUREMENT
Table Description
The MEASUREMENT table records structured values (numerical or categorical) obtained through systematic and standardized examination or testing of a person or their sample. This includes laboratory tests, vital signs, and quantitative pathology findings.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
measurement_id |
Unique identifier for each measurement record. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
measurement_concept_id |
Standard concept representing the measurement. | Map to Measurement domain. | integer | Yes | - | FK | CONCEPT | Measurement |
measurement_date |
Date of the measurement. | Required field. | date | Yes | - | - | - | - |
measurement_datetime |
Datetime of the measurement. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
measurement_time |
Time of measurement (deprecated). | Use measurement_datetime instead. | varchar(10) | No | - | - | - | - |
measurement_type_concept_id |
Provenance of the measurement record. | Type Concept domain. | integer | Yes | - | FK | CONCEPT | Type Concept |
operator_concept_id |
Operator for the value (=, <, >, etc.). | Meas Value Operator domain. | integer | No | - | FK | CONCEPT | Meas Value Operator |
value_as_number |
Numerical result of the measurement. | Store the numeric value. | float | No | - | - | - | - |
value_as_concept_id |
Categorical result of the measurement. | Meas Value domain. | integer | No | - | FK | CONCEPT | Meas Value |
unit_concept_id |
Unit of the measurement. | Unit domain. | integer | No | - | FK | CONCEPT | Unit |
range_low |
Lower bound of normal range. | Store if available. | float | No | - | - | - | - |
range_high |
Upper bound of normal range. | Store if available. | float | No | - | - | - | - |
provider_id |
Provider who ordered or performed the measurement. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
visit_occurrence_id |
Visit during which the measurement was taken. | Link to VISIT_OCCURRENCE table. | integer | No | - | FK | VISIT_OCCURRENCE | - |
visit_detail_id |
Visit detail during which the measurement was taken. | Link to VISIT_DETAIL table. | integer | No | - | FK | VISIT_DETAIL | - |
measurement_source_value |
Source code for the measurement. | Store the original source value. | varchar(50) | No | - | - | - | - |
measurement_source_concept_id |
Source concept for the measurement. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
unit_source_value |
Source value for the unit. | Store the original source value. | varchar(50) | No | - | - | - | - |
unit_source_concept_id |
Source concept for the unit. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
value_source_value |
Source value for the result. | Store the original source value. | varchar(50) | No | - | - | - | - |
measurement_event_id |
Links to another clinical event. | Store if available. | integer | No | - | - | - | - |
meas_event_field_concept_id |
Concept identifying the linked event type. | Map to concept. | integer | No | - | FK | CONCEPT | - |
User Guide
Measurements are predominantly lab tests with a few exceptions, like blood pressure or function tests. Results are given in the form of a value and unit combination. When investigating measurements, look for operator_concept_ids (<, >, etc.).
ETL Conventions
Only source values mapping to Measurement domain concepts belong in this table. While measurements always have results, VALUE_AS_NUMBER and VALUE_AS_CONCEPT_ID fields are optional since source data often lacks result information.
OBSERVATION
Table Description
The OBSERVATION table captures clinical facts about a Person obtained through examination, questioning, or procedures. It records data that cannot be represented elsewhere, such as social facts, lifestyle choices, and medical history.
Columns
| CDM Field | User Guide | ETL Conventions | Datatype | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
observation_id |
Unique identifier for each observation record. | Generated during ETL. | integer | Yes | PK | - | - | - |
person_id |
Identifies the patient. | Links to PERSON table. | integer | Yes | - | FK | PERSON | - |
observation_concept_id |
Standard concept representing the observation. | Map to Observation domain. | integer | Yes | - | FK | CONCEPT | - |
observation_date |
Date of the observation. | Required field. | date | Yes | - | - | - | - |
observation_datetime |
Datetime of the observation. | Set to midnight if time unavailable. | datetime | No | - | - | - | - |
observation_type_concept_id |
Provenance of the observation record. | Type Concept domain. | integer | Yes | - | FK | CONCEPT | Type Concept |
value_as_number |
Numerical value of the observation. | Store if applicable. | float | No | - | - | - | - |
value_as_string |
Text value of the observation. | Store if applicable. | varchar(60) | No | - | - | - | - |
value_as_concept_id |
Categorical value of the observation. | Map to concept. | integer | No | - | FK | CONCEPT | - |
qualifier_concept_id |
Qualifier for the observation. | Store if applicable. | integer | No | - | FK | CONCEPT | - |
unit_concept_id |
Unit of the observation. | Unit domain. | integer | No | - | FK | CONCEPT | Unit |
provider_id |
Provider who made the observation. | Link to PROVIDER table. | integer | No | - | FK | PROVIDER | - |
visit_occurrence_id |
Visit during which the observation was made. | Link to VISIT_OCCURRENCE table. | integer | No | - | FK | VISIT_OCCURRENCE | - |
visit_detail_id |
Visit detail during which the observation was made. | Link to VISIT_DETAIL table. | integer | No | - | FK | VISIT_DETAIL | - |
observation_source_value |
Source code for the observation. | Store the original source value. | varchar(50) | No | - | - | - | - |
observation_source_concept_id |
Source concept for the observation. | Map to concept if source uses OMOP vocabulary. | integer | No | - | FK | CONCEPT | - |
unit_source_value |
Source value for the unit. | Store the original source value. | varchar(50) | No | - | - | - | - |
qualifier_source_value |
Source value for the qualifier. | Store the original source value. | varchar(50) | No | - | - | - | - |
value_source_value |
Source value for the result. | Store the original source value. | varchar(50) | No | - | - | - | - |
observation_event_id |
Links to another clinical event. | Store if available. | integer | No | - | - | - | - |
obs_event_field_concept_id |
Concept identifying the linked event type. | Map to concept. | integer | No | - | FK | CONCEPT | - |
User Guide
Observations differ from Measurements because they don't require standardized testing to generate clinical facts. The table typically records when observations were obtained. Examples include medical history, family history, treatment needs, social circumstances, and healthcare utilization patterns.
ETL Conventions
Records mapping to domains other than Condition, Procedure, Drug, Specimen, Measurement, or Device belong here. Observations function as attribute-value pairs with the Observation Concept as the attribute and clinical facts as values. Values can be Concepts, numerical, or text.
NOTE
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
note_id | A unique identifier for each note. | INTEGER | Yes | PK | ||||
person_id | The PERSON_ID of the patient the note is written for. | INTEGER | Yes | FK | PERSON | |||
note_date | The date the note was recorded. | DATE | Yes | |||||
note_datetime | The date and time the note was recorded. | If time is not given set the time to midnight. | DATETIME | No | ||||
note_type_concept_id | The provenance of the note. Most likely this will be EHR. | Put the source system of the note, as in EHR record. | INTEGER | Yes | FK | CONCEPT | Type Concept | |
note_class_concept_id | A Standard Concept Id representing the HL7 LOINC Document Type Vocabulary classification. | Map the note classification to a Standard Concept. | INTEGER | Yes | FK | CONCEPT | ||
note_title | The title of the note. | VARCHAR(250) | No | |||||
note_text | The content of the note. | TEXT | Yes | |||||
encoding_concept_id | This is the Concept representing the character encoding type. | Currently the only option is UTF-8. If encoded otherwise, put 0. | INTEGER | Yes | FK | CONCEPT | ||
language_concept_id | The language of the note. | Use Concepts that are descendants of World Languages. | INTEGER | Yes | FK | CONCEPT | ||
provider_id | The Provider who wrote the note. | ETL may determine which provider to record. | INTEGER | No | FK | PROVIDER | ||
visit_occurrence_id | The Visit during which the note was written. | INTEGER | No | FK | VISIT_OCCURRENCE | |||
visit_detail_id | The Visit Detail during which the note was written. | INTEGER | No | FK | VISIT_DETAIL | |||
note_source_value | The source value mapped to NOTE_CLASS_CONCEPT_ID. | The source value mapped to NOTE_CLASS_CONCEPT_ID. | VARCHAR(50) | No | ||||
note_event_id | If related to another record, this is the primary key of that record. | Put the primary key of the linked record if applicable. | BIGINT | No | ||||
note_event_field_concept_id | The CONCEPT_ID identifying which table the linked record came from. | Put the CONCEPT_ID identifying the table and field. | INTEGER | No | FK | CONCEPT |
Table Description
The NOTE table captures unstructured information recorded by a provider about a patient in free text notes.
User Guide
The NOTE table captures unstructured information recorded by a provider about a patient in free text notes. Notes should be organized using the HL7/LOINC CDO dimensions.
ETL Conventions
Apply the five-dimension CDO structure for note classification. Only two dimensions are required per standards: the note_class_concept_id and note_type_concept_id.
NOTE_NLP
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
note_nlp_id | A unique identifier for the NLP record. | INTEGER | Yes | PK | ||||
note_id | The NOTE_ID for the associated NOTE record. | INTEGER | Yes | FK | NOTE | |||
section_concept_id | The section of the note where the term was found. | Represents the note section based on document type. | INTEGER | No | FK | CONCEPT | ||
snippet | A small window of text surrounding the term. | VARCHAR(250) | No | |||||
offset | Character offset of the extracted term in the input note. | VARCHAR(50) | No | |||||
lexical_variant | Raw text extracted from the NLP tool. | VARCHAR(250) | Yes | |||||
note_nlp_concept_id | The standard CONCEPT_ID mapped to the extracted term. | INTEGER | No | FK | CONCEPT | |||
note_nlp_source_concept_id | The source CONCEPT_ID of the term before mapping. | INTEGER | No | FK | CONCEPT | |||
nlp_system | The name of the NLP system used. | Name and version of NLP system that extracted the term. | VARCHAR(250) | No | ||||
nlp_date | The date of the note processing. | DATE | Yes | |||||
nlp_datetime | The date and time of the note processing. | DATETIME | No | |||||
term_exists | Indicates whether the term is asserted or negated. | Flag indicating if patient actually has or had the condition. | VARCHAR(1) | No | ||||
term_temporal | Temporal context of the term (past, present, future). | Indicates if a condition is present or just in the past. | VARCHAR(50) | No | ||||
term_modifiers | Contextual modifiers of the term. | Concatenates all modifiers for different entity types. | VARCHAR(2000) | No |
Table Description
The NOTE_NLP table encodes all output of NLP (Natural Language Processing) applied to clinical notes. Each row represents an extracted term from the NLP processing.
User Guide
The NOTE_NLP table stores the results of natural language processing pipelines. Each record represents a medical concept extracted from a clinical note, with its context (snippet), position in the text, and mapping to OMOP standard vocabularies.
ETL Conventions
The term_exists and term_temporal fields are essential for interpretation: a term may be mentioned as absent ("no diabetes") or historical ("history of pneumonia"). The nlp_system should document the tool used to enable reproducibility and quality assessment of extractions.
EPISODE
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
episode_id | A unique identifier for each episode. | BIGINT | Yes | PK | ||||
person_id | The PERSON_ID of the patient for whom the episode is recorded. | BIGINT | Yes | FK | PERSON | |||
episode_concept_id | The CONCEPT_ID representing the type of episode. | Concept from Episode domain (e.g., Treatment Episode, Disease Episode). | INTEGER | Yes | FK | CONCEPT | Episode | |
episode_start_date | The date when the episode begins. | DATE | Yes | |||||
episode_start_datetime | The date and time when the episode begins. | If not available, derived from episode_start_date. | DATETIME | No | ||||
episode_end_date | The date when the episode ends. | DATE | No | |||||
episode_end_datetime | The date and time when the episode ends. | If not available, derived from episode_end_date. | DATETIME | No | ||||
episode_parent_id | Reference to a parent episode. | Use to create episode hierarchies. | BIGINT | No | FK | EPISODE | ||
episode_number | Sequential number of the episode. | For numbering recurring episodes (e.g., 2nd line of chemotherapy). | INTEGER | No | ||||
episode_object_concept_id | The CONCEPT_ID describing the object of the episode. | The diagnosis or treatment concerned (e.g., breast cancer). | INTEGER | Yes | FK | CONCEPT | ||
episode_type_concept_id | The provenance of the episode record. | Concept indicating the source of the episode. | INTEGER | Yes | FK | CONCEPT | Type Concept | |
episode_source_value | The source value for the episode. | Code or identifier from the source system. | VARCHAR(50) | No | ||||
episode_source_concept_id | The source CONCEPT_ID for the episode. | Non-standard concept before mapping. | INTEGER | No | FK | CONCEPT |
Table Description
The EPISODE table aggregates lower-level clinical events (CONDITION_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) into a higher-level abstraction representing clinically and analytically relevant disease phases, outcomes and treatments.
User Guide
The EPISODE table is particularly useful for oncology where disease and treatment episodes are tracked. A patient may have multiple episodes for different cancers or different treatment lines. Episodes can be hierarchically organized via episode_parent_id. Examples include cancer episodes with diagnosis, treatment phases, and resolution.
ETL Conventions
Write only episodes that can be easily derived from source data. The episode_concept_id defines the nature of the episode (Disease Episode for illness, Treatment Episode for treatment). The episode_object_concept_id specifies what the episode is about (e.g., the type of cancer). Individual events are linked via the EPISODE_EVENT table.
EPISODE_EVENT
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
episode_id | Reference to the episode. | Link to EPISODE.episode_id. | BIGINT | Yes | FK | EPISODE | ||
event_id | The primary key of the linked clinical event. | Polymorphic reference to the event (condition_occurrence_id, drug_exposure_id, etc.). | BIGINT | Yes | ||||
episode_event_field_concept_id | The CONCEPT_ID identifying which table the event came from. | Identifies which table contains the referenced event. | INTEGER | Yes | FK | CONCEPT |
Table Description
The EPISODE_EVENT table connects qualifying clinical events (CONDITION_OCCURRENCE, DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, DEVICE_EXPOSURE) to the appropriate EPISODE entry.
User Guide
EPISODE_EVENT is a linking table that associates clinical events (conditions, procedures, drugs) to their respective episodes. This is used instead of FACT_RELATIONSHIP for linking events to episodes. For example, for a cancer episode, you can link the initial diagnosis, various chemotherapy treatments, and follow-up assessments.
ETL Conventions
Some episodes may have no linked events. The episode_event_field_concept_id indicates which table the event_id comes from. The concepts used correspond to CDM field identifiers (e.g., concept for condition_occurrence_id, drug_exposure_id, etc.). The same event can be associated with multiple episodes if clinically relevant.
SPECIMEN
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
specimen_id | Unique identifier for each specimen. | INTEGER | Yes | PK | ||||
person_id | The person from whom the specimen is collected. | INTEGER | Yes | FK | PERSON | |||
specimen_concept_id | The type of specimen (blood, urine, biopsy, etc.). | Standard CONCEPT_ID that SPECIMEN_SOURCE_VALUE maps to. | INTEGER | Yes | FK | CONCEPT | Specimen | |
specimen_type_concept_id | The provenance of the specimen record. | Put the source of the specimen record, as in an EHR system. | INTEGER | Yes | FK | CONCEPT | Type Concept | |
specimen_date | The date the specimen was collected. | DATE | Yes | |||||
specimen_datetime | The date and time the specimen was collected. | DATETIME | No | |||||
quantity | The amount of specimen collected from the person. | FLOAT | No | |||||
unit_concept_id | The unit for the quantity of the specimen. | Map to Standard Concept in Unit domain. | INTEGER | No | FK | CONCEPT | Unit | |
anatomic_site_concept_id | The site on the body where the specimen is from. | Code at the lowest level of granularity. | INTEGER | No | FK | CONCEPT | Spec Anatomic Site | |
disease_status_concept_id | The pathological status of the specimen. | INTEGER | No | FK | CONCEPT | |||
specimen_source_id | The identifier for the specimen from the source system. | VARCHAR(50) | No | |||||
specimen_source_value | The source value for the specimen type. | VARCHAR(50) | No | |||||
unit_source_value | The unit for specimen quantity, as in the source. | The unit for specimen quantity, as in the source. | VARCHAR(50) | No | ||||
anatomic_site_source_value | The body site where specimen was taken, as in source. | The body site where specimen was taken, as in source. | VARCHAR(50) | No | ||||
disease_status_source_value | The source value for the disease status. | VARCHAR(50) | No |
Table Description
The SPECIMEN table contains records identifying biological samples from persons.
User Guide
Code anatomic sites at most specific granularity. The SPECIMEN table documents biological samples independent of any analyses performed. Results of analyses on these specimens are in MEASUREMENT. This table is particularly important for biobanks and research where sample traceability is essential.
ETL Conventions
Enable higher-level classification via Standardized Vocabularies. A single physical specimen may generate multiple MEASUREMENT records if multiple analyses are performed. The anatomic_site_concept_id uses SNOMED concepts for localization.
FACT_RELATIONSHIP
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
domain_concept_id_1 | Domain concept identifier for the first fact. | Concept identifying the domain (Condition, Drug, etc.). | INTEGER | Yes | FK | CONCEPT | Metadata | |
fact_id_1 | Primary key of the first related fact. | Reference to the record in domain_concept_id_1's table. | INTEGER | Yes | ||||
domain_concept_id_2 | Domain concept identifier for the second fact. | Concept identifying the domain of the second fact. | INTEGER | Yes | FK | CONCEPT | Metadata | |
fact_id_2 | Primary key of the second related fact. | Reference to the record in domain_concept_id_2's table. | INTEGER | Yes | ||||
relationship_concept_id | Standard concept defining the relationship type. | Concept describing the nature of the relationship. | INTEGER | Yes | FK | CONCEPT | Relationship |
Table Description
The FACT_RELATIONSHIP table contains records about the relationships between facts stored as records in any table of the CDM. Relationships can be defined between facts from the same domain, or different domains.
User Guide
All relationships are directional, and each relationship is represented twice symmetrically within the table. For example, two persons who are related have two records of relationships between them.
ETL Conventions
The domain_concept_id uses domain concepts (Drug, Condition, Measurement, etc.). For symmetric relationships, create two records (A to B and B to A). The relationship_concept_id defines the semantics of the relationship.
LOCATION
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
location_id | Unique identifier for each location. | Auto-generated primary key. | INTEGER | Yes | PK | |||
address_1 | First address line. | Street number and name. | VARCHAR(50) | No | ||||
address_2 | Second address line. | Additional address information (apartment, building, etc.). | VARCHAR(50) | No | ||||
city | City name. | Name of the city. | VARCHAR(50) | No | ||||
state | State abbreviation. | State or region code/name. | VARCHAR(2) | No | ||||
zip | ZIP code (3, 5, or 9 digits). | Postal code of the address. | VARCHAR(9) | No | ||||
county | County name. | Local administrative subdivision. | VARCHAR(20) | No | ||||
location_source_value | Source system location identifier. | Original representation in the source system. | VARCHAR(50) | No | ||||
country_concept_id | Standard concept representing country. | Geographic concept for the country. | INTEGER | No | FK | CONCEPT | Geography | |
country_source_value | Country name from source. | Country name or code in the source system. | VARCHAR(80) | No | ||||
latitude | Geographic latitude (-90 to 90). | Latitude coordinate (decimal). | FLOAT | No | ||||
longitude | Geographic longitude (-180 to 180). | Longitude coordinate (decimal). | FLOAT | No |
Table Description
The LOCATION table represents a generic way to capture physical location or address information of Persons and Care Sites.
User Guide
The current LOCATION table is US-centric. The state field is a two-character abbreviation of the US state code, and the ZIP code is stored as 3, 5, or 9 digits. These fields can be adapted for international use.
ETL Conventions
For privacy protection, patient addresses should be generalized (e.g., ZIP code only, no complete address). Latitude/longitude coordinates may be offset or rounded. Care site locations can be more precise.
CARE_SITE
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
care_site_id | Unique care site identifier. | Auto-generated primary key. | INTEGER | Yes | PK | |||
care_site_name | Care site name from source data. | Name of the facility or department. | VARCHAR(255) | No | ||||
place_of_service_concept_id | High-level characterization of care setting. | Concept describing the type of place (hospital, clinic, etc.). | INTEGER | No | FK | CONCEPT | Place of Service | |
location_id | Physical location reference. | Link to LOCATION.location_id. | INTEGER | No | FK | LOCATION | ||
care_site_source_value | Source system care site identifier. | Identifier or code in the source system. | VARCHAR(50) | No | ||||
place_of_service_source_value | Setting type from source data. | Original code for the type of place in the source system. | VARCHAR(50) | No |
Table Description
The CARE_SITE table contains a list of uniquely identified institutional (physical or organizational) units where healthcare delivery is practiced (offices, wards, hospitals, clinics, etc.).
User Guide
A Care Site is a unique combination of location information and place of service nature. Care sites can include hierarchical relationships, such as a hospital having multiple units (emergency, ICU, cardiology).
ETL Conventions
The granularity of care_site depends on source data and analytical needs. You can represent the entire hospital or go down to the department level. The place_of_service_concept_id uses CMS Place of Service concepts or European equivalents.
PROVIDER
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
provider_id | Unique identifier; different IDs = different persons. | Auto-generated primary key. | INTEGER | Yes | PK | |||
provider_name | Healthcare provider name or identifier. | Full name or pseudonym. | VARCHAR(255) | No | ||||
npi | National Provider Number (US CMS). | National provider identifier. | VARCHAR(20) | No | ||||
dea | DEA identifier for controlled substance prescribing. | Drug Enforcement Administration identifier. | VARCHAR(20) | No | ||||
specialty_concept_id | Provider specialty (physician, nurse, pharmacist, etc.). | Concept describing the specialty (cardiology, surgery, etc.). | INTEGER | No | FK | CONCEPT | Provider | |
care_site_id | Primary practice location. | Link to CARE_SITE.care_site_id. | INTEGER | No | FK | CARE_SITE | ||
year_of_birth | Provider birth year. | Used for demographic analysis of practitioners. | INTEGER | No | ||||
gender_concept_id | Provider recorded gender. | Gender concept (male, female, etc.). | INTEGER | No | FK | CONCEPT | Gender | |
provider_source_value | Source system provider identifier. | Identifier in the source system. | VARCHAR(50) | No | ||||
specialty_source_value | Provider specialty from source data. | Specialty code or text from the source system. | VARCHAR(50) | No | ||||
specialty_source_concept_id | Source vocabulary specialty code. | Non-standard specialty concept. | INTEGER | No | FK | CONCEPT | ||
gender_source_value | Provider gender from source data. | Gender code from the source system. | VARCHAR(50) | No | ||||
gender_source_concept_id | Source vocabulary gender code. | Non-standard gender concept. | INTEGER | No | FK | CONCEPT |
Table Description
The PROVIDER table contains a list of uniquely identified healthcare providers. These are individual providers (physicians, nurses, pharmacists, etc.) involved in patient care.
User Guide
The table contains individual providers only. Pooled records are used when the source lacks individual provider identification. Clinical events can reference the provider_id to identify who performed the act or prescribed the treatment.
ETL Conventions
NPI and DEA are US identifiers; use equivalent national identifiers for other countries (RPPS in France, for example). The provider_name can be pseudonymized for data protection. The same provider can work at multiple care_sites.
COST
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
cost_id | Unique cost identifier. | Auto-generated primary key. | INTEGER | Yes | PK | |||
cost_event_id | ID of the event associated with the cost. | Polymorphic reference to the event (drug_exposure_id, procedure_id, etc.). | INTEGER | Yes | ||||
cost_domain_id | Domain of the associated event. | Domain name (Drug, Procedure, Visit, etc.). | VARCHAR(20) | Yes | ||||
cost_type_concept_id | Cost type. | Concept indicating the nature of the cost (billed, reimbursed, etc.). | INTEGER | Yes | FK | CONCEPT | Type Concept | |
currency_concept_id | Cost currency. | Currency concept (EUR, USD, etc.). | INTEGER | No | FK | CONCEPT | Currency | |
total_charge | Total amount charged. | Gross cost before reimbursement. | FLOAT | No | ||||
total_cost | Total actual cost. | Effective cost for the facility. | FLOAT | No | ||||
total_paid | Total amount paid. | Sum of payments (insurance + patient). | FLOAT | No | ||||
paid_by_payer | Amount paid by insurance. | Portion reimbursed by the payer. | FLOAT | No | ||||
paid_by_patient | Amount paid by patient. | Out-of-pocket expense for the patient. | FLOAT | No | ||||
paid_patient_copay | Patient copay. | Fixed copayment amount. | FLOAT | No | ||||
paid_patient_coinsurance | Patient coinsurance. | Percentage charged to the patient. | FLOAT | No | ||||
paid_patient_deductible | Patient deductible. | Deductible amount applied. | FLOAT | No | ||||
paid_by_primary | Paid by primary insurance. | Reimbursement from primary insurance. | FLOAT | No | ||||
paid_ingredient_cost | Ingredient cost. | For drugs, cost of active ingredients. | FLOAT | No | ||||
paid_dispensing_fee | Dispensing fee. | Pharmacy dispensing fee. | FLOAT | No | ||||
payer_plan_period_id | Associated coverage period. | Link to PAYER_PLAN_PERIOD.payer_plan_period_id. | INTEGER | No | FK | PAYER_PLAN_PERIOD | ||
amount_allowed | Allowed amount. | Maximum amount accepted by insurance. | FLOAT | No | ||||
revenue_code_concept_id | Revenue code. | Billing code concept. | INTEGER | No | FK | CONCEPT | Revenue Code | |
revenue_code_source_value | Revenue code source. | Original code from the billing system. | VARCHAR(50) | No | ||||
drg_concept_id | DRG (Diagnosis Related Group). | Diagnosis-related group concept. | INTEGER | No | FK | CONCEPT | DRG | |
drg_source_value | DRG source. | Original DRG code from source. | VARCHAR(3) | No |
Table Description
The COST table captures records containing the cost of any medical event recorded in one of the clinical event tables such as DRUG_EXPOSURE, PROCEDURE_OCCURRENCE, VISIT_OCCURRENCE, etc.
User Guide
The COST table represents both receivables (amounts charged) and payments. Typically, there is one record per payer response. Each cost is linked to a specific clinical event via cost_event_id and cost_domain_id.
ETL Conventions
Amounts are in monetary units defined by currency_concept_id. Detailed payment fields depend on the local healthcare system structure. All amounts are optional depending on available data.
PAYER_PLAN_PERIOD
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
payer_plan_period_id | Unique plan period identifier. | Auto-generated primary key. | INTEGER | Yes | PK | |||
person_id | Covered individual reference. | Link to PERSON.person_id. | INTEGER | Yes | FK | PERSON | ||
payer_plan_period_start_date | Plan coverage start date. | First day of the coverage period. | DATE | Yes | ||||
payer_plan_period_end_date | Plan coverage end date. | Last day of the coverage period. | DATE | Yes | ||||
payer_concept_id | Payer organization concept. | Concept identifying the type of insurer. | INTEGER | No | FK | CONCEPT | Payer | |
payer_source_value | Payer source value. | Insurer code or name in the source system. | VARCHAR(50) | No | ||||
payer_source_concept_id | Payer source concept. | Non-standard insurer concept. | INTEGER | No | FK | CONCEPT | ||
plan_concept_id | Plan type concept. | Concept identifying the type of coverage. | INTEGER | No | FK | CONCEPT | Plan | |
plan_source_value | Plan source value. | Plan code or name in the source system. | VARCHAR(50) | No | ||||
plan_source_concept_id | Plan source concept. | Non-standard plan concept. | INTEGER | No | FK | CONCEPT | ||
sponsor_concept_id | Sponsor concept. | Employer or organization funding the coverage. | INTEGER | No | FK | CONCEPT | Sponsor | |
sponsor_source_value | Sponsor source value. | Sponsor name or code in the source system. | VARCHAR(50) | No | ||||
sponsor_source_concept_id | Sponsor source concept. | Non-standard sponsor concept. | INTEGER | No | FK | CONCEPT | ||
family_source_value | Family identifier. | Family contract or group number. | VARCHAR(50) | No | ||||
stop_reason_concept_id | Coverage end reason. | Concept explaining why the coverage ended. | INTEGER | No | FK | CONCEPT | ||
stop_reason_source_value | Stop reason source value. | End reason code or text in the source system. | VARCHAR(50) | No | ||||
stop_reason_source_concept_id | Stop reason source concept. | Non-standard stop reason concept. | INTEGER | No | FK | CONCEPT |
Table Description
The PAYER_PLAN_PERIOD table captures details of the period of time that a Person is continuously enrolled under a specific health Plan benefit structure from a given Payer.
User Guide
A Person can have multiple overlapping payer plan periods representing different coverage types (e.g., primary and supplemental insurance). This information is crucial for healthcare access analysis and population tracking.
ETL Conventions
Create separate periods for each coverage change. Periods should not overlap for the same type of coverage. Dates should be accurate to the day. In some countries, distinguish between mandatory and supplemental insurance.
CONCEPT
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
concept_id | Unique concept identifier. | Primary key, assigned by OHDSI. | INTEGER | Yes | PK | |||
concept_name | Descriptive concept name. | Human-readable concept label. | VARCHAR(255) | Yes | ||||
domain_id | Concept domain. | Domain to which the concept belongs (Condition, Drug, etc.). | VARCHAR(20) | Yes | FK | DOMAIN | ||
vocabulary_id | Concept source vocabulary. | Vocabulary identifier (SNOMED, RxNorm, LOINC, etc.). | VARCHAR(20) | Yes | FK | VOCABULARY | ||
concept_class_id | Concept class. | Classification within the vocabulary (Clinical Finding, Ingredient, etc.). | VARCHAR(20) | Yes | FK | CONCEPT_CLASS | ||
standard_concept | Standard concept indicator. | S = Standard, C = Classification, NULL = Non-standard. | VARCHAR(1) | No | ||||
concept_code | Original concept code. | Code in the source vocabulary (e.g., ICD-10 code, SNOMED code). | VARCHAR(50) | Yes | ||||
valid_start_date | Validity start date. | Date from which the concept is usable. | DATE | Yes | ||||
valid_end_date | Validity end date. | Date until which the concept is valid. | DATE | Yes | ||||
invalid_reason | Invalidation reason. | U = Upgraded, D = Deleted, NULL = Valid. | VARCHAR(1) | No |
Table Description
The CONCEPT table is a fundamental building block of the Standardized Vocabularies. It contains records uniquely identifying fundamental units of meaning for expressing clinical information.
User Guide
Standard Concepts (standard_concept = 'S') can be used as normative expressions within the CDM and analytics. Non-standard concepts serve as sources for mapping. Use CONCEPT_RELATIONSHIP to find mappings.
ETL Conventions
This table is provided by OHDSI and should not be modified. During ETL, map source codes to standard concept_ids. Always verify that the concept is valid (valid_end_date in the future, invalid_reason NULL) before using it.
VOCABULARY
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
vocabulary_id | Unique vocabulary identifier. | Short vocabulary code (e.g., SNOMED, ICD10CM). | VARCHAR(20) | Yes | PK | |||
vocabulary_name | Full vocabulary name. | Descriptive terminology name. | VARCHAR(255) | Yes | ||||
vocabulary_reference | External reference. | URL or citation of the official source. | VARCHAR(255) | No | ||||
vocabulary_version | Vocabulary version. | Version number or date used. | VARCHAR(255) | No | ||||
vocabulary_concept_id | Concept representing the vocabulary. | Link to CONCEPT.concept_id for this vocabulary. | INTEGER | Yes | FK | CONCEPT |
Table Description
The VOCABULARY table includes a list of the Vocabularies integrated from various sources or created de novo by the OMOP community. It provides explicit information about vocabulary versions and source references.
User Guide
VOCABULARY lists available terminologies and their versions. Most commonly used vocabularies are: SNOMED (conditions, procedures), RxNorm/RxNorm Extension (drugs), LOINC (lab measurements), ICD10CM/ICD10 (diagnostic classifications).
ETL Conventions
This table is provided by OHDSI via Athena. The vocabulary version is important for analysis reproducibility. Custom vocabularies can be added with a vocabulary_id starting with a high number (>2000000000).
DOMAIN
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
domain_id | Unique domain identifier. | Domain code (e.g., Condition, Drug, Measurement). | VARCHAR(20) | Yes | PK | |||
domain_name | Domain name. | Descriptive domain name. | VARCHAR(255) | Yes | ||||
domain_concept_id | Concept representing the domain. | Link to CONCEPT.concept_id. | INTEGER | Yes | FK | CONCEPT |
Table Description
The DOMAIN table includes a list of OMOP-defined Domains to which concepts can belong. Domains represent clinical definitions that assign matching concepts to standardized CDM fields.
User Guide
Main domains are: Condition (diagnoses), Drug (medications), Procedure (procedures), Measurement (measurements/lab tests), Observation (observations), Device (devices), Specimen (specimens). A concept's domain determines the destination table during ETL.
ETL Conventions
This table is provided by OHDSI. During ETL, check the concept's domain_id to know which table to insert the record into. The same source code may map to concepts in different domains depending on context.
CONCEPT_CLASS
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
concept_class_id | Class identifier. | Class code (e.g., Clinical Finding, Ingredient). | VARCHAR(20) | Yes | PK | |||
concept_class_name | Class name. | Descriptive concept class name. | VARCHAR(255) | Yes | ||||
concept_class_concept_id | Concept representing the class. | Link to CONCEPT.concept_id. | INTEGER | Yes | FK | CONCEPT |
Table Description
The CONCEPT_CLASS table contains semantic categories referencing the structure of each vocabulary. It represents horizontal or vertical levels of vocabulary structure.
User Guide
Classes vary by vocabulary. For SNOMED: Clinical Finding, Procedure, etc. For RxNorm: Ingredient, Clinical Drug, Branded Drug, etc. For LOINC: Lab Test, Clinical Observation, etc. The class helps filter concepts during searches.
ETL Conventions
Table provided by OHDSI. Useful for understanding concept hierarchy within a vocabulary. For example, in RxNorm, Ingredients are active substances, Clinical Drugs combine ingredient + dosage + form.
CONCEPT_SYNONYM
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
concept_id | Related concept. | Link to CONCEPT.concept_id. | INTEGER | Yes | FK | CONCEPT | ||
concept_synonym_name | Concept synonym. | Alternative name or translation of the concept. | VARCHAR(1000) | Yes | ||||
language_concept_id | Synonym language. | Concept identifying the language of the synonym. | INTEGER | Yes | FK | CONCEPT | Language |
Table Description
The CONCEPT_SYNONYM table contains alternative terms, synonyms, and translations of concept names. It expands search capabilities and improves query accuracy for data retrieval.
User Guide
CONCEPT_SYNONYM is useful for free-text concept searches. A concept can have multiple synonyms, including in different languages. For example, "Myocardial infarction" may have synonyms like "Heart attack", "MI".
ETL Conventions
Table provided by OHDSI. Can be enriched with local translations. The language_concept_id uses ISO language concepts (e.g., 4180186 for English, 4182503 for French). Useful for building multilingual search interfaces.
CONCEPT_RELATIONSHIP
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
concept_id_1 | First concept in the relationship. | Source concept of the relationship. | INTEGER | Yes | FK | CONCEPT | ||
concept_id_2 | Second concept in the relationship. | Target concept of the relationship. | INTEGER | Yes | FK | CONCEPT | ||
relationship_id | Relationship type. | Relationship identifier (Maps to, Is a, etc.). | VARCHAR(20) | Yes | FK | RELATIONSHIP | ||
valid_start_date | Validity start date. | Date from which the relationship is valid. | DATE | Yes | ||||
valid_end_date | Validity end date. | Date until which the relationship is valid. | DATE | Yes | ||||
invalid_reason | Invalidation reason. | NULL if valid, D = Deleted, U = Updated. | VARCHAR(1) | No |
Table Description
The CONCEPT_RELATIONSHIP table contains records defining relationships between concepts and their nature/type. It enables exploration of hierarchical and semantic connections within healthcare data.
User Guide
Key relationships: "Maps to" (mapping to standard concept), "Is a" (parent-child hierarchy), "Has ingredient" (drug composition). For ETL mapping, search for "Maps to" relationships from source concepts to standard concepts.
ETL Conventions
For mapping, use the query: SELECT concept_id_2 FROM concept_relationship WHERE concept_id_1 = [source_concept_id] AND relationship_id = 'Maps to' AND invalid_reason IS NULL. Relationships are directional; the inverse relationship often exists with a reverse relationship_id.
RELATIONSHIP
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
relationship_id | Relationship identifier. | Relationship code (e.g., Maps to, Is a). | VARCHAR(20) | Yes | PK | |||
relationship_name | Relationship name. | Human-readable relationship description. | VARCHAR(255) | Yes | ||||
is_hierarchical | Hierarchical relationship. | 1 if parent-child relationship, 0 otherwise. | VARCHAR(1) | Yes | ||||
defines_ancestry | Defines ancestry. | 1 if used to compute CONCEPT_ANCESTOR. | VARCHAR(1) | Yes | ||||
reverse_relationship_id | Reverse relationship. | ID of the inverse relationship (e.g., Mapped from). | VARCHAR(20) | Yes | FK | RELATIONSHIP | ||
relationship_concept_id | Concept representing the relationship. | Link to CONCEPT.concept_id. | INTEGER | Yes | FK | CONCEPT |
Table Description
The RELATIONSHIP table provides a reference list of all relationship types between concepts. It documents direct/reverse relationships and their hierarchical characteristics.
User Guide
Main relationships: "Maps to" / "Mapped from" (mapping), "Is a" / "Subsumes" (hierarchy), "Has ingredient" / "Ingredient of" (composition). Hierarchical relationships (is_hierarchical = 1) are used for navigating concept trees.
ETL Conventions
Table provided by OHDSI. Relationships with defines_ancestry = 1 are used to compute the CONCEPT_ANCESTOR table. Always use the appropriate relationship based on the desired navigation direction.
CONCEPT_ANCESTOR
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
ancestor_concept_id | Ancestor concept (parent). | More general concept in the hierarchy. | INTEGER | Yes | FK | CONCEPT | ||
descendant_concept_id | Descendant concept (child). | More specific concept in the hierarchy. | INTEGER | Yes | FK | CONCEPT | ||
min_levels_of_separation | Minimum distance. | Minimum number of levels between ancestor and descendant. | INTEGER | Yes | ||||
max_levels_of_separation | Maximum distance. | Maximum number of levels between ancestor and descendant. | INTEGER | Yes |
Table Description
The CONCEPT_ANCESTOR table contains complete hierarchical relationships between concepts for simplified analysis. It includes all parent-child and higher-level ancestry connections.
User Guide
CONCEPT_ANCESTOR is essential for inclusive queries. For example, to find all patients with "diabetes", the query automatically includes "type 1 diabetes", "type 2 diabetes", etc. Each concept is also its own ancestor (min_levels = 0).
ETL Conventions
Table computed by OHDSI from hierarchical relationships. Example query to find all descendants: SELECT descendant_concept_id FROM concept_ancestor WHERE ancestor_concept_id = [parent_id]. Use min_levels_of_separation = 0 to include the concept itself.
SOURCE_TO_CONCEPT_MAP
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
source_code | Local source code. | Code value in the source system. | VARCHAR(50) | Yes | ||||
source_concept_id | Source concept (if existing). | Non-standard OMOP concept corresponding to source code. | INTEGER | Yes | FK | CONCEPT | ||
source_vocabulary_id | Source vocabulary. | Identifier of the local or standard source vocabulary. | VARCHAR(20) | Yes | FK | VOCABULARY | ||
source_code_description | Source code description. | Explanatory label for the source code. | VARCHAR(255) | No | ||||
target_concept_id | Standard target concept. | Standard OMOP concept to map to. | INTEGER | Yes | FK | CONCEPT | ||
target_vocabulary_id | Target vocabulary. | Target concept vocabulary (e.g., SNOMED, RxNorm). | VARCHAR(20) | Yes | FK | VOCABULARY | ||
valid_start_date | Validity start date. | Date from which the mapping is valid. | DATE | Yes | ||||
valid_end_date | Validity end date. | Date until which the mapping is valid. | DATE | Yes | ||||
invalid_reason | Invalidation reason. | NULL if valid, otherwise reason for invalidation. | VARCHAR(1) | No |
Table Description
The SOURCE_TO_CONCEPT_MAP table maintains local source codes and mappings to standard concepts for ETL. Use tools like Usagi or Perseus to populate this table; it supports code mapping processes.
User Guide
SOURCE_TO_CONCEPT_MAP is the working table for ETL. It stores correspondences between your local codes (internal codes, facility codes) and OMOP standard concepts. It complements CONCEPT_RELATIONSHIP for non-standard vocabularies.
ETL Conventions
Create a custom vocabulary_id for your source (e.g., "LOCAL_HOSPITAL"). Populate this table before ETL with all necessary mappings. The same source_code can map to multiple target_concept_ids if needed. Document manual mappings for reproducibility.
DRUG_STRENGTH
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
drug_concept_id | Drug concept. | Link to CONCEPT.concept_id (Drug domain). | INTEGER | Yes | FK | CONCEPT | Drug | |
ingredient_concept_id | Active ingredient concept. | Drug's active ingredient. | INTEGER | Yes | FK | CONCEPT | Drug | |
amount_value | Ingredient quantity. | Quantity per unit (e.g., 500 for 500mg/tablet). | FLOAT | No | ||||
amount_unit_concept_id | Quantity unit. | Unit concept (mg, g, IU, etc.). | INTEGER | No | FK | CONCEPT | Unit | |
numerator_value | Concentration numerator. | For solutions: quantity in the numerator. | FLOAT | No | ||||
numerator_unit_concept_id | Numerator unit. | Numerator unit of measure. | INTEGER | No | FK | CONCEPT | Unit | |
denominator_value | Concentration denominator. | For solutions: volume or quantity of denominator. | FLOAT | No | ||||
denominator_unit_concept_id | Denominator unit. | Denominator unit of measure (mL, L, etc.). | INTEGER | No | FK | CONCEPT | Unit | |
box_size | Package size. | Number of units in the box. | INTEGER | No | ||||
valid_start_date | Validity start date. | Marketing start date. | DATE | Yes | ||||
valid_end_date | Validity end date. | End date (31-Dec-2099 if still valid). | DATE | Yes | ||||
invalid_reason | Invalidation reason. | NULL if valid, D or U otherwise. | VARCHAR(1) | No |
Table Description
The DRUG_STRENGTH table contains structured content about the amount/concentration of ingredients in drug products. It provides supplemental information supporting standardized drug utilization analysis.
User Guide
DRUG_STRENGTH allows calculation of administered doses. For solid forms, use amount_value/amount_unit. For liquids, use the numerator/denominator ratio. A multi-ingredient drug has multiple rows, one per ingredient.
ETL Conventions
Table provided by OHDSI for RxNorm and RxNorm Extension vocabularies. Useful for standardizing dose calculations and pharmacoepidemiology studies. DDD (Defined Daily Dose) can be calculated from this data.
CONDITION_ERA
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
condition_era_id | Unique condition era identifier. | Auto-generated primary key. | INTEGER | Yes | PK | |||
person_id | Patient reference. | Link to PERSON.person_id. | INTEGER | Yes | FK | PERSON | ||
condition_concept_id | Condition concept. | Standard condition concept. | INTEGER | Yes | FK | CONCEPT | Condition | |
condition_era_start_date | Era start date. | First day of the condition period. | DATE | Yes | ||||
condition_era_end_date | Era end date. | Last day of the condition period. | DATE | Yes | ||||
condition_occurrence_count | Number of aggregated occurrences. | Number of CONDITION_OCCURRENCE records in this era. | INTEGER | No |
Table Description
The CONDITION_ERA table contains spans of time when a Person is assumed to have a given condition. It aggregates chronic conditions and closely timed visits using a 30-day persistence window.
User Guide
CONDITION_ERA simplifies disease duration analysis. Conditions close in time (gap <= 30 days by default) are merged into a single era. Useful for identifying patients with chronic conditions or recurrences.
ETL Conventions
Derived table, generated by an ETL script from CONDITION_OCCURRENCE. The standard algorithm uses a 30-day gap to merge consecutive occurrences. The condition_concept_id is standardized to the most specific level available.
DRUG_ERA
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
drug_era_id | INTEGER | Yes | PK | |||||
person_id | INTEGER | Yes | FK | PERSON | ||||
drug_concept_id | The drug_concept_id should conform to the concept class 'ingredient' as the drug_era is an era of time where a person is exposed to a particular drug ingredient. | INTEGER | Yes | FK | CONCEPT | Drug | ||
drug_era_start_date | The Drug Era Start Date is the start date of the first Drug Exposure for a given ingredient, with at least 31 days since the previous exposure. | DATE | Yes | |||||
drug_era_end_date | The Drug Era End Date is the end date of the last Drug Exposure. The End Date of each Drug Exposure is either taken from the field drug_exposure_end_date or, as it is typically not available, inferred using the following rules: For pharmacy prescription data, the date when the drug was dispensed plus the number of days of supply are used to extrapolate the End Date for the Drug Exposure. Depending on the country-specific healthcare system, this supply information is either explicitly provided in the day_supply field or inferred from package size or similar information. For Procedure Drugs, usually the drug is administered on a single date (i.e., the administration date). A standard Persistence Window of 30 days (gap, slack) is permitted between two subsequent such extrapolated DRUG_EXPOSURE records to be considered to be merged into a single Drug Era. | DATE | Yes | |||||
drug_exposure_count | The count of grouped DRUG_EXPOSURE records that were included in the DRUG_ERA row. | INTEGER | No | |||||
gap_days | The Gap Days determine how many total drug-free days are observed between all Drug Exposure events that contribute to a DRUG_ERA record. It is assumed that the drugs are "not stockpiled" by the patient, i.e. that if a new drug prescription or refill is observed (a new DRUG_EXPOSURE record is written), the remaining supply from the previous events is abandoned. The difference between Persistence Window and Gap Days is that the former is the maximum drug-free time allowed between two subsequent DRUG_EXPOSURE records, while the latter is the sum of actual drug-free days for the given Drug Era under the above assumption of non-stockpiling. | INTEGER | No |
Table Description
A Drug Era is defined as a span of time when the Person is assumed to be exposed to a particular active ingredient. A Drug Era is not the same as a Drug Exposure: Exposures are individual records corresponding to the source when Drug was delivered to the Person, while successive periods of Drug Exposures are combined under certain rules to produce continuous Drug Eras. Every record in the DRUG_EXPOSURE table should be part of a drug era based on the dates of exposure.
User Guide
NA
ETL Conventions
The SQL script for generating DRUG_ERA records can be found here.
DOSE_ERA
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
dose_era_id | INTEGER | Yes | PK | |||||
person_id | INTEGER | Yes | FK | PERSON | ||||
drug_concept_id | The Concept Id representing the specific drug ingredient. | INTEGER | Yes | FK | CONCEPT | Drug | ||
unit_concept_id | The Concept Id representing the unit of the specific drug ingredient. | INTEGER | Yes | FK | CONCEPT | Unit | ||
dose_value | The numeric value of the dosage of the drug_ingredient. | FLOAT | Yes | |||||
dose_era_start_date | The date the Person started on the specific dosage, with at least 31 days since any prior exposure. | DATE | Yes | |||||
dose_era_end_date | The date the Person was no longer exposed to the dosage of the specific drug ingredient. An era is ended if there are 31 days or more between dosage records. | DATE | Yes |
Table Description
A Dose Era is defined as a span of time when the Person is assumed to be exposed to a constant dose of a specific active ingredient.
User Guide
NA
ETL Conventions
Dose Eras will be derived from records in the DRUG_EXPOSURE table and the Dose information from the DRUG_STRENGTH table using a standardized algorithm. Dose Form information is not taken into account. So, if the patient changes between different formulations, or different manufacturers with the same formulation, the Dose Era is still spanning the entire time of exposure to the Ingredient.
COHORT
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
cohort_definition_id | INTEGER | Yes | ||||||
subject_id | INTEGER | Yes | ||||||
cohort_start_date | DATE | Yes | ||||||
cohort_end_date | DATE | Yes |
Table Description
The subject of a cohort can have multiple, discrete records in the cohort table per cohort_definition_id, subject_id, and non-overlapping time periods. The definition of the cohort is contained within the COHORT_DEFINITION table. It is listed as part of the RESULTS schema because it is a table that users of the database as well as tools such as ATLAS need to be able to write to. The CDM and Vocabulary tables are all read-only so it is suggested that the COHORT and COHORT_DEFINITION tables are kept in a separate schema to alleviate confusion.
User Guide
NA
ETL Conventions
Cohorts typically include patients diagnosed with a specific condition, patients exposed to a particular drug, but can also be Providers who have performed a specific Procedure. Cohort records must have a Start Date and an End Date, but the End Date may be set to Start Date or could have an applied censor date using the Observation Period Start Date. Cohort records must contain a Subject Id, which can refer to the Person, Provider, Visit record or Care Site though they are most often Person Ids. The Cohort Definition will define the type of subject through the subject concept id. A subject can belong (or not belong) to a cohort at any moment in time. A subject can only have one record in the cohort table for any moment of time, i.e. it is not possible for a person to contain multiple records indicating cohort membership that are overlapping in time.
COHORT_DEFINITION
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
cohort_definition_id | This is the identifier given to the cohort, usually by the ATLAS application. | INTEGER | Yes | |||||
cohort_definition_name | A short description of the cohort. | VARCHAR(255) | Yes | |||||
cohort_definition_description | A complete description of the cohort. | TEXT | No | |||||
definition_type_concept_id | Type defining what kind of Cohort Definition the record represents and how the syntax may be executed. | INTEGER | Yes | FK | CONCEPT | |||
cohort_definition_syntax | Syntax or code to operationalize the Cohort Definition. | TEXT | No | |||||
subject_concept_id | This field contains a Concept that represents the domain of the subjects that are members of the cohort (e.g., Person, Provider, Visit). | INTEGER | Yes | FK | CONCEPT | |||
cohort_initiation_date | A date to indicate when the Cohort was initiated in the COHORT table. | DATE | No |
Table Description
The COHORT_DEFINITION table contains records defining a Cohort derived from the data through the associated description and syntax and upon instantiation (execution of the algorithm) placed into the COHORT table. Cohorts are a set of subjects that satisfy a given combination of inclusion criteria for a duration of time. The COHORT_DEFINITION table provides a standardized structure for maintaining the rules governing the inclusion of a subject into a cohort, and can store operational programming code to instantiate the cohort within the OMOP Common Data Model.
User Guide
NA
ETL Conventions
NA
CDM_SOURCE
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
cdm_source_name | The name of the CDM instance. | VARCHAR(255) | Yes | |||||
cdm_source_abbreviation | The abbreviation of the CDM instance. | VARCHAR(25) | Yes | |||||
cdm_holder | The holder of the CDM instance. | VARCHAR(255) | Yes | |||||
source_description | The description of the CDM instance. | TEXT | No | |||||
source_documentation_reference | Refers to a publication or web resource describing the source data. | e.g. a data dictionary. | VARCHAR(255) | No | ||||
cdm_etl_reference | Version of the ETL script used. e.g. link to the Git release. | VARCHAR(255) | No | |||||
source_release_date | The date the data was extracted from the source system. In some systems that is the same as the date the ETL was run. Typically the latest event date in the source is on the source_release_date. | DATE | Yes | |||||
cdm_release_date | The date the ETL script was completed. Typically this is after the source_release_date. | DATE | Yes | |||||
cdm_version | Version of the OMOP CDM used as string. e.g. v5.4 | VARCHAR(10) | No | |||||
cdm_version_concept_id | The Concept Id representing the version of the CDM. | You can find all concepts that represent the CDM versions using the query: SELECT * FROM CONCEPT WHERE VOCABULARY_ID = 'CDM' AND CONCEPT_CLASS = 'CDM' | INTEGER | Yes | FK | CONCEPT | ||
vocabulary_version | Version of the OMOP standardised vocabularies loaded. | You can find the version of your Vocabulary using the query: SELECT vocabulary_version from vocabulary where vocabulary_id = 'None' | VARCHAR(20) | Yes |
Table Description
The CDM_SOURCE table contains detail about the source database and the process used to transform the data into the OMOP Common Data Model.
User Guide
NA
ETL Conventions
NA
METADATA
| CDM Field | User Guide | ETL Conventions | Type | Required | PK | FK | FK Table | FK Domain |
|---|---|---|---|---|---|---|---|---|
metadata_id | The unique key given to a Metadata record. | Attribute value is auto-generated. | INTEGER | Yes | PK | |||
metadata_concept_id | INTEGER | Yes | FK | CONCEPT | ||||
metadata_type_concept_id | INTEGER | Yes | FK | CONCEPT | ||||
name | VARCHAR(250) | Yes | ||||||
value_as_string | VARCHAR(250) | No | ||||||
value_as_concept_id | INTEGER | No | FK | CONCEPT | ||||
value_as_number | This is the numerical value of the result of the Metadata, if applicable and available. It is not expected that all Metadata will have numeric results, rather, this field is here to house values should they exist. | FLOAT | No | |||||
metadata_date | DATE | No | ||||||
metadata_datetime | DATETIME | No |
Table Description
The METADATA table contains metadata information about a dataset that has been transformed to the OMOP Common Data Model.
User Guide
NA
ETL Conventions
NA
Comments