@startuml PostgreSQL Database Schema !define PRIMARY_KEY(x) <&key> x !define FOREIGN_KEY(x) <&link-intact> x !define COLUMN(x) x !define INDEX(x) <&magnifying-glass> x scale 1024 width skinparam linetype ortho skinparam roundcorner 10 skinparam shadowing true skinparam entity { BackgroundColor #FFFEF0 BorderColor #2F4F4F ArrowColor #2F4F4F FontColor #333333 FontSize 12 AttributeFontSize 11 } skinparam note { BackgroundColor #FFFFCC BorderColor #999999 } package "External Tool schema" { entity "**history**" as history { .. Первичный ключ .. PRIMARY_KEY(id) : int8 <> ---- .. Атрибуты .. COLUMN(deployment_id) : uuid [NOT NULL] COLUMN(content_uuid) : uuid [NOT NULL] COLUMN(created) : timestamp [NOT NULL] COLUMN(message) : varchar(2048) [NOT NULL] ---- .. Ограничения .. <&check> pk_history (PRIMARY KEY) } entity "**lms_content**" as lms_content { .. Первичный ключ .. PRIMARY_KEY(id) : int8 <> ---- .. Атрибуты .. COLUMN(deployment_id) : uuid [NOT NULL] INDEX(content_uuid) : uuid [NOT NULL] COLUMN(created) : timestamp [NOT NULL] FOREIGN_KEY(task_id) : int8 [NOT NULL] ---- .. Ограничения .. <&check> pk_lms_content (PRIMARY KEY) <&link-intact> fk_lms_content_task (FOREIGN KEY) ---- .. Индексы .. <&list> idx_content_uuid (content_uuid) } entity "**task**" as task { .. Первичный ключ .. PRIMARY_KEY(id) : int8 <> ---- .. Атрибуты (обязательные) .. COLUMN(name) : varchar(250) [NOT NULL] COLUMN(description) : text [NOT NULL] ---- .. Атрибуты (опциональные) .. COLUMN(init_script) : text [NULL] COLUMN(verification_script) : text [NULL] COLUMN(delete_script) : text [NULL] ---- .. Ограничения .. <&check> pk_task (PRIMARY KEY) } } ' === СВЯЗИ === lms_content }o--|| task : " fk_lms_content_task\n (task_id → id) " ' === ЛОГИЧЕСКИЕ СВЯЗИ (пунктиром) === history ..> lms_content : " content_uuid, deployment_id " ' === ПРИМЕЧАНИЯ === note right of history **Таблица истории** ════════════════════ Хранит историю изменений и событий в системе. Назначение полей: • deployment_id - ID развёртывания • content_uuid - UUID контента • created - время создания • message - текст сообщения ✓ Все поля обязательные ⚠ Нет явных FK связей end note note left of task **Таблица лабораторных работ** ════════════════════ Хранит определения задач для системы обучения. Обязательные поля: • name - название задачи • description - описание Скрипты (опциональные): • init_script - инициализация • verification_script - проверка • delete_script - очистка end note note left of lms_content **Связь контента LMS с Task** ════════════════════ Связь контента из LMS с лабораторными работами в External Tool Индексы: • idx_content_uuid для быстрого поиска по UUID Связи: • task_id → task.id (N:1) ✓ Все поля обязательные end note @enduml