82 lines
2.8 KiB
Markdown
82 lines
2.8 KiB
Markdown
|
|
# 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)`
|
|||
|
|
|