-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Люди -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Справочник людей CREATE TABLE person ( person_id serial PRIMARY KEY, -- фамилия last_name text NOT NULL CHECK (default_word_check (last_name)), -- имя first_name text NOT NULL CHECK (default_word_check (first_name)), -- отчество middle_name text CHECK (default_word_check (middle_name)), -- дата рождения birth_date date NOT NULL CHECK (birth_date <= CURRENT_DATE), -- пол gender string NOT NULL, -- место жительства address text NOT NULL CHECK (default_str_check (address)) ); -- Справочник пациентов CREATE TABLE patient ( patient_id int PRIMARY KEY REFERENCES person (person_id), policy_number text NOT NULL CHECK (policy_number ~ '^[0-9]{16}$') ); -- Справочник врачей CREATE TABLE doctor ( doctor_id int PRIMARY KEY REFERENCES person (person_id) ); CREATE TABLE registrar ( registrar_id int PRIMARY KEY REFERENCES person (person_id) ); -- Справочник единиц измерения для числовых результатов CREATE TABLE unit ( unit_id serial PRIMARY KEY, name text NOT NULL CHECK (name ~ '^[а-яА-ЯёЁ%^/]+$' AND str_length_between (name, 1, 16)), UNIQUE (name) ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Назначения -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Базовая таблица назначения (TPT) CREATE TABLE prescription ( prescription_id serial PRIMARY KEY, -- пациент patient_id int NOT NULL REFERENCES patient (patient_id) ON DELETE CASCADE, -- врач doctor_id int NOT NULL REFERENCES doctor (doctor_id) ON DELETE RESTRICT ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Обследования -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Справочник типов обследований (Общий анализ крови", "ЭКГ", "УЗИ печени") CREATE TABLE examination_type ( examination_type_id serial PRIMARY KEY, -- название типа обследования (одно слово, без пробелов) name text NOT NULL CHECK (default_word_check (name)), -- категория обследования category text NOT NULL, UNIQUE (name) ); -- Общая таблица результатов обследований (TPT) CREATE TABLE result ( result_id serial PRIMARY KEY, examination_id int NOT NULL REFERENCES examination_type (examination_type_id) ON DELETE CASCADE, ); -- Журнал фактических обследований пациентов CREATE TABLE examination_type_prescription ( examination_prescription_id serial PRIMARY KEY, prescription_id int NOT NULL REFERENCES prescription (prescription_id) ON DELETE CASCADE, result_id int REFERENCES result (result_id) ON DELETE CASCADE, -- тип обследования examination_type_id int NOT NULL REFERENCES examination_type (examination_type_id) ON DELETE CASCADE, UNIQUE (prescription_id) ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Фактические результаты обследований -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Числовой результат обследования пациента (только один на обследование) CREATE TABLE numeric_result ( -- обследование пациента result_id int PRIMARY KEY REFERENCES result (result_id) ON DELETE CASCADE, -- значение результата value numeric NOT NULL, -- единица измерения unit_id int NOT NULL REFERENCES unit (unit_id) ON DELETE RESTRICT ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Нормальные результаты обследований -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Качественный результат обследования пациента (только один на обследование) CREATE TABLE qualitative_result ( -- обследование пациента result_id int PRIMARY KEY REFERENCES result (result_id) ON DELETE CASCADE, -- признак отклонения value boolean NOT NULL ); -- Общая таблица для справочника референсных (нормальных) значений (TPT) CREATE TABLE reference_value ( reference_value_id serial PRIMARY KEY, examination_type_id int NOT NULL REFERENCES examination_type (examination_type_id) ON DELETE CASCADE, gender text, -- пол (если норма специфична) age_min int, -- нижняя граница возраста (если есть зависимость) age_max int, -- верхняя граница возраста (если есть зависимость) CHECK ( (age_min IS NULL OR age_max IS NULL) -- если один из параметров не задан, не сравниваем OR (age_min < age_max) -- если оба заданы, min < max ), UNIQUE (examination_type_id, gender, age_min, age_max) ); -- Справочник референсных (нормальных) значений для числовых обследований CREATE TABLE reference_numeric_value ( reference_value_id int PRIMARY KEY REFERENCES reference_value (reference_value_id) ON DELETE CASCADE, min_value numeric, max_value numeric, unit_id int NOT NULL REFERENCES unit (unit_id) ON DELETE RESTRICT ); -- Справочник референсных (нормальных) значений для качественных обследований CREATE TABLE reference_qualitative_value ( reference_value_id int PRIMARY KEY REFERENCES reference_value (reference_value_id) ON DELETE CASCADE, description_true text NOT NULL CHECK (default_word_check (description_true)), description_false text NOT NULL CHECK (default_word_check (description_false)), UNIQUE (description_true, description_false) ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Синдромы -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Справочник синдромов CREATE TABLE syndrome_type ( syndrome_type_id serial PRIMARY KEY, name text NOT NULL CHECK (default_word_check (name)), UNIQUE (name) ); -- Соответствие синдромов и типов обследований (определяет, какое обследование позволяет определить синдром) CREATE TABLE syndrome_examination_type ( syndrome_id int PRIMARY KEY REFERENCES syndrome_type (syndrome_type_id) ON DELETE CASCADE, examination_type_id int NOT NULL REFERENCES examination_type (examination_type_id) ON DELETE CASCADE, UNIQUE (examination_type_id) ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Болезни и диагнозы -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Справочник заболеваний CREATE TABLE disease ( disease_id serial PRIMARY KEY, -- русское наименование name text NOT NULL CHECK (default_str_check (name)), -- код МКБ в формате A12.3 icd_code text NOT NULL CHECK (icd_code ~ '^[A-Z][0-9]{2}\.[0-9]$'), UNIQUE (name), UNIQUE (icd_code) ); -- Соответствие заболеваний и синдромов CREATE TABLE disease_syndrome ( disease_syndrome_id SERIAL PRIMARY KEY, disease_id int NOT NULL REFERENCES disease (disease_id) ON DELETE CASCADE, syndrome_id int NOT NULL REFERENCES syndrome_type (syndrome_type_id) ON DELETE CASCADE, UNIQUE (disease_id, syndrome_id) ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Госпитализация -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Госпитализация (начало) CREATE TABLE hospital_admission ( hospital_admission_id serial PRIMARY KEY, -- пациент patient_id int NOT NULL REFERENCES patient (patient_id) ON DELETE CASCADE, -- предварительный диагноз preliminary_disease_id int NOT NULL REFERENCES disease (disease_id), -- дата и время поступления admission_datetime timestamp NOT NULL CHECK (admission_datetime <= CURRENT_TIMESTAMP) ); -- Завершение госпитализации CREATE TABLE hospital_discharge ( hospital_discharge_id serial PRIMARY KEY, hospital_admission_id int NOT NULL REFERENCES hospital_admission (hospital_admission_id) ON DELETE CASCADE, -- дата и время выписки/смерти discharge_datetime timestamp NOT NULL CHECK (discharge_datetime <= CURRENT_TIMESTAMP), final_disease_id int NOT NULL REFERENCES disease (disease_id), -- причина завершения reason text NOT NULL ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Лекарства -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Справочник способов приёма лекарств CREATE TABLE drug_intake_method ( drug_intake_method_id serial PRIMARY KEY, -- наименование способа (например, "перорально", "внутримышечно", "внутривенно", "ингаляционно", "ректально") name text NOT NULL CHECK (default_word_check (name)), UNIQUE (name) ); -- Справочник лекарств CREATE TABLE drug_type ( drug_type_id serial PRIMARY KEY, international_name_ru text NOT NULL CHECK (default_word_check (international_name_ru)), international_name_en text CHECK (default_word_check (international_name_en)), international_name_la text CHECK (default_word_check (international_name_la)), brand_name_ru text CHECK (default_word_check (brand_name_ru)), UNIQUE (international_name_ru), UNIQUE (international_name_en), UNIQUE (international_name_la), UNIQUE (brand_name_ru) ); -- Журнал фактических назначений лекарств пациенту CREATE TABLE drug_type_prescription ( drug_prescription_id serial PRIMARY KEY, prescription_id int NOT NULL REFERENCES prescription (prescription_id) ON DELETE CASCADE, drug_type_id int NOT NULL REFERENCES drug_type (drug_type_id) ON DELETE RESTRICT, -- количество вещества за приём dose numeric NOT NULL CHECK (dose > 0), -- единица измерения дозы dose_unit_id int NOT NULL REFERENCES unit (unit_id) ON DELETE RESTRICT, -- способ приёма intake_method_id int NOT NULL REFERENCES drug_intake_method (drug_intake_method_id) ON DELETE RESTRICT, -- длительность приёма (в днях) duration_days int NOT NULL CHECK (duration_days > 0), UNIQUE (prescription_id) ); -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- Процедуры (для пациента) -- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -- -- Справочник типов процедур CREATE TABLE procedure_type ( procedure_type_id serial PRIMARY KEY, -- наименование процедуры (например, "физиотерапия") name text NOT NULL CHECK (default_word_check (name)), UNIQUE (name) ); -- Журнал фактических назначений процедур пациенту CREATE TABLE procedure_type_prescription ( procedure_prescription_id serial PRIMARY KEY, prescription_id int NOT NULL REFERENCES prescription (prescription_id) ON DELETE CASCADE, procedure_type_id int NOT NULL REFERENCES procedure_type (procedure_type_id) ON DELETE RESTRICT, scheduled_datetime timestamp NOT NULL, UNIQUE (prescription_id) ); insert into doctor (doctor_id) values (1), (2), (3); insert into registrar (registrar_id) values (4), (5), (6);