Загрузка данных
# Практическое занятие 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)