Загрузка данных


# Практическое занятие 1. Вариант 7: Документооборот

---

## 1. Описание предметной области

**Документооборот** — это движение документов в организации с момента их создания или получения до завершения исполнения или отправки. Система документооборота автоматизирует процессы регистрации, хранения, поиска и контроля исполнения документов.

Основные процессы:
- Регистрация входящих и исходящих документов
- Создание внутренних документов (приказы, распоряжения, служебные записки)
- Маршрутизация документов между сотрудниками и подразделениями
- Контроль сроков исполнения
- Архивное хранение

---

## 2. Ключевые объекты системы

| Объект | Описание |
|--------|----------|
| **Документ** | Основная сущность (входящий, исходящий, внутренний) |
| **Сотрудник** | Пользователь системы, автор/исполнитель документа |
| **Подразделение** | Отдел организации, к которому прикреплён сотрудник |
| **Должность** | Штатная единица сотрудника |
| **Маршрут** | Путь движения документа между исполнителями |
| **Статус** | Текущее состояние документа |
| **Тип документа** | Классификация (приказ, письмо, акт и т.д.) |

---

## 3. Инфологическое проектирование

### 3a. ER-диаграмма (концептуальная)

```
[Подразделение] ──1:N── [Сотрудник]
[Сотрудник] ──1:N── [Документ] (автор)
[Сотрудник] ──1:N── [Маршрут] (исполнитель)
[Документ] ──1:N── [Маршрут]
[Тип документа] ──1:N── [Документ]
[Статус] ─1:N── [Документ]
[Документ] ──1:N── [Версия документа]
```

**Связи:**
- Подразделение содержит сотрудников (1:N)
- Сотрудник создаёт документы (1:N)
- Документ проходит маршрут через сотрудников (M:N → 1:N через ассоциативную сущность)
- Тип документа классифицирует документы (1:N)
- Статус описывает состояние документа (1:N)

### 3b. Уточнённая ER-диаграмма с атрибутами

**Подразделение**
- id_подразделения (PK)
- название
- код

**Должность**
- id_должности (PK)
- название

**Сотрудник**
- id_сотрудника (PK)
- ФИО
- id_подразделения (FK)
- id_должности (FK)
- email
- телефон

**Тип документа**
- id_типа (PK)
- название
- префикс_номера

**Статус**
- id_статуса (PK)
- название

**Документ**
- id_документа (PK)
- номер
- дата_создания
- тема
- id_автора (FK → Сотрудник)
- id_типа (FK)
- id_статуса (FK)
- содержание

**Маршрут**
- id_маршрута (PK)
- id_документа (FK)
- id_исполнителя (FK → Сотрудник)
- дата_назначения
- дата_исполнения
- комментарий
- id_статуса (FK)

---

## 4. Логическое проектирование (реляционная схема)

```
ПОДРАЗДЕЛЕНИЕ(id_подразделения, название, код)

ДОЛЖНОСТЬ(id_должности, название)

СОТРУДНИК(id_сотрудника, ФИО, id_подразделения, id_должности, email, телефон)

ТИП_ДОКУМЕНТА(id_типа, название, префикс_номера)

СТАТУС(id_статуса, название)

ДОКУМЕНТ(id_документа, номер, дата_создания, тема, id_автора, id_типа, id_статуса, содержание)

МАРШРУТ(id_маршрута, id_документа, id_исполнителя, дата_назначения, дата_исполнения, комментарий, id_статуса)
```

---

## 5. Нормализация (до 3НФ)

### 1НФ — все атрибуты атомарны ✓
Все поля содержат неделимые значения.

### 2НФ — устранение частичных зависимостей ✓
Все неключевые атрибуты полностью зависят от первичного ключа. В таблице МАРШРУТ составной ключ не используется — введён суррогатный ключ id_маршрута.

### 3НФ — устранение транзитивных зависимостей ✓

**Было (до нормализации):**
```
ДОКУМЕНТ(id, номер, дата, тема, автор_ФИО, автор_подразделение, тип_название, статус_название, содержание)
```
Транзитивные зависимости: id → автор_ФИО → автор_подразделение; id → тип_название; id → статус_название.

**Стало (3НФ):**
```
ДОКУМЕНТ(id_документа, номер, дата_создания, тема, id_автора, id_типа, id_статуса, содержание)
СОТРУДНИК(id_сотрудника, ФИО, id_подразделения, id_должности, email, телефон)
ТИП_ДОКУМЕНТА(id_типа, название, префикс_номера)
СТАТУС(id_статуса, название)
```

Все транзитивные зависимости устранены выносом в отдельные таблицы.

---

## 6. Ключевые ограничения

| Таблица | Первичный ключ (PK) | Внешние ключи (FK) | Уникальность | Not Null |
|---------|---------------------|---------------------|--------------|----------|
| ПОДРАЗДЕЛЕНИЕ | id_подразделения | — | код UNIQUE | название NOT NULL |
| ДОЛЖНОСТЬ | id_должности | — | название UNIQUE | название NOT NULL |
| СОТРУДНИК | id_сотрудника | id_подразделения → ПОДРАЗДЕЛЕНИЕ, id_должности → ДОЛЖНОСТЬ | email UNIQUE | ФИО NOT NULL |
| ТИП_ДОКУМЕНТА | id_типа | — | название UNIQUE | название NOT NULL |
| СТАТУС | id_статуса | — | название UNIQUE | название NOT NULL |
| ДОКУМЕНТ | id_документа | id_автора → СОТРУДНИК, id_типа → ТИП_ДОКУМЕНТА, id_статуса → СТАТУС | номер+дата UNIQUE | номер, дата_создания NOT NULL |
| МАРШРУТ | id_маршрута | id_документа → ДОКУМЕНТ, id_исполнителя → СОТРУДНИК, id_статуса → СТАТУС | — | id_документа, id_исполнителя NOT NULL |

**Дополнительные ограничения:**
- `дата_исполнения >= дата_назначения` (CHECK)
- `email LIKE '%@%.%'` (CHECK)
- Каскадное удаление: при удалении подразделения — сотрудники не удаляются (RESTRICT)
- При удалении документа — маршруты удаляются каскадно (CASCADE)