Thank you @Patrick_Ryan - I think i understand, will try to reflect my understanding here - and maybe you could validate. btw - happy morning!
My original post was based on assumption that there is a 1:1 correlation between records of Cohort and Cohort_attribute tables i.e. for every row in Cohort there is a row in Cohort_attribute and vice versa. If that assumption is true then: Cohort table is just a subset of the fields in Cohort_attribute - because cohort holds a subset of fields from Cohort_attribute ‘cohort_definition_id, subject_id, cohort_start_date, cohort_end_date’ .
Based on your clarification - this assumption is not true (I think):
So my new understanding is: A record in the Cohort_attribute table is only populated if there is a need to represent information about an attribute for the cohort - i.e. computation derived and when there is a attribute_definition_id. So - not redundant.
Splitting hair here, but an option to consider: If there is not much adoption of the cohort_attribute table, we can eliminate it - but move its fields to the cohort table. i.e. we move attribute_definition_id, value_as_number, value_as_concept_id to cohort table. We add a new concept for attribute_definition_id that semantically represents something like ‘base - cohort definition’. When this concept is present it would make the base cohort definition. It will reduce the table count from OMOP model by one.