# Database Migrations Этот каталог содержит SQL миграции для создания структуры базы данных проекта play-life. ## Использование ### Создание базы данных с нуля Выполните миграцию для создания всех таблиц и представлений: ```bash psql -U your_user -d your_database -f 001_create_schema.sql ``` Или через docker-compose: ```bash docker-compose exec db psql -U playeng -d playeng -f /migrations/001_create_schema.sql ``` ## Структура базы данных ### Таблицы 1. **projects** - Проекты - `id` (SERIAL PRIMARY KEY) - `name` (VARCHAR(255) NOT NULL, UNIQUE) - `priority` (SMALLINT) 2. **entries** - Записи с текстом и датами создания - `id` (SERIAL PRIMARY KEY) - `text` (TEXT NOT NULL) - `created_date` (TIMESTAMP WITH TIME ZONE NOT NULL, DEFAULT CURRENT_TIMESTAMP) 3. **nodes** - Узлы, связывающие проекты и записи - `id` (SERIAL PRIMARY KEY) - `project_id` (INTEGER NOT NULL, FK -> projects.id ON DELETE CASCADE) - `entry_id` (INTEGER NOT NULL, FK -> entries.id ON DELETE CASCADE) - `score` (NUMERIC(8,4)) 4. **weekly_goals** - Недельные цели для проектов - `id` (SERIAL PRIMARY KEY) - `project_id` (INTEGER NOT NULL, FK -> projects.id ON DELETE CASCADE) - `goal_year` (INTEGER NOT NULL) - `goal_week` (INTEGER NOT NULL) - `min_goal_score` (NUMERIC(10,4) NOT NULL, DEFAULT 0) - `max_goal_score` (NUMERIC(10,4)) - `actual_score` (NUMERIC(10,4), DEFAULT 0) - `priority` (SMALLINT) - UNIQUE CONSTRAINT: `(project_id, goal_year, goal_week)` ### Materialized View - **weekly_report_mv** - Агрегированные данные по неделям для каждого проекта - `project_id` (INTEGER) - `report_year` (INTEGER) - `report_week` (INTEGER) - `total_score` (NUMERIC) ## Обновление Materialized View После изменения данных в таблицах `nodes` или `entries`, необходимо обновить materialized view: ```sql REFRESH MATERIALIZED VIEW weekly_report_mv; ``` ## Связи между таблицами - `nodes.project_id` → `projects.id` (ON DELETE CASCADE) - `nodes.entry_id` → `entries.id` (ON DELETE CASCADE) - `weekly_goals.project_id` → `projects.id` (ON DELETE CASCADE) ## Индексы Созданы индексы для оптимизации запросов: - `idx_nodes_project_id` на `nodes(project_id)` - `idx_nodes_entry_id` на `nodes(entry_id)` - `idx_weekly_goals_project_id` на `weekly_goals(project_id)` - `idx_weekly_report_mv_project_year_week` на `weekly_report_mv(project_id, report_year, report_week)`