2.8 KiB
2.8 KiB
Database Migrations
Этот каталог содержит SQL миграции для создания структуры базы данных проекта play-life.
Использование
Создание базы данных с нуля
Выполните миграцию для создания всех таблиц и представлений:
psql -U your_user -d your_database -f 001_create_schema.sql
Или через docker-compose:
docker-compose exec db psql -U playeng -d playeng -f /migrations/001_create_schema.sql
Структура базы данных
Таблицы
-
projects - Проекты
id(SERIAL PRIMARY KEY)name(VARCHAR(255) NOT NULL, UNIQUE)priority(SMALLINT)
-
entries - Записи с текстом и датами создания
id(SERIAL PRIMARY KEY)text(TEXT NOT NULL)created_date(TIMESTAMP WITH TIME ZONE NOT NULL, DEFAULT CURRENT_TIMESTAMP)
-
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))
-
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:
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)