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)`
|
||
|