create ER diagram from OMOP CDM specification

This commit is contained in:
Maxim Moinat 2022-11-30 16:08:19 +01:00
parent 31c7b54c2b
commit 759270d000
No known key found for this signature in database
GPG Key ID: 94EA516FB6174455
2 changed files with 660 additions and 0 deletions

View File

@ -0,0 +1,605 @@
erDiagram
PERSON {
person_id integer
gender_concept_id integer
year_of_birth integer
month_of_birth integer
day_of_birth integer
birth_datetime datetime
race_concept_id integer
ethnicity_concept_id integer
location_id integer
provider_id integer
care_site_id integer
person_source_value varchar
gender_source_value varchar
gender_source_concept_id integer
race_source_value varchar
race_source_concept_id integer
ethnicity_source_value varchar
ethnicity_source_concept_id integer
}
OBSERVATION_PERIOD {
observation_period_id integer
person_id integer
observation_period_start_date date
observation_period_end_date date
period_type_concept_id integer
}
VISIT_OCCURRENCE {
visit_occurrence_id integer
person_id integer
visit_concept_id integer
visit_start_date date
visit_start_datetime datetime
visit_end_date date
visit_end_datetime datetime
visit_type_concept_id Integer
provider_id integer
care_site_id integer
visit_source_value varchar
visit_source_concept_id integer
admitted_from_concept_id integer
admitted_from_source_value varchar
discharged_to_concept_id integer
discharged_to_source_value varchar
preceding_visit_occurrence_id integer
}
VISIT_DETAIL {
visit_detail_id integer
person_id integer
visit_detail_concept_id integer
visit_detail_start_date date
visit_detail_start_datetime datetime
visit_detail_end_date date
visit_detail_end_datetime datetime
visit_detail_type_concept_id integer
provider_id integer
care_site_id integer
visit_detail_source_value varchar
visit_detail_source_concept_id Integer
admitted_from_concept_id Integer
admitted_from_source_value varchar
discharged_to_source_value varchar
discharged_to_concept_id integer
preceding_visit_detail_id integer
parent_visit_detail_id integer
visit_occurrence_id integer
}
CONDITION_OCCURRENCE {
condition_occurrence_id integer
person_id integer
condition_concept_id integer
condition_start_date date
condition_start_datetime datetime
condition_end_date date
condition_end_datetime datetime
condition_type_concept_id integer
condition_status_concept_id integer
stop_reason varchar
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
condition_source_value varchar
condition_source_concept_id integer
condition_status_source_value varchar
}
DRUG_EXPOSURE {
drug_exposure_id integer
person_id integer
drug_concept_id integer
drug_exposure_start_date date
drug_exposure_start_datetime datetime
drug_exposure_end_date date
drug_exposure_end_datetime datetime
verbatim_end_date date
drug_type_concept_id integer
stop_reason varchar
refills integer
quantity float
days_supply integer
sig varchar
route_concept_id integer
lot_number varchar
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
drug_source_value varchar
drug_source_concept_id integer
route_source_value varchar
dose_unit_source_value varchar
}
PROCEDURE_OCCURRENCE {
procedure_occurrence_id integer
person_id integer
procedure_concept_id integer
procedure_date date
procedure_datetime datetime
procedure_end_date date
procedure_end_datetime datetime
procedure_type_concept_id integer
modifier_concept_id integer
quantity integer
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
procedure_source_value varchar
procedure_source_concept_id integer
modifier_source_value varchar
}
DEVICE_EXPOSURE {
device_exposure_id integer
person_id integer
device_concept_id integer
device_exposure_start_date date
device_exposure_start_datetime datetime
device_exposure_end_date date
device_exposure_end_datetime datetime
device_type_concept_id integer
unique_device_id varchar
production_id varchar
quantity integer
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
device_source_value varchar
device_source_concept_id integer
unit_concept_id integer
unit_source_value varchar
unit_source_concept_id integer
}
MEASUREMENT {
measurement_id integer
person_id integer
measurement_concept_id integer
measurement_date date
measurement_datetime datetime
measurement_time varchar
measurement_type_concept_id integer
operator_concept_id integer
value_as_number float
value_as_concept_id integer
unit_concept_id integer
range_low float
range_high float
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
measurement_source_value varchar
measurement_source_concept_id integer
unit_source_value varchar
unit_source_concept_id integer
value_source_value varchar
measurement_event_id integer
meas_event_field_concept_id integer
}
OBSERVATION {
observation_id integer
person_id integer
observation_concept_id integer
observation_date date
observation_datetime datetime
observation_type_concept_id integer
value_as_number float
value_as_string varchar
value_as_concept_id Integer
qualifier_concept_id integer
unit_concept_id integer
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
observation_source_value varchar
observation_source_concept_id integer
unit_source_value varchar
qualifier_source_value varchar
value_source_value varchar
observation_event_id integer
obs_event_field_concept_id integer
}
DEATH {
person_id integer
death_date date
death_datetime datetime
death_type_concept_id integer
cause_concept_id integer
cause_source_value varchar
cause_source_concept_id integer
}
NOTE {
note_id integer
person_id integer
note_date date
note_datetime datetime
note_type_concept_id integer
note_class_concept_id integer
note_title varchar
note_text varchar
encoding_concept_id integer
language_concept_id integer
provider_id integer
visit_occurrence_id integer
visit_detail_id integer
note_source_value varchar
note_event_id integer
note_event_field_concept_id integer
}
NOTE_NLP {
note_nlp_id integer
note_id integer
section_concept_id integer
snippet varchar
offset varchar
lexical_variant varchar
note_nlp_concept_id integer
note_nlp_source_concept_id integer
nlp_system varchar
nlp_date date
nlp_datetime datetime
term_exists varchar
term_temporal varchar
term_modifiers varchar
}
SPECIMEN {
specimen_id integer
person_id integer
specimen_concept_id integer
specimen_type_concept_id integer
specimen_date date
specimen_datetime datetime
quantity float
unit_concept_id integer
anatomic_site_concept_id integer
disease_status_concept_id integer
specimen_source_id varchar
specimen_source_value varchar
unit_source_value varchar
anatomic_site_source_value varchar
disease_status_source_value varchar
}
FACT_RELATIONSHIP {
domain_concept_id_1 integer
fact_id_1 integer
domain_concept_id_2 integer
fact_id_2 integer
relationship_concept_id integer
}
LOCATION {
location_id integer
address_1 varchar
address_2 varchar
city varchar
state varchar
zip varchar
county varchar
location_source_value varchar
country_concept_id integer
country_source_value varchar
latitude float
longitude float
}
CARE_SITE {
care_site_id integer
care_site_name varchar
place_of_service_concept_id integer
location_id integer
care_site_source_value varchar
place_of_service_source_value varchar
}
PROVIDER {
provider_id integer
provider_name varchar
npi varchar
dea varchar
specialty_concept_id integer
care_site_id integer
year_of_birth integer
gender_concept_id integer
provider_source_value varchar
specialty_source_value varchar
specialty_source_concept_id integer
gender_source_value varchar
gender_source_concept_id integer
}
PAYER_PLAN_PERIOD {
payer_plan_period_id integer
person_id integer
payer_plan_period_start_date date
payer_plan_period_end_date date
payer_concept_id integer
payer_source_value varchar
payer_source_concept_id integer
plan_concept_id integer
plan_source_value varchar
plan_source_concept_id integer
sponsor_concept_id integer
sponsor_source_value varchar
sponsor_source_concept_id integer
family_source_value varchar
stop_reason_concept_id integer
stop_reason_source_value varchar
stop_reason_source_concept_id integer
}
COST {
cost_id integer
cost_event_id integer
cost_domain_id varchar
cost_type_concept_id integer
currency_concept_id integer
total_charge float
total_cost float
total_paid float
paid_by_payer float
paid_by_patient float
paid_patient_copay float
paid_patient_coinsurance float
paid_patient_deductible float
paid_by_primary float
paid_ingredient_cost float
paid_dispensing_fee float
payer_plan_period_id integer
amount_allowed float
revenue_code_concept_id integer
revenue_code_source_value varchar
drg_concept_id integer
drg_source_value varchar
}
DRUG_ERA {
drug_era_id integer
person_id integer
drug_concept_id integer
drug_era_start_date date
drug_era_end_date date
drug_exposure_count integer
gap_days integer
}
DOSE_ERA {
dose_era_id integer
person_id integer
drug_concept_id integer
unit_concept_id integer
dose_value float
dose_era_start_date date
dose_era_end_date date
}
CONDITION_ERA {
condition_era_id integer
person_id integer
condition_concept_id integer
condition_era_start_date date
condition_era_end_date date
condition_occurrence_count integer
}
EPISODE {
episode_id integer
person_id integer
episode_concept_id integer
episode_start_date date
episode_start_datetime datetime
episode_end_date date
episode_end_datetime datetime
episode_parent_id integer
episode_number integer
episode_object_concept_id integer
episode_type_concept_id integer
episode_source_value varchar
episode_source_concept_id integer
}
EPISODE_EVENT {
episode_id integer
event_id integer
episode_event_field_concept_id integer
}
METADATA {
metadata_id integer
metadata_concept_id integer
metadata_type_concept_id integer
name varchar
value_as_string varchar
value_as_concept_id integer
value_as_number float
metadata_date date
metadata_datetime datetime
}
CDM_SOURCE {
cdm_source_name varchar
cdm_source_abbreviation varchar
cdm_holder varchar
source_description varchar
source_documentation_reference varchar
cdm_etl_reference varchar
source_release_date date
cdm_release_date date
cdm_version varchar
cdm_version_concept_id integer
vocabulary_version varchar
}
CONCEPT {
concept_id integer
concept_name varchar
domain_id varchar
vocabulary_id varchar
concept_class_id varchar
standard_concept varchar
concept_code varchar
valid_start_date date
valid_end_date date
invalid_reason varchar
}
VOCABULARY {
vocabulary_id varchar
vocabulary_name varchar
vocabulary_reference varchar
vocabulary_version varchar
vocabulary_concept_id integer
}
DOMAIN {
domain_id varchar
domain_name varchar
domain_concept_id integer
}
CONCEPT_CLASS {
concept_class_id varchar
concept_class_name varchar
concept_class_concept_id integer
}
CONCEPT_RELATIONSHIP {
concept_id_1 integer
concept_id_2 integer
relationship_id varchar
valid_start_date date
valid_end_date date
invalid_reason varchar
}
RELATIONSHIP {
relationship_id varchar
relationship_name varchar
is_hierarchical varchar
defines_ancestry varchar
reverse_relationship_id varchar
relationship_concept_id integer
}
CONCEPT_SYNONYM {
concept_id integer
concept_synonym_name varchar
language_concept_id integer
}
CONCEPT_ANCESTOR {
ancestor_concept_id integer
descendant_concept_id integer
min_levels_of_separation integer
max_levels_of_separation integer
}
SOURCE_TO_CONCEPT_MAP {
source_code varchar
source_concept_id integer
source_vocabulary_id varchar
source_code_description varchar
target_concept_id integer
target_vocabulary_id varchar
valid_start_date date
valid_end_date date
invalid_reason varchar
}
DRUG_STRENGTH {
drug_concept_id integer
ingredient_concept_id integer
amount_value float
amount_unit_concept_id integer
numerator_value float
numerator_unit_concept_id integer
denominator_value float
denominator_unit_concept_id integer
box_size integer
valid_start_date date
valid_end_date date
invalid_reason varchar
}
COHORT {
cohort_definition_id integer
subject_id integer
cohort_start_date date
cohort_end_date date
}
COHORT_DEFINITION {
cohort_definition_id integer
cohort_definition_name varchar
cohort_definition_description varchar
definition_type_concept_id integer
cohort_definition_syntax varchar
subject_concept_id integer
cohort_initiation_date date
}
PERSON ||--o{ CONCEPT : ""
PERSON ||--o{ LOCATION : ""
PERSON ||--o{ PROVIDER : ""
PERSON ||--o{ CARE_SITE : ""
OBSERVATION_PERIOD ||--o{ PERSON : ""
OBSERVATION_PERIOD ||--o{ CONCEPT : ""
VISIT_OCCURRENCE ||--o{ PERSON : ""
VISIT_OCCURRENCE ||--o{ CONCEPT : ""
VISIT_OCCURRENCE ||--o{ PROVIDER : ""
VISIT_OCCURRENCE ||--o{ CARE_SITE : ""
VISIT_OCCURRENCE ||--o{ VISIT_OCCURRENCE : ""
VISIT_DETAIL ||--o{ PERSON : ""
VISIT_DETAIL ||--o{ CONCEPT : ""
VISIT_DETAIL ||--o{ PROVIDER : ""
VISIT_DETAIL ||--o{ CARE_SITE : ""
VISIT_DETAIL ||--o{ VISIT_DETAIL : ""
VISIT_DETAIL ||--o{ VISIT_OCCURRENCE : ""
CONDITION_OCCURRENCE ||--o{ PERSON : ""
CONDITION_OCCURRENCE ||--o{ CONCEPT : ""
CONDITION_OCCURRENCE ||--o{ PROVIDER : ""
CONDITION_OCCURRENCE ||--o{ VISIT_OCCURRENCE : ""
CONDITION_OCCURRENCE ||--o{ VISIT_DETAIL : ""
DRUG_EXPOSURE ||--o{ PERSON : ""
DRUG_EXPOSURE ||--o{ CONCEPT : ""
DRUG_EXPOSURE ||--o{ PROVIDER : ""
DRUG_EXPOSURE ||--o{ VISIT_OCCURRENCE : ""
DRUG_EXPOSURE ||--o{ VISIT_DETAIL : ""
PROCEDURE_OCCURRENCE ||--o{ PERSON : ""
PROCEDURE_OCCURRENCE ||--o{ CONCEPT : ""
PROCEDURE_OCCURRENCE ||--o{ PROVIDER : ""
PROCEDURE_OCCURRENCE ||--o{ VISIT_OCCURRENCE : ""
PROCEDURE_OCCURRENCE ||--o{ VISIT_DETAIL : ""
DEVICE_EXPOSURE ||--o{ PERSON : ""
DEVICE_EXPOSURE ||--o{ CONCEPT : ""
DEVICE_EXPOSURE ||--o{ PROVIDER : ""
DEVICE_EXPOSURE ||--o{ VISIT_OCCURRENCE : ""
DEVICE_EXPOSURE ||--o{ VISIT_DETAIL : ""
MEASUREMENT ||--o{ PERSON : ""
MEASUREMENT ||--o{ CONCEPT : ""
MEASUREMENT ||--o{ PROVIDER : ""
MEASUREMENT ||--o{ VISIT_OCCURRENCE : ""
MEASUREMENT ||--o{ VISIT_DETAIL : ""
OBSERVATION ||--o{ PERSON : ""
OBSERVATION ||--o{ CONCEPT : ""
OBSERVATION ||--o{ PROVIDER : ""
OBSERVATION ||--o{ VISIT_OCCURRENCE : ""
OBSERVATION ||--o{ VISIT_DETAIL : ""
DEATH ||--o{ PERSON : ""
DEATH ||--o{ CONCEPT : ""
NOTE ||--o{ PERSON : ""
NOTE ||--o{ CONCEPT : ""
NOTE ||--o{ PROVIDER : ""
NOTE ||--o{ VISIT_OCCURRENCE : ""
NOTE ||--o{ VISIT_DETAIL : ""
NOTE_NLP ||--o{ CONCEPT : ""
SPECIMEN ||--o{ PERSON : ""
SPECIMEN ||--o{ CONCEPT : ""
FACT_RELATIONSHIP ||--o{ CONCEPT : ""
LOCATION ||--o{ CONCEPT : ""
CARE_SITE ||--o{ CONCEPT : ""
CARE_SITE ||--o{ LOCATION : ""
PROVIDER ||--o{ CONCEPT : ""
PROVIDER ||--o{ CARE_SITE : ""
PAYER_PLAN_PERIOD ||--o{ PERSON : ""
PAYER_PLAN_PERIOD ||--o{ CONCEPT : ""
COST ||--o{ DOMAIN : ""
COST ||--o{ CONCEPT : ""
DRUG_ERA ||--o{ PERSON : ""
DRUG_ERA ||--o{ CONCEPT : ""
DOSE_ERA ||--o{ PERSON : ""
DOSE_ERA ||--o{ CONCEPT : ""
CONDITION_ERA ||--o{ PERSON : ""
CONDITION_ERA ||--o{ CONCEPT : ""
EPISODE ||--o{ PERSON : ""
EPISODE ||--o{ CONCEPT : ""
EPISODE_EVENT ||--o{ EPISODE : ""
EPISODE_EVENT ||--o{ CONCEPT : ""
METADATA ||--o{ CONCEPT : ""
CDM_SOURCE ||--o{ CONCEPT : ""
CONCEPT ||--o{ DOMAIN : ""
CONCEPT ||--o{ VOCABULARY : ""
CONCEPT ||--o{ CONCEPT_CLASS : ""
VOCABULARY ||--o{ CONCEPT : ""
DOMAIN ||--o{ CONCEPT : ""
CONCEPT_CLASS ||--o{ CONCEPT : ""
CONCEPT_RELATIONSHIP ||--o{ CONCEPT : ""
CONCEPT_RELATIONSHIP ||--o{ RELATIONSHIP : ""
RELATIONSHIP ||--o{ CONCEPT : ""
CONCEPT_SYNONYM ||--o{ CONCEPT : ""
CONCEPT_ANCESTOR ||--o{ CONCEPT : ""
SOURCE_TO_CONCEPT_MAP ||--o{ CONCEPT : ""
SOURCE_TO_CONCEPT_MAP ||--o{ VOCABULARY : ""
DRUG_STRENGTH ||--o{ CONCEPT : ""
COHORT_DEFINITION ||--o{ CONCEPT : ""

55
extras/createERDiagram.R Normal file
View File

@ -0,0 +1,55 @@
cdmVersion <- '5.4'
cdmPart <- c('CDM','VOCAB', 'RESULTS')
cdmTableCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Table_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
cdmFieldCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Field_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
tableSpecs <- read.csv(cdmTableCsvLoc, stringsAsFactors = FALSE)
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
mermaidDdlLines <- c()
mermaidFkLines <- c()
for (i in 1:nrow(tableSpecs)) {
table <- tableSpecs[i,]
tableName <- table$cdmTableName
if (!(table$schema %in% cdmPart)) {
next
}
mermaidDdlLines <- c(mermaidDdlLines,
sprintf(' %s {', tableName))
fields <- subset(cdmSpecs, cdmTableName == tableName)
for (j in 1:nrow(fields)) {
field <- fields[j,]
cdmFieldName <- field$cdmFieldName
cdmDataType <- field$cdmDatatype
if (startsWith(cdmDataType, 'varchar')) {
cdmDataType <- 'varchar'
}
if (cdmFieldName == '"offset"') {
cdmFieldName <- 'offset'
}
mermaidDdlLines <- c(mermaidDdlLines,
sprintf(' %s %s', cdmFieldName, cdmDataType))
if (field$isForeignKey == 'Yes') {
fkTable <- subset(tableSpecs, cdmTableName == field$fkTableName)
if (!(fkTable$schema %in% cdmPart)) {
next
}
fkRelation <- sprintf(' %s ||--o{ %s : ""', tableName, field$fkTableName)
if (fkRelation %in% mermaidFkLines) {
next
}
mermaidFkLines <- c(mermaidFkLines,
fkRelation)
}
}
mermaidDdlLines <- c(mermaidDdlLines, ' }')
}
mermaidString <- paste(c('erDiagram', mermaidDdlLines, mermaidFkLines), collapse = '\n')
fileName <- sprintf('OMOP_CDMv%s_ER_Diagram.mmd', cdmVersion)
write(mermaidString, file.path('extras', fileName))