DerivedFunction1's picture
add
32f12c3
Raw
History Blame Contribute Delete
30.2 kB
-- ==========================================
-- 1. GLOBAL INFRASTRUCTURE & DIMENSION TABLES
-- ==========================================
CREATE TABLE
jurisdictions (
jurisdiction_id SERIAL PRIMARY KEY,
jurisdiction_code VARCHAR(10) NOT NULL UNIQUE,
-- 'US-NY', 'GB-ENG', 'JP'
region_name VARCHAR(100) NOT NULL
);
CREATE TABLE
facilities (
facility_id SERIAL PRIMARY KEY,
facility_code VARCHAR(50) NOT NULL UNIQUE,
-- 'HOSPITAL_A', 'CLINIC_B'
facility_name VARCHAR(150) NOT NULL
);
CREATE TABLE
specialties (
specialty_id SERIAL PRIMARY KEY,
specialty_name VARCHAR(100) NOT NULL UNIQUE
-- 'Cardiology', 'Ophthalmology'
);
CREATE TABLE
personnel (
personnel_id SERIAL PRIMARY KEY,
personnel_description TEXT,
auth_provider_uid VARCHAR(100) NOT NULL UNIQUE
-- Links to system OAuth/IAM ID
);
-- ==========================================
-- 2. CANONCIAL CORE CONCEPTS
-- ==========================================
CREATE TABLE
concept_namespaces (
namespace_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
standard_type VARCHAR(50) NOT NULL,
-- 'SNOMED', 'ICD-10', 'LOINC', 'FHIR', 'CUSTOM'
public_standard BOOLEAN DEFAULT TRUE,
-- True = Public, False = Private/Internal
is_external_private BOOLEAN DEFAULT FALSE,
-- Isolates imported external custom schemas
external_private_source VARCHAR(100),
-- Identifies the originating tenant (e.g., 'HOSPITAL_A')
about TEXT,
link VARCHAR(500),
-- API ENDPOINT: Production ready API to return the concept display string or metadata given a code
-- Ex: example.com/resolve?code={code}
api_url VARCHAR(8192),
-- Supports dynamic query construction with parameter placeholders (e.g., '{code}') for flexible API integrations
api_url_params JSONB,
-- A payload of data being sent the API for processing
api_request_body JSONB,
-- Captures the specific path within the API response body where the display string can be found (e.g. 'abc.results[0].text')
api_response_display_path VARCHAR(500),
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
-- Constraint ensures a specific vocabulary authority vector is logged exactly once
CONSTRAINT uq_namespace_authority UNIQUE (
standard_type, is_external_private,
external_private_source
)
);
CREATE TABLE
canonical_concepts (
concept_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
namespace_id UUID NOT NULL REFERENCES concept_namespaces(namespace_id) ON DELETE RESTRICT,
standard_code VARCHAR(100) NOT NULL,
-- The unchanging numeric code coordinate (e.g., 'R06.02')
display VARCHAR(150) NOT NULL,
-- Official fallback string definition at this timestamp
concept_date_designation TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
-- Captures semantic mapping adjustments
-- Composite unique key tracks semantic code drift dynamically over time within its authority space
CONSTRAINT uq_versioned_concept UNIQUE (
namespace_id, standard_code, concept_date_designation
)
);
CREATE INDEX
idx_concepts_traversal_speed ON canonical_concepts (
namespace_id, standard_code, concept_date_designation DESC
); CREATE TYPE concept_translator_relation ENUM (
'EQUIVALENT', 'NARROWER_THAN', 'WIDER_THAN'
);
CREATE TABLE
concept_translator (
link_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
concept_id UUID NOT NULL REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
linked_id UUID NOT NULL REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
-- 'EQUIVALENT', 'NARROWER_THAN', 'WIDER_THAN'
relationship_type concept_translator_relation NOT NULL DEFAULT 'EQUIVALENT',
active BOOLEAN DEFAULT TRUE,
-- Track exactly when this mapping consensus became valid
mapping_date_designation TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
CONSTRAINT chk_prevent_self_loop CHECK (concept_id <> linked_id),
-- Prevent exact duplicate mapping assertions within the same point in time
UNIQUE(
concept_id, linked_id, relationship_type,
mapping_date_designation
)
);
CREATE INDEX
idx_concept_translator_temporal ON concept_translator (
concept_id, mapping_date_designation,
active
);
CREATE TABLE
concept_translator_cache (
cache_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- The starting anchor node (e.g., Your proprietary custom code)
ancestor_concept_id UUID NOT NULL REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
-- The terminal reachable node (e.g., A global SNOMED or ICD-10 standard code)
descendant_concept_id UUID NOT NULL REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
-- 1 = Direct link, 2 = Parent-to-Grandchild link, 3 = Great-Grandchild, etc.
link_depth INTEGER NOT NULL CHECK (link_depth >= 1),
-- Inherited structural logic path tracking from the path chain
-- e.g., If any link in the path is 'NARROWER_THAN', the global traversal classification updates
inferred_relationship_type concept_translator_relation NOT NULL DEFAULT 'EQUIVALENT',
-- Mirroring the point in time this entire computed track matrix matches validation rules
mapping_date_designation TIMESTAMP
WITH
TIME ZONE NOT NULL,
active BOOLEAN DEFAULT TRUE,
-- Enforce uniqueness of a specific path vector instance at a single coordinate in time
UNIQUE(
ancestor_concept_id, descendant_concept_id,
inferred_relationship_type, mapping_date_designation
)
);
-- Compound index optimized for immediate inheritance evaluation during a backward ledger step
CREATE INDEX
idx_concept_cache_traversal ON concept_translator_cache (
ancestor_concept_id, mapping_date_designation,
active
) INCLUDE (
descendant_concept_id, link_depth,
inferred_relationship_type
);
CREATE TABLE
concept_display_registry (
display_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
concept_id UUID NOT NULL REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
-- ISO 639-1 or RFC 5646 codes (e.g., 'en', 'en-US', 'ja', 'es-MX')
language_code VARCHAR(10) NOT NULL DEFAULT 'en',
-- The target human-readable string projection
display_string TEXT NOT NULL,
-- Toggle True/False during usage instead of hardcoding inside display string
reference_standard BOOLEAN DEFAULT FALSE,
reference_code BOOLEAN DEFAULT FALSE,
-- Architecture Layering: Allows for system defaults vs custom localized variants
scope_tier VARCHAR(30) NOT NULL DEFAULT 'GLOBAL',
-- 'GLOBAL', 'CUSTOM_1', 'FACILITY', etc
-- Priority weighting for localized string lookups when multiple matches exist
preference_weight INTEGER DEFAULT 1,
active BOOLEAN DEFAULT TRUE
);
-- ==========================================
-- 3. JURISDICTIONAL INTERSECTION
-- ==========================================
CREATE TABLE
concept_jurisdictional_displays (
display_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
concept_id UUID REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
jurisdiction_id INTEGER REFERENCES jurisdictions(jurisdiction_id),
preferred_display TEXT NOT NULL,
fully_specified_name TEXT NOT NULL,
UNIQUE(concept_id, jurisdiction_id)
);
-- ==========================================
-- 4. CDSL EXPRESSIONS & PARSER CONFIG
-- ==========================================
CREATE TYPE expression_target_assignment AS ENUM (
'MAIN_TERM', 'ATTRIBUTE_MODIFIER',
'BOTH'
);
CREATE TABLE
custom_expressions (
expression_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
personnel_id INTEGER REFERENCES personnel(personnel_id),
expression_name VARCHAR(100) NOT NULL,
-- 'SOB', 'usual air problem', 'progressive'
regex_pattern TEXT NOT NULL,
-- Engine regex pattern. Should not encode numerical values
is_case_insensitive BOOLEAN DEFAULT TRUE,
-- Crucial Split: Tells the parser exactly where to route this token in the schema
-- 'MAIN_TERM': maps to observation/vitals concept node
-- 'ATTRIBUTE_MODIFIER': maps to trajectory, qualifiers, etc
-- 'BOTH': is a MAIN_TERM only when no other MAIN_TERMS exist, else it is an ATTRIBUTE
target_assignment expression_target_assignment NOT NULL DEFAULT 'MAIN_TERM',
concept_id UUID REFERENCES canonical_concepts(concept_id),
facility_id INTEGER REFERENCES facilities(facility_id),
specialty_id INTEGER REFERENCES specialties(specialty_id),
priority_weight INTEGER DEFAULT 1,
active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW()
);
CREATE INDEX
idx_expressions_parser_route ON custom_expressions (
expression_name, target_assignment,
active
);
-- ==========================================
-- 5. THE SYSTEM TAGGING MATRIX
-- ==========================================
CREATE TABLE
expression_tags (
tag_id VARCHAR(50) PRIMARY KEY,
-- 'anatomy', 'symptom', 'drug'
description TEXT
);
CREATE TABLE
expression_tag_matrix (
expression_id UUID REFERENCES custom_expressions(expression_id) ON DELETE CASCADE,
tag_id VARCHAR(50) REFERENCES expression_tags(tag_id),
PRIMARY KEY (expression_id, tag_id)
);
-- ==========================================
-- 6. HISTORY TRACKING
-- ==========================================
CREATE TABLE
expression_resolution_counters (
counter_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
expression_id UUID NOT NULL REFERENCES custom_expressions(expression_id) ON DELETE CASCADE,
concept_id UUID NOT NULL REFERENCES canonical_concepts(concept_id) ON DELETE CASCADE,
-- Hierarchical Context Routing Tiers (Nullable to allow fallback resolution profiling)
facility_id INTEGER REFERENCES facilities(facility_id) ON DELETE
SET
NULL,
specialty_id INTEGER REFERENCES specialties(specialty_id) ON DELETE
SET
NULL,
personnel_id INTEGER REFERENCES personnel(personnel_id) ON DELETE
SET
NULL,
-- The Atomic Accumulator
usage_count BIGINT NOT NULL DEFAULT 0 CHECK (usage_count >= 0),
-- Tracking the lifecycle of the expression trend
last_resolved_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
-- Unique composite coordinate matrix ensures one tracking row per unique context intersection
CONSTRAINT uq_resolution_context_metric UNIQUE(
expression_id, concept_id, facility_id,
specialty_id, personnel_id
)
);
-- Indexing optimized for the context-autocomplete engine to grab the top-weighted suggestions instantly
CREATE INDEX
idx_resolution_weights_speed ON expression_resolution_counters (
expression_id, specialty_id, facility_id,
usage_count DESC
) INCLUDE (concept_id);
-- LEVEL 1: Root Ledger Channels (Top-level polymorphic JSONB columns)
CREATE TYPE ledger_level1_channel AS ENUM (
'assessment', 'vitals_measurement',
'observation', 'exposure_profile',
'device_diagnostic_report', 'clinical_evaluation_report',
'procedure_order', 'medication_order',
'insurance_cost_evaluation', 'clinical_location_followup',
'patient_refusal', 'static_context',
'temporal_context'
);
-- LEVEL 2: Macro Context Containers
CREATE TYPE ledger_level2_context AS ENUM (
-- Core Situational Frameworks (Nests inside temporal_context)
'temporal_location',
-- Maps to temporal_context.location (spatial_type, jurisdiction, setting)
'environmental_weather',
-- Maps to temporal_context.weather (meteo stats, AQI, severe phenomena)
-- Core Material Frameworks (Nests inside static_context)
'protective_equipment',
-- Maps to static_context.ppe_gear (gear category, post-event integrity)
-- Clinical Context Sub-Profiles / Complex Bundles
'subject_of_record',
-- Maps to state_metadata.subject_of_record (primary patient vs proxy relative switches)
'session_variables_log',
-- Maps to state_metadata.session_variables (CDSL runtime tracking block instances)
'merge_resolution_topology',
-- Maps to state_metadata.merge_resolution (graph reconciliation paths)
'algorithmic_evaluation',
-- Maps to assessment.algorithmic_results (input concept array + raw/scalar/boolean output payloads)
-- Exposure Profile Target Profiles
'nutritional_exposure',
-- Maps to exposure_profile.nutritional_profile (dietary substance allergens + quantities)
'biological_exposure',
-- Maps to exposure_profile.biological_exposure_profile (vectors, taxonomy species, toxicity markers)
'mechanical_injury',
-- Maps to exposure_profile.mechanical_injury_profile (blunt, penetrating, avulsion mechanism switches)
'ballistic_profile',
-- Maps to exposure_profile.mechanical_injury_profile.ballistic_profile (weapon platform, caliber, deformation keys)
'injury_fall_details',
-- Maps to exposure_profile.mechanical_injury_profile.fall_details (height vectors, freefall flags)
-- Administrative Evaluation Triggers
'clinical_rule_conflict',
-- Maps to clinical_evaluation_report (drug conflicts, threshold violations, overrides)
'insurance_financial_breakdown',
-- Maps to insurance_cost_evaluation.financial_breakdown (allowables, copays, OOP responsibility)
'insurance_accumulator'
-- Maps to insurance_cost_evaluation.accumulator_impact (deductible and max-out balances)
);
-- LEVEL 3: Standard Object Components (Global reusable $defs structures)
CREATE TYPE ledger_level3_def AS ENUM (
'source_type', 'certainty', 'status',
'associated_agent', 'temporal_boundary',
'time', 'date_range', 'single_measurement',
'measurement', 'product_identifiers',
'anatomy_locations', 'vehicle',
'pharmaceutical'
); CREATE TYPE expression_tier_level AS ENUM (
'LEVEL_1', 'LEVEL_2', 'LEVEL_3', 'LEVEL_4',
'LEVEL_5'
);
CREATE TABLE
expression_hierarchical_routes (
route_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
expression_id UUID NOT NULL REFERENCES custom_expressions(expression_id) ON DELETE CASCADE,
-- The runtime operational level definition
tier_level expression_tier_level NOT NULL,
-- Level targets (Mutually exclusive or strictly cascaded based on constraints)
target_level1 ledger_level1_channel,
target_level2 ledger_level2_context,
target_level3 ledger_level3_def,
-- Targets a subfield within the JSONB structure defined by the level 1-3 targets (e.g., 'ballistic_profile.firearm_or_ordnance')
target_level4 VARCHAR(512),
target_level5 VARCHAR(512),
active BOOLEAN DEFAULT TRUE,
);
-- Create a composite execution index optimized to instantly pull the routing path definition
-- Highly optimized for query engine execution plans
CREATE INDEX
idx_expression_compiler_path ON expression_hierarchical_routes (
expression_id, active, tier_level
) INCLUDE (
target_level1, target_level2, target_level3,
target_level4, target_level5
);
-- ==========================================
-- SCALED CASCADING CONTEXT REGISTRY
-- ==========================================
CREATE TYPE configuration_data_type AS ENUM (
'int', 'float', 'string', 'bool', 'json', 'uuid'
);
CREATE TABLE hierarchical_configuration_registry (
config_key VARCHAR(100) NOT NULL, -- 'DEFAULT_SEVERITY_SCALE', 'DEFAULT_TEMP_UNIT'
config_type configuration_data_type NOT NULL,-- 'int', 'float', 'string', 'bool', 'json'
config_value TEXT NOT NULL, -- The raw string value to pass to the type caster
-- Cascading Scoping Matrix Tiers (All nullable to allow fallback routing execution)
jurisdiction_id INTEGER REFERENCES jurisdictions(jurisdiction_id) ON DELETE CASCADE,
facility_id INTEGER REFERENCES facilities(facility_id) ON DELETE CASCADE,
specialty_id INTEGER REFERENCES specialties(specialty_id) ON DELETE CASCADE,
description TEXT,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-- Prevents duplicate rules at the exact same architectural resolution layer
CONSTRAINT uq_scoped_config_coordinate UNIQUE (
config_key, jurisdiction_id, facility_id, specialty_id
)
);
-- Index optimized for the cascading compiler fallback matching engine
CREATE INDEX idx_config_inheritance_speed ON hierarchical_configuration_registry (
config_key, specialty_id, facility_id, jurisdiction_id
);
-- ==========================================
-- 1. TEMPLATE REGISTRY (Metadata Wrappers)
-- ==========================================
CREATE TABLE
note_templates (
template_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
template_code VARCHAR(100) NOT NULL UNIQUE,
-- 'T-CARDIO-SOAP-01', 'T-PEDS-HPI-02'
description TEXT,
specialty_id INTEGER REFERENCES specialties(specialty_id),
-- Optional domain restriction
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW()
);
-- ==========================================
-- 2. TEMPLATE VERSIONS (Timeline Control)
-- ==========================================
CREATE TABLE
template_versions (
version_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
template_id UUID REFERENCES note_templates(template_id) ON DELETE CASCADE,
semantic_version VARCHAR(20) NOT NULL,
-- '1.0.0', '1.1.0'
is_active BOOLEAN DEFAULT FALSE,
-- Controls runtime loading
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
UNIQUE(template_id, semantic_version)
);
-- ==========================================
-- 3. TEMPLATE SLOTS (The Jinja Render Blocks)
-- ==========================================
CREATE TABLE
template_slots (
slot_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
language_id VARCHAR(5) DEFAULT 'en',
version_id UUID REFERENCES template_versions(version_id) ON DELETE CASCADE,
document_location VARCHAR(50) NOT NULL,
-- 'subjective', 'objective', 'assessment', 'plan', 'full_document', etc
slot_key VARCHAR(50) NOT NULL,
-- 'opening', 'continuing', 'closing', 'full_paragraph'
jinja_template_text TEXT NOT NULL,
-- The actual string rendering syntax
UNIQUE(version_id, slot_key)
);
CREATE TABLE
template_expression_matrix (
version_id UUID REFERENCES template_versions(version_id) ON DELETE CASCADE,
expression_id UUID REFERENCES custom_expressions(expression_id) ON DELETE CASCADE,
PRIMARY KEY (version_id, expression_id)
);
-- ==========================================
-- 1. MACRO REGISTRY
-- ==========================================
CREATE TABLE
macro_registry (
macro_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
personnel_id INTEGER REFERENCES personnel(personnel_id),
macro_name VARCHAR(100) NOT NULL,
-- 'severe_shortness_of_breath', 'high_fever', etc
macro_template TEXT NOT NULL,
-- The template string with variable placeholders, and variable delimiters, independent of parser syntax
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
UNIQUE(macro_name)
);
-- ==========================================
-- 1. PARSER PROFILES
-- ==========================================
CREATE TABLE
parser_syntax_profiles (
profile_id UUID PRIMARY KEY,
personnel_id INTEGER REFERENCES personnel(personnel_id),
-- [TAGTOKEN]: Delimiter to identify the start of a tagged expression (e.g., '#drug', '#anatomy')
tag_token VARCHAR(5) DEFAULT '#'
-- [STATE_DELIMITER]: Delimiter identity a new state
state_delimiter VARCHAR(5) DEFAULT '||',
-- 1. [STATE_START] Outer Delimiter (e.g. '|' or '<' or '##')
state_start_delimiter VARCHAR(5) DEFAULT '|',
-- [STATE_END] Closing Delimiter (e.g. '|' or '>' or '##')
state_end_delimiter VARCHAR(5) DEFAULT '|',
-- '|' or '>' or '##', etc
-- 2. [COMMENT]: Comment tokens
comment_start_token VARCHAR(5) DEFAULT '//',
comment_end_token VARCHAR(5) DEFAULT ';',
-- 3. Macro Tokens (ex: ^macro($1, $2) -> @term; severity of $1, /set custom_vars{x=$2})
macro_start_token VARCHAR(5) DEFAULT '^',
-- [MACRO_PLACEHOLDER]: 'Triggers a macro to prefill text string and inputs'
macro_placeholder VARCHAR(5) DEFAULT '[__]',
-- 'Opens a variable fill block within the evaluated macro string if not defined'
-- 4. [VAR_START]: Variable Assignment tokens. Opens a variable evaluation block
variable_start_token VARCHAR(5) DEFAULT '{',
-- [VAR_END]: Closes a variable evaluation block
variable_end_token VARCHAR(5) DEFAULT '}',
-- [VAR_DELIMITER]: Delimiter between multiple variable assignments within the block
variable_delimiter VARCHAR(5) DEFAULT ',',
-- Delimiter between multiple variable assignments within the block
-- (name{x=10,y=True,z>5,a->{1,2,3, @SOB}, c={e,f,g}})
-- Ex: test{x=10,y=True} -> eval test{x=5} -> error; eval a=5 -> error
-- Does not need to be Turing Complete; does not perform mathematical operations on the RHS, meant for clincian expectations
---
---
-- Term Tokens (custom expressions or display names)
-- 5. [TERM_CODE]: '@@ICD-10#R06.02'
start_term_code_delimiter VARCHAR(5) DEFAULT '@@',
-- [TERM_DISPLAY]: '@#R06.02
start_term_display_delimiter VARCHAR(5) DEFAULT '@#',
-- [TERM_CODE_SEPARATOR]: Delimiter between the code system and the code in the inline specification (e.g., '@@SNOMED#123456')
start_term_code_separator VARCHAR(5) DEFAULT '#',
-- [TERM]: '~', '@' etc (@SOB, @Shortness of Breath, etc)
start_term_delimiter VARCHAR(5) DEFAULT '@',
-- [TERM_END]: Delimiter to signify the end of a term token (e.g., ';' or ',', ';;' etc)
end_term_delimiter VARCHAR(5) DEFAULT ';',
--
-- 6. [ATTRIBUTE]: Attribute Tokens (e.g. ',' or ';' )
attribute_delimiter VARCHAR(5) DEFAULT ',',
--
-- Checks if the profile is active
is_active BOOLEAN DEFAULT TRUE,
-- Constraint to prevent delimiter collisions that would break the parsing logic
CONSTRAINT chk_bulletproof_lexer_boundaries CHECK (
-- Protect global line blocks from colliding with inline node tags
state_delimiter <> state_start_delimiter
AND state_delimiter <> state_end_delimiter
-- Protect elements from matching core syntax tags
AND state_start_delimiter <> start_term_delimiter
AND variable_start_token <> state_start_delimiter
AND start_term_code_delimiter <> start_term_delimiter
AND start_term_display_delimiter <> start_term_delimiter
AND start_term_code_delimiter <> start_term_display_delimiter
-- Ensure variable assignment blocks do not collide with state blocks or term tags
AND variable_start_token <> state_start_delimiter
AND variable_end_token <> state_end_delimiter
-- Prevent comment wrappers from matching macro tags
AND comment_start_token <> macro_start_token
)
);
-- ==========================================================
-- 2. PARSER STOP WORDS
-- ==========================================================
CREATE TABLE
parser_stop_words (
stop_word_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- The literal token to strip during lexing (e.g., 'patient', 'reports', 'with')
word_token VARCHAR(100) NOT NULL,
-- Hierarchical Scoping Tiers (Cascading Nullable Foreign Keys)
jurisdiction_id INTEGER REFERENCES jurisdictions(jurisdiction_id) ON DELETE CASCADE,
facility_id INTEGER REFERENCES facilities(facility_id) ON DELETE CASCADE,
specialty_id INTEGER REFERENCES specialties(specialty_id) ON DELETE CASCADE,
personnel_id INTEGER REFERENCES personnel(personnel_id) ON DELETE CASCADE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW(),
-- Enforce uniqueness of a stop word within a specific contextual silo
CONSTRAINT uq_stop_word_context UNIQUE (
word_token, jurisdiction_id, facility_id,
specialty_id, personnel_id
)
);
-- Indexing optimized for instant hash-table loading during IDE session initialization
CREATE INDEX
idx_stop_words_session_load ON parser_stop_words (
personnel_id, specialty_id, facility_id,
jurisdiction_id
)
WHERE
is_active = TRUE;
-- ==========================================================
-- 1. THE IDENTITY MATRIX
-- ==========================================================
CREATE TYPE organism_domain AS ENUM ('human', 'animal', 'plant'); CREATE TYPE agent_lifecycle_status AS ENUM (
'active', 'deceased', 'inactive_archived'
); CREATE TYPE gender_classification AS ENUM (
'male', 'female', 'undetermined',
'not_applicable'
); CREATE TYPE date_precision_tier AS ENUM (
'exact_timestamp', 'day', 'month',
'year', 'estimated_epoch'
); CREATE TYPE ledger_mutation_operation AS ENUM (
'add', 'update', 'remove', 'merge',
'branch', 'archive'
); CREATE TYPE clinical_doc_section AS ENUM (
'initial_context', 'subjective',
'objective', 'assessment', 'plan',
'other'
); CREATE TYPE clinical_workflow_stage AS ENUM (
'history_taking', 'observation_gathering',
'measurement_recording', 'assessment_reasoning',
'plan_formulation', 'intervention_ordering',
'disposition_planning', 'other'
);
CREATE TABLE
registry_agents (
agent_id VARCHAR(2048) PRIMARY KEY,
initial_state_id VARCHAR(2048) DEFAULT NULL,
organism_type organism_domain NOT NULL,
status agent_lifecycle_status NOT NULL DEFAULT 'active',
registration_timestamp TIMESTAMP
WITH
TIME ZONE NOT NULL DEFAULT NOW(),
created_at TIMESTAMP
WITH
TIME ZONE DEFAULT NOW()
);
CREATE INDEX
idx_agents_cohort_lookup ON registry_agents (organism_type, status);
CREATE TABLE
agent_demographics (
agent_id VARCHAR(2048) PRIMARY KEY REFERENCES registry_agents(agent_id) ON DELETE CASCADE,
administrative_gender gender_classification NOT NULL DEFAULT 'undetermined',
origination_date TIMESTAMP
WITH
TIME ZONE NOT NULL,
origination_precision date_precision_tier NOT NULL DEFAULT 'exact_timestamp',
is_origination_date_estimated BOOLEAN NOT NULL DEFAULT FALSE,
legal_name_json JSONB NOT NULL,
organism_attributes JSONB NOT NULL,
organism_type organism_domain NOT NULL,
FOREIGN KEY (agent_id, organism_type) REFERENCES registry_agents(agent_id, organism_type) ON DELETE CASCADE,
CONSTRAINT chk_strict_organism_payloads CHECK (
(
organism_type = 'plant'
AND organism_attributes ? 'taxonomy'
AND organism_attributes ? 'propagation_method'
)
OR (
organism_type IN ('human', 'animal')
AND administrative_gender IS NOT NULL
)
)
);
-- ==========================================================
-- 6. THE CENTRAL EVENT LEDGER LAYER
-- ==========================================================
CREATE TABLE
medical_event_ledger (
state_id VARCHAR(2048) PRIMARY KEY,
previous_state_id VARCHAR(2048) REFERENCES medical_event_ledger(state_id),
mutation_parent_ids VARCHAR(2048) [] DEFAULT '{}',
-- Tracks multi-parent histories (Merges)
operation ledger_mutation_operation NOT NULL,
-- Transaction Provenance
state_context TEXT,
state_timestamp_utc TIMESTAMP
WITH
TIME ZONE NOT NULL DEFAULT NOW(),
agent_id VARCHAR(2048) NOT NULL REFERENCES registry_agents(agent_id),
personnel_id INTEGER REFERENCES personnel(personnel_id),
facility_id INTEGER REFERENCES facilities(facility_id),
clinical_document_location clinical_doc_section NOT NULL DEFAULT 'other',
clinical_workflow_phase clinical_workflow_stage NOT NULL DEFAULT 'other',
state_metadata_session_variables JSONB DEFAULT NULL,
merge_resolution JSONB DEFAULT NULL,
static_context JSONB DEFAULT NULL,
temporal_context JSONB DEFAULT NULL,
-- Clinical Streams
assessment JSONB DEFAULT NULL,
vitals_measurement JSONB DEFAULT NULL,
observation JSONB DEFAULT NULL,
exposure_profile JSONB DEFAULT NULL,
device_diagnostic_report JSONB DEFAULT NULL,
clinical_evaluation_report JSONB DEFAULT NULL,
procedure_order JSONB DEFAULT NULL,
medication_order JSONB DEFAULT NULL,
insurance_cost_evaluation JSONB DEFAULT NULL,
clinical_location_followup JSONB DEFAULT NULL,
patient_refusal JSONB DEFAULT NULL,
-- ==========================================================
-- CONSTRAINT ENFORCEMENT AT THE DATABASE PORTAL
-- ==========================================================
-- Enforce that merge details exist if and only if the operation type is a merge
CONSTRAINT chk_merge_data_integrity CHECK (
(
operation = 'merge'
AND merge_resolution IS NOT NULL
)
OR (
operation <> 'merge'
AND merge_resolution IS NULL
)
),
-- Enforce that if the operation is an update, the previous_state_id must exist, mutation_parent_ids must not be empty
CONSTRAINT chk_update_requires_previous CHECK (
(
operation = 'update'
AND previous_state_id IS NOT NULL
AND array_length(mutation_parent_ids, 1) > 0
)
OR (operation <> 'update')
),
-- Enforce that if the operation is a remove, the previous_state_id must exist, mutation_parent_ids must not be empty
CONSTRAINT chk_remove_requires_previous_and_null_context CHECK (
(
operation = 'remove'
AND previous_state_id IS NOT NULL
AND array_length(mutation_parent_ids, 1) > 0
)
OR (operation <> 'remove')
)
);
CREATE INDEX
idx_ledger_agent_timeline ON medical_event_ledger (
agent_id, state_timestamp_utc DESC
);
ALTER TABLE
registry_agents
ADD
CONSTRAINT fk_initial_state_ledger FOREIGN KEY (initial_state_id) REFERENCES medical_event_ledger(state_id);