Indications
An indication is a specific approved use of a drug for a disease — the FDA label entry that says “pembrolizumab is indicated for the first-line treatment of metastatic NSCLC in patients whose tumors express PD-L1 (TPS >= 1%).” Four entities decompose that sentence into queryable structure: indications, therapeutic_approaches, indication_biomarkers, and therapeutic_approach_prior_therapies.
Entities
Section titled “Entities”erDiagram
drug_approvals ||--o{ indications : "indicated for"
indications }o--|| diseases : "treats"
indications ||--o{ indication_biomarkers : "requires"
indication_biomarkers }o--|| biomarkers : "biomarker"
indication_biomarkers }o--o| therapeutic_approaches : "scoped to"
indications ||--o{ therapeutic_approaches : "treatment strategies"
therapeutic_approaches }o--o| regimens : "uses"
therapeutic_approaches ||--o{ therapeutic_approach_prior_therapies : "requires prior"
therapeutic_approach_prior_therapies }o--o| drugs : "prior drug"
indications — approved use linking drug_approval to disease
Section titled “indications — approved use linking drug_approval to disease”The central table. Each row links one drug_approval to one disease with rich contextual facets.
| Column | Type | Purpose |
|---|---|---|
drug_approval_id | FK | Parent drug approval |
disease_id | FK | Target disease |
indication_type | text | initial, supplemental, or expanded |
indication_text | text | Original indication wording from the drug label |
disease_stages | jsonb | Applicable stages (e.g., ["Stage IIIB", "Stage IV"]) |
disease_subtypes | jsonb | Applicable subtypes (e.g., ["squamous", "non-squamous"]) |
disease_extents | jsonb | Disease extents (e.g., ["metastatic", "locally advanced"]) |
disease_statuses | jsonb | Patient statuses (e.g., ["treatment-naive", "relapsed"]) |
population | text | Age or fitness constraints (e.g., "adult", "pediatric >= 12") |
risks | jsonb | Boxed warning risk tags |
accelerated_approval_date | timestamptz | Date of accelerated approval, if applicable |
full_approval_date | timestamptz | Date of full/traditional approval, if applicable |
accelerated_approval_studies | jsonb | NCT IDs or study names supporting accelerated approval |
full_approval_studies | jsonb | NCT IDs or study names supporting full approval |
data_source | text | Provenance: bioloupe, fda, ema, llm, etc. |
source_reference | text | External ID or URL in the source system |
confidence | decimal(3,2) | Extraction confidence score (0.00—1.00), LLM-extracted only |
A check constraint ensures full_approval_date >= accelerated_approval_date when both are set — an indication cannot receive full approval before accelerated approval.
therapeutic_approaches — treatment strategies within an indication
Section titled “therapeutic_approaches — treatment strategies within an indication”Each indication can have multiple therapeutic approaches representing different treatment strategies (monotherapy vs. combination, different lines of therapy).
| Column | Type | Purpose |
|---|---|---|
indication_id | FK | Parent indication |
regimen_id | FK (nullable) | Treatment regimen used, if mapped |
is_single_agent | boolean | Monotherapy (true) vs. combination (false) |
treatment_lines | jsonb | Lines of therapy (e.g., ["1L", "2L"]) |
treatment_settings | jsonb | Treatment settings (e.g., ["neoadjuvant", "adjuvant"]) |
min_line | integer | Minimum line of therapy (numeric) |
max_line | integer | Maximum line of therapy (numeric) |
indication_biomarkers — biomarker requirements for patient selection
Section titled “indication_biomarkers — biomarker requirements for patient selection”Captures companion diagnostic requirements. A biomarker can be scoped to the indication as a whole or to a specific therapeutic approach within it.
| Column | Type | Purpose |
|---|---|---|
indication_id | FK | Parent indication |
therapeutic_approach_id | FK (nullable) | Scoped to a specific approach, or null for indication-wide |
biomarker_id | FK | The required biomarker |
requirement | text | required, recommended, or optional |
required_value | text | Expected test result (e.g., "TPS >= 50%", "Positive") |
companion_diagnostic | text | Name of the approved companion diagnostic test |
therapeutic_approach_prior_therapies — required prior treatments
Section titled “therapeutic_approach_prior_therapies — required prior treatments”Records which prior therapies a patient must have received (or failed) before qualifying for a therapeutic approach.
| Column | Type | Purpose |
|---|---|---|
therapeutic_approach_id | FK | Parent therapeutic approach |
therapy_name | text | Name of the required prior therapy |
requirement | text | must_have_received, refractory_to, relapsed, or intolerant_to |
drug_id | FK (nullable) | Linked drug entity, when the prior therapy maps to a known drug |
Design decisions
Section titled “Design decisions”Indications hang off drug_approvals, not drugs. A drug may have approvals in multiple regions (FDA, EMA, PMDA, NMPA), each with different indications. Attaching indications to the approval rather than the drug preserves this regional specificity. Querying “all indications for drug X” is a simple join through drug_approvals.
Therapeutic approaches model the treatment landscape. Rather than flattening line-of-therapy and setting into columns on indications, the schema uses a separate therapeutic_approaches table. This handles the common case where a single indication covers multiple treatment contexts — e.g., pembrolizumab for NSCLC is approved as both monotherapy in 1L and in combination with chemotherapy in 1L, each a distinct therapeutic approach.
Biomarkers can scope to indication or approach. The nullable therapeutic_approach_id on indication_biomarkers supports both indication-wide biomarker requirements (e.g., “all uses of this drug require HER2 testing”) and approach-specific ones (e.g., “PD-L1 >= 50% required only for the monotherapy approach”).
Prior therapies reference drugs loosely. The drug_id on therapeutic_approach_prior_therapies is nullable because prior therapy requirements often reference drug classes or regimen names (e.g., “prior platinum-based chemotherapy”) that do not map cleanly to a single drug entity.
Example queries
Section titled “Example queries”All indications for a drug, with disease and approval region:
select i.indication_text, d.name as disease, da.region, i.accelerated_approval_date, i.full_approval_datefrom indications ijoin drug_approvals da on da.id = i.drug_approval_idjoin diseases d on d.id = i.disease_idwhere da.drug_id = :drug_idorder by i.full_approval_date desc nulls last;Indications requiring a specific biomarker with their companion diagnostics:
select i.indication_text, d.name as disease, ib.required_value, ib.requirement, ib.companion_diagnosticfrom indication_biomarkers ibjoin indications i on i.id = ib.indication_idjoin diseases d on d.id = i.disease_idjoin biomarkers b on b.id = ib.biomarker_idwhere b.name = 'PD-L1' and ib.requirement = 'required';Second-line therapeutic approaches with their prior therapy requirements:
select dr.name as drug, d.name as disease, ta.treatment_lines, ta.is_single_agent, tapt.therapy_name, tapt.requirement as prior_therapy_requirementfrom therapeutic_approaches tajoin indications i on i.id = ta.indication_idjoin drug_approvals da on da.id = i.drug_approval_idjoin drugs dr on dr.id = da.drug_idjoin diseases d on d.id = i.disease_idleft join therapeutic_approach_prior_therapies tapt on tapt.therapeutic_approach_id = ta.idwhere ta.treatment_lines @> '["2L"]'::jsonborder by dr.name, d.name;