Initial commit
This commit is contained in:
81
play-life-backend/migrations/README.md
Normal file
81
play-life-backend/migrations/README.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# 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)`
|
||||
|
||||
Reference in New Issue
Block a user