This project is assigned to the OpenMRS 1.9 release milestone. The following design model does *NOT* match the final execution.
Our current concept mapping is fairly low-key and doesn't allow for looser mapping to other terminologies. Our current implementation assumes its almost a 1 to 1. (Or a "this is that"). In the real world the mapping is less exact. We need an extra attribute on the concept map to specify this.
We also need to specify the relationship between two mapped terms. We have no way to do that in openmrs currently. The goal of this would be to prevent users from having to create actual concepts for each mapped term but still be able to make use of the rich hierarchy in searching, etc.
Notes on what may be unclear from the image:
- The concept table is unchanged.
- The concept_reference_source is really the concept_source table and is unchanged
- concept_reference_term_map.a_is_to_b is FK to concept_map_type.concept_map_type_id (aka "type_of_map")
- concept_map.map_type is FK to concept_map_type.concept_map_type_id (aka "type_of_mapping")
- Concept reference sources are unique by name & version. UUID should be generated from these rather than be randomly generated, since we do not want LOINC version 2.32 in one implementation to have a different UUID from LOINC version 2.32 in another implementation
- hl7_code is derived from the HL7 Coding system table (0396) value. Must not exceed 20 characters. Most standard values are defined by HL7 – e.g., "LN" for LOINC. Local codes should always start with "99".
- Add a map type table. The map types can be relationships such as IS-A ("same-as", "broader-than", "narrower-than"), "related-to", etc.
- Add a 'map type' FK to the concept_map table. This allows concept-to-external-mappings to be more explicit
- Create a concept_map_term table.
- Move column concept_map.source to concept_map_term.source_id
- Move column concept_map.source_code to concept_map_term.code
- Create a concept_map_term_map table
- concept_map_term_map.term_a_id FK to concept_map_term.concept_map_term_id
- concept_map_term_map.term_b_id FK to concept_map_term.concept_map_term_id
- concept_map_term_map.as_is_to_b FK to concept_map_type.concept_map_id
- Add admin jsp page for concept_map_type
- Modify edit concept jsp page to allow managers to set the "map type" and also the "name/label" when defining a concept map
- Add admin jsp page for managing the concept_map_terms and their relationships (aka map types between terms)
To be discussed:
- How to display the term hierarchy in a concept search?
- How to allow someone to select "all concepts and 'child' terms/concepts" ?
Diabetes Mellitus (SNOMED 73211009) is a parent of Diabetes Mellitus, Type 1 (SNOMED 46635009) in the SNOMED system.
Rows in openmrs:
concept_reference_source: one row. source_id=1, name="SNOMED Clinical Terms"
concept_reference_term: 2 rows
1st row: id=1, code=73211009, name=Diabetes Mellitus
2nd row: id=2, code=46635009, name=Diabetes Mellitus, Type 1
concept_reference_term_map: one row. term_a_id=1, term_b_id=2, a_is_to_b=99
concept_map_type: two rows. id=99, name=IS_A; id=1, name=SAME_AS
(could stop there, no need to map to openmrs concepts if you don't want to)
concept: concept_id=1000, name=Diabetes Mellitus
concept_reference_map: concept_id=1000, term_id=1, map_type=1