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


# ПРАКТИЧЕСКАЯ РАБОТА №1
## Тема: «Построение схемы базы данных»
### Вариант 22 — Кулинария

**Выполнил:** Dilan  
**Преподаватель:** А.А. Кравченко

---

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

**Кулинария** — предприятие общественного питания, специализирующееся на приготовлении и реализации кулинарных изделий (полуфабрикатов, готовых блюд, кондитерских изделий, салатов и т.д.).

**Основные бизнес-процессы предприятия:**

1. **Закупочная деятельность** — приобретение продуктов и сырья у поставщиков по договорным ценам.
2. **Складской учёт** — приёмка, хранение и списание продуктов с контролем сроков годности и условий хранения.
3. **Производство** — изготовление кулинарных изделий по утверждённым технологическим картам (рецептурам) с учётом норм закладки сырья.
4. **Кадровый учёт** — учёт сотрудников (поваров, кондитеров, технологов), их должностей и квалификации.
5. **Продажи** — реализация готовой продукции через торговые точки (витрины, отделы) с оформлением заказов.
6. **Классификация продукции** — ведение справочника категорий изделий (салаты, горячие блюда, выпечка, кондитерские изделия и т.д.).

**Цель создания БД:** автоматизация учёта производства, складских операций, продаж и кадрового состава для повышения эффективности управления предприятием.

---

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

| № | Объект (сущность) | Описание | Примеры |
|---|-------------------|----------|---------|
| 1 | **Поставщик** | Организация или ИП, поставляющее продукты | ООО «Молочный мир», ИП Иванов |
| 2 | **Продукт (Ингредиент)** | Сырьё, используемое для приготовления блюд | Мука, яйца, сахар, мясо |
| 3 | **Склад** | Помещение для хранения продуктов | Основной склад, холодильник |
| 4 | **Рецептура** | Технологическая карта приготовления изделия | Рецептура торта «Наполеон» |
| 5 | **Кулинарное изделие** | Готовый продукт, производимый предприятием | Торт, салат, пирожок |
| 6 | **Категория изделия** | Группа, к которой относится изделие | Салаты, выпечка, кондитерские |
| 7 | **Сотрудник** | Работник предприятия (повар, кондитер) | Петров И.И., Сидорова А.А. |
| 8 | **Должность** | Квалификационная позиция сотрудника | Повар 4 разряда, кондитер |
| 9 | **Клиент** | Покупатель продукции | Физическое или юридическое лицо |
| 10 | **Заказ** | Факт продажи продукции клиенту | Заказ №123 от 15.03.2024 |

---

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

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

```mermaid
erDiagram
    ПОСТАВЩИК ||--o{ ПРОДУКТ : "поставляет"
    ПРОДУКТ }o--o{ СКЛАД : "хранится на"
    ПРОДУКТ }o--o{ РЕЦЕПТУРА : "входит в состав"
    РЕЦЕПТУРА ||--o| КУЛИНАРНОЕ_ИЗДЕЛИЕ : "описывает"
    КУЛИНАРНОЕ_ИЗДЕЛИЕ }o--|| КАТЕГОРИЯ_ИЗДЕЛИЯ : "относится к"
    СОТРУДНИК }o--|| ДОЛЖНОСТЬ : "занимает должность"
    СОТРУДНИК }o--o{ КУЛИНАРНОЕ_ИЗДЕЛИЕ : "готовит"
    КУЛИНАРНОЕ_ИЗДЕЛИЕ }o--o{ ЗАКАЗ : "включается в"
    КЛИЕНТ ||--o{ ЗАКАЗ : "оформляет"

    ПОСТАВЩИК {
        string наименование
        string ИНН
        string адрес
    }

    ПРОДУКТ {
        string наименование
        string единица_измерения
    }

    СКЛАД {
        string наименование
        string адрес
    }

    РЕЦЕПТУРА {
        string название
        string технология
    }

    КУЛИНАРНОЕ_ИЗДЕЛИЕ {
        string наименование
        float цена
    }

    КАТЕГОРИЯ_ИЗДЕЛИЯ {
        string название_категории
    }

    СОТРУДНИК {
        string ФИО
        string телефон
    }

    ДОЛЖНОСТЬ {
        string название_должности
        int разряд
    }

    КЛИЕНТ {
        string ФИО
        string телефон
    }

    ЗАКАЗ {
        date дата_заказа
        float сумма
    }
```

**Комментарий к диаграмме:**

Диаграмма отражает основные сущности предметной области и связи между ними:

- **Поставщик — Продукт (1:M):** один поставщик может поставлять множество различных продуктов, но каждая партия продукта поступает от конкретного поставщика.
- **Продукт — Склад (M:N):** один и тот же продукт может храниться на разных складах (например, в холодильнике и в сухом складе), а на одном складе хранится множество продуктов.
- **Продукт — Рецептура (M:N):** один продукт может входить в состав множества рецептур, а каждая рецептура содержит множество продуктов.
- **Рецептура — Кулинарное изделие (1:1):** каждая рецептура описывает одно конкретное изделие.
- **Кулинарное изделие — Категория (M:1):** множество изделий относится к одной категории.
- **Сотрудник — Должность (M:1):** несколько сотрудников могут занимать одну должность.
- **Сотрудник — Кулинарное изделие (M:N):** сотрудник может готовить разные изделия, а одно изделие могут готовить разные сотрудники.
- **Кулинарное изделие — Заказ (M:N):** в одном заказе может быть несколько изделий, одно изделие может входить в разные заказы.
- **Клиент — Заказ (1:M):** один клиент может оформить несколько заказов.

---

### 3б. Уточнённая ER-диаграмма (с атрибутами и связующими таблицами)

```mermaid
erDiagram
    ПОСТАВЩИК {
        int id_поставщика PK
        string наименование
        string ИНН
        string адрес
        string телефон
        string контактное_лицо
    }

    ПРОДУКТ {
        int id_продукта PK
        string наименование
        string единица_измерения
        string категория_продукта
    }

    СКЛАД {
        int id_склада PK
        string наименование
        string адрес
        float температура_хранения
    }

    РЕЦЕПТУРА {
        int id_рецептуры PK
        string название
        string технология_приготовления
        int время_приготовления_мин
        int выход_грамм
        int id_изделия FK
    }

    КУЛИНАРНОЕ_ИЗДЕЛИЕ {
        int id_изделия PK
        string наименование
        float цена
        int вес_грамм
        int срок_годности_час
        int id_категории FK
    }

    КАТЕГОРИЯ_ИЗДЕЛИЯ {
        int id_категории PK
        string название_категории
        string описание
    }

    ДОЛЖНОСТЬ {
        int id_должности PK
        string название_должности
        int разряд
        float оклад
    }

    СОТРУДНИК {
        int id_сотрудника PK
        string ФИО
        string телефон
        date дата_приёма
        int id_должности FK
    }

    КЛИЕНТ {
        int id_клиента PK
        string ФИО
        string телефон
        string адрес
    }

    ЗАКАЗ {
        int id_заказа PK
        date дата_заказа
        float сумма
        int id_клиента FK
    }

    ПОСТАВКА {
        int id_поставки PK
        int id_поставщика FK
        int id_продукта FK
        date дата_поставки
        int количество
        float цена_закупки
    }

    ХРАНЕНИЕ {
        int id_хранения PK
        int id_продукта FK
        int id_склада FK
        int количество
        date дата_поступления
    }

    СОСТАВ_РЕЦЕПТУРЫ {
        int id_состава PK
        int id_рецептуры FK
        int id_продукта FK
        float количество
        string единица_измерения
    }

    ПРИГОТОВЛЕНИЕ {
        int id_приготовления PK
        int id_сотрудника FK
        int id_изделия FK
        date дата
        int количество
    }

    СОСТАВ_ЗАКАЗА {
        int id_позиции PK
        int id_заказа FK
        int id_изделия FK
        int количество
        float цена
    }

    ПОСТАВЩИК ||--o{ ПОСТАВКА : "осуществляет"
    ПРОДУКТ ||--o{ ПОСТАВКА : "поставляется в рамках"
    ПРОДУКТ ||--o{ ХРАНЕНИЕ : "хранится в"
    СКЛАД ||--o{ ХРАНЕНИЕ : "принимает на хранение"
    РЕЦЕПТУРА ||--o{ СОСТАВ_РЕЦЕПТУРЫ : "содержит"
    ПРОДУКТ ||--o{ СОСТАВ_РЕЦЕПТУРЫ : "включается в"
    РЕЦЕПТУРА }o--|| КУЛИНАРНОЕ_ИЗДЕЛИЕ : "описывает"
    КАТЕГОРИЯ_ИЗДЕЛИЯ ||--o{ КУЛИНАРНОЕ_ИЗДЕЛИЕ : "включает"
    ДОЛЖНОСТЬ ||--o{ СОТРУДНИК : "занимается"
    СОТРУДНИК ||--o{ ПРИГОТОВЛЕНИЕ : "выполняет"
    КУЛИНАРНОЕ_ИЗДЕЛИЕ ||--o{ ПРИГОТОВЛЕНИЕ : "производится"
    КЛИЕНТ ||--o{ ЗАКАЗ : "оформляет"
    ЗАКАЗ ||--o{ СОСТАВ_ЗАКАЗА : "содержит"
    КУЛИНАРНОЕ_ИЗДЕЛИЕ ||--o{ СОСТАВ_ЗАКАЗА : "включается"
```

**Комментарий к уточнённой диаграмме:**

В уточнённой диаграмме связи типа M:N реализованы через **связующие (ассоциативные) таблицы**:

1. **ПОСТАВКА** — связывает Поставщика и Продукт, содержит атрибуты самой поставки (дата, количество, цена закупки).
2. **ХРАНЕНИЕ** — связывает Продукт и Склад, содержит информацию о количестве и дате поступления.
3. **СОСТАВ_РЕЦЕПТУРЫ** — связывает Рецептуру и Продукт, содержит норму закладки ингредиента.
4. **ПРИГОТОВЛЕНИЕ** — связывает Сотрудника и Изделие, фиксирует факт приготовления.
5. **СОСТАВ_ЗАКАЗА** — связывает Заказ и Изделие, содержит количество и цену в заказе.

Все внешние ключи (FK) явно указаны в атрибутах таблиц.

---

## Задание 4. Логическое проектирование

Реляционная схема базы данных «Кулинария»:

```
ПОСТАВЩИК(id_поставщика PK, наименование, ИНН, адрес, телефон, контактное_лицо)

ПРОДУКТ(id_продукта PK, наименование, единица_измерения, категория_продукта)

СКЛАД(id_склада PK, наименование, адрес, температура_хранения)

КАТЕГОРИЯ_ИЗДЕЛИЯ(id_категории PK, название_категории, описание)

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

КЛИЕНТ(id_клиента PK, ФИО, телефон, адрес)

КУЛИНАРНОЕ_ИЗДЕЛИЕ(id_изделия PK, наименование, цена, вес_грамм, срок_годности_час, id_категории FK → КАТЕГОРИЯ_ИЗДЕЛИЯ)

РЕЦЕПТУРА(id_рецептуры PK, название, технология_приготовления, время_приготовления_мин, выход_грамм, id_изделия FK → КУЛИНАРНОЕ_ИЗДЕЛИЕ)

СОТРУДНИК(id_сотрудника PK, ФИО, телефон, дата_приёма, id_должности FK → ДОЛЖНОСТЬ)

ЗАКАЗ(id_заказа PK, дата_заказа, сумма, id_клиента FK → КЛИЕНТ)

ПОСТАВКА(id_поставки PK, id_поставщика FK → ПОСТАВЩИК, id_продукта FK → ПРОДУКТ, дата_поставки, количество, цена_закупки)

ХРАНЕНИЕ(id_хранения PK, id_продукта FK → ПРОДУКТ, id_склада FK → СКЛАД, количество, дата_поступления)

СОСТАВ_РЕЦЕПТУРЫ(id_состава PK, id_рецептуры FK → РЕЦЕПТУРА, id_продукта FK → ПРОДУКТ, количество, единица_измерения)

ПРИГОТОВЛЕНИЕ(id_приготовления PK, id_сотрудника FK → СОТРУДНИК, id_изделия FK → КУЛИНАРНОЕ_ИЗДЕЛИЕ, дата, количество)

СОСТАВ_ЗАКАЗА(id_позиции PK, id_заказа FK → ЗАКАЗ, id_изделия FK → КУЛИНАРНОЕ_ИЗДЕЛИЕ, количество, цена)
```

**Диаграмма реляционной схемы:**

```mermaid
graph TD
    subgraph Справочные таблицы
        A[ПОСТАВЩИК<br/>id_поставщика PK<br/>наименование<br/>ИНН<br/>адрес<br/>телефон]
        B[ПРОДУКТ<br/>id_продукта PK<br/>наименование<br/>единица_измерения]
        C[СКЛАД<br/>id_склада PK<br/>наименование<br/>адрес]
        D[КАТЕГОРИЯ_ИЗДЕЛИЯ<br/>id_категории PK<br/>название_категории]
        E[ДОЛЖНОСТЬ<br/>id_должности PK<br/>название_должности<br/>разряд<br/>оклад]
        F[КЛИЕНТ<br/>id_клиента PK<br/>ФИО<br/>телефон]
    end

    subgraph Основные таблицы
        G[КУЛИНАРНОЕ_ИЗДЕЛИЕ<br/>id_изделия PK<br/>наименование<br/>цена<br/>вес<br/>id_категории FK]
        H[РЕЦЕПТУРА<br/>id_рецептуры PK<br/>название<br/>технология<br/>id_изделия FK]
        I[СОТРУДНИК<br/>id_сотрудника PK<br/>ФИО<br/>телефон<br/>id_должности FK]
        J[ЗАКАЗ<br/>id_заказа PK<br/>дата_заказа<br/>сумма<br/>id_клиента FK]
    end

    subgraph Связующие таблицы
        K[ПОСТАВКА<br/>id_поставки PK<br/>id_поставщика FK<br/>id_продукта FK<br/>количество]
        L[ХРАНЕНИЕ<br/>id_хранения PK<br/>id_продукта FK<br/>id_склада FK<br/>количество]
        M[СОСТАВ_РЕЦЕПТУРЫ<br/>id_состава PK<br/>id_рецептуры FK<br/>id_продукта FK<br/>количество]
        N[ПРИГОТОВЛЕНИЕ<br/>id_приготовления PK<br/>id_сотрудника FK<br/>id_изделия FK<br/>количество]
        O[СОСТАВ_ЗАКАЗА<br/>id_позиции PK<br/>id_заказа FK<br/>id_изделия FK<br/>количество]
    end

    A --> K
    B --> K
    B --> L
    C --> L
    D --> G
    G --> H
    G --> N
    E --> I
    I --> N
    F --> J
    J --> O
    G --> O
    H --> M
    B --> M

    style A fill:#e1f5fe
    style B fill:#e1f5fe
    style C fill:#e1f5fe
    style D fill:#e1f5fe
    style E fill:#e1f5fe
    style F fill:#e1f5fe
    style G fill:#fff3e0
    style H fill:#fff3e0
    style I fill:#fff3e0
    style J fill:#fff3e0
    style K fill:#f3e5f5
    style L fill:#f3e5f5
    style M fill:#f3e5f5
    style N fill:#f3e5f5
    style O fill:#f3e5f5
```

---

## Задание 5. Нормализация (до 3 нормальной формы)

### Исходная универсальная таблица (ненормализованная форма)

Рассмотрим объединённую таблицу, содержащую все данные о заказах:

> **ЗАКАЗ_ПОЛНЫЙ**(id_заказа, дата_заказа, ФИО_клиента, телефон_клиента, адрес_клиента, наименование_изделия, цена_изделия, вес_изделия, название_категории, описание_категории, количество, цена_в_заказе, сумма)

### Приведение к 1НФ

**Требование 1НФ:** все атрибуты должны быть атомарными (неделимыми), в таблице не должно быть повторяющихся групп.

В нашей таблице все поля содержат простые значения (числа, строки, даты), повторяющихся групп нет.

✅ **Таблица соответствует 1НФ.**

---

### Приведение к 2НФ

**Требование 2НФ:** таблица должна быть в 1НФ, и каждый неключевой атрибут должен полностью зависеть от первичного ключа (не должно быть частичных зависимостей).

Если рассматривать составной первичный ключ `(id_заказа, id_изделия)`, то:
- `дата_заказа`, `сумма` зависят только от `id_заказа` (частичная зависимость) 
- `наименование_изделия`, `цена_изделия`, `вес_изделия` зависят только от `id_изделия` (частичная зависимость) ❌
- `название_категории`, `описание_категории` зависят от `id_категории`, который зависит от `id_изделия` (транзитивная зависимость) 
- `ФИО_клиента`, `телефон_клиента`, `адрес_клиента` зависят от `id_клиента`, который зависит от `id_заказа` (транзитивная зависимость) ❌

**Декомпозиция для устранения частичных зависимостей:**

1. **ЗАКАЗ**(id_заказа PK, дата_заказа, сумма, id_клиента FK)
2. **КЛИЕНТ**(id_клиента PK, ФИО, телефон, адрес)
3. **СОСТАВ_ЗАКАЗА**(id_позиции PK, id_заказа FK, id_изделия FK, количество, цена_в_заказе)
4. **КУЛИНАРНОЕ_ИЗДЕЛИЕ**(id_изделия PK, наименование, цена, вес, срок_годности, id_категории FK)
5. **КАТЕГОРИЯ_ИЗДЕЛИЯ**(id_категории PK, название_категории, описание)

✅ **Таблицы соответствуют 2НФ.**

---

### Приведение к 3НФ

**Требование 3НФ:** таблица должна быть в 2НФ, и каждый неключевой атрибут должен нетранзитивно зависеть от первичного ключа (не должно быть транзитивных зависимостей).

Рассмотрим таблицу **СОТРУДНИК**:
> СОТРУДНИК(id_сотрудника, ФИО, телефон, дата_приёма, название_должности, разряд, оклад)

Здесь `название_должности`, `разряд`, `оклад` зависят от `id_должности`, который, в свою очередь, зависит от `id_сотрудника`. Это транзитивная зависимость. ❌

**Декомпозиция:**
- **СОТРУДНИК**(id_сотрудника PK, ФИО, телефон, дата_приёма, id_должности FK)
- **ДОЛЖНОСТЬ**(id_должности PK, название_должности, разряд, оклад)

Аналогично проверяем остальные таблицы — транзитивных зависимостей не обнаружено.

✅ **Все таблицы соответствуют 3НФ.**

---

### Диаграмма процесса нормализации

```mermaid
graph TD
    A["0НФ: Универсальная таблица ЗАКАЗ_ПОЛНЫЙ<br/>id_заказа, дата, ФИО_клиента, телефон_клиента,<br/>адрес_клиента, наименование_изделия,<br/>цена_изделия, категория_изделия, количество, сумма"] -->|"Устранение повторяющихся групп<br/>все атрибуты атомарны"| B["1НФ ✅<br/>Все поля содержат неделимые значения"]

    B -->|"Устранение частичных зависимостей<br/>наименование, цена, категория зависят<br/>только от id_изделия, а не от составного ключа"| C["2НФ ✅<br/>Декомпозиция на таблицы:<br/>- ЗАКАЗ<br/>- КЛИЕНТ<br/>- СОСТАВ_ЗАКАЗА<br/>- КУЛИНАРНОЕ_ИЗДЕЛИЕ<br/>- КАТЕГОРИЯ_ИЗДЕЛИЯ"]

    C -->|"Устранение транзитивных зависимостей<br/>название_должности, разряд, оклад зависят<br/>от id_должности, а не напрямую от id_сотрудника"| D["3НФ ✅<br/>Финальная схема из 15 таблиц<br/>Все таблицы в 3НФ"]

    style A fill:#ffcccc,stroke:#333,stroke-width:2px
    style B fill:#ffffcc,stroke:#333,stroke-width:2px
    style C fill:#ccffcc,stroke:#333,stroke-width:2px
    style D fill:#99ff99,stroke:#333,stroke-width:2px
```

---

### Итоговые таблицы в 3НФ

| № | Таблица | Первичный ключ (PK) | Внешние ключи (FK) | Статус 3НФ |
|---|---------|---------------------|---------------------|------------|
| 1 | ПОСТАВЩИК | id_поставщика | — | ✅ |
| 2 | ПРОДУКТ | id_продукта | — | ✅ |
| 3 | СКЛАД | id_склада | — | ✅ |
| 4 | КАТЕГОРИЯ_ИЗДЕЛИЯ | id_категории | — | ✅ |
| 5 | ДОЛЖНОСТЬ | id_должности | — | ✅ |
| 6 | КЛИЕНТ | id_клиента | — | ✅ |
| 7 | КУЛИНАРНОЕ_ИЗДЕЛИЕ | id_изделия | id_категории | ✅ |
| 8 | РЕЦЕПТУРА | id_рецептуры | id_изделия | ✅ |
| 9 | СОТРУДНИК | id_сотрудника | id_должности | ✅ |
| 10 | ЗАКАЗ | id_заказа | id_клиента | ✅ |
| 11 | ПОСТАВКА | id_поставки | id_поставщика, id_продукта | ✅ |
| 12 | ХРАНЕНИЕ | id_хранения | id_продукта, id_склада | ✅ |
| 13 | СОСТАВ_РЕЦЕПТУРЫ | id_состава | id_рецептуры, id_продукта | ✅ |
| 14 | ПРИГОТОВЛЕНИЕ | id_приготовления | id_сотрудника, id_изделия | ✅ |
| 15 | СОСТАВ_ЗАКАЗА | id_позиции | id_заказа, id_изделия | ✅ |

---

### Диаграмма функциональных зависимостей

```mermaid
graph TD
    subgraph "Функциональные зависимости (корректные)"
        A["id_заказа → дата_заказа, сумма, id_клиента"]
        B["id_клиента → ФИО, телефон, адрес"]
        C["id_изделия → наименование, цена, вес, срок_годности, id_категории"]
        D["id_категории → название_категории, описание"]
        E["id_сотрудника → ФИО, телефон, дата_приёма, id_должности"]
        F["id_должности → название_должности, разряд, оклад"]
    end

    subgraph "Транзитивные зависимости (устранены при нормализации)"
        G["id_заказа → id_клиента → ФИО_клиента, телефон_клиента ❌"]
        H["id_сотрудника → id_должности → название_должности, оклад ❌"]
        I["id_изделия → id_категории → название_категории ❌"]
    end

    style G fill:#ffcccc,stroke:#333,stroke-width:2px
    style H fill:#ffcccc,stroke:#333,stroke-width:2px
    style I fill:#ffcccc,stroke:#333,stroke-width:2px
```

---

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

### 6.1. Ограничения целостности данных

| № | Ограничение | Тип | Таблица | Описание |
|---|-------------|-----|---------|----------|
| 1 | **Первичный ключ (PK)** | PK | Все таблицы | Каждая таблица имеет уникальный идентификатор (id_*). Значение PK уникально и не может быть NULL. |
| 2 | **Внешний ключ: СОТРУДНИК.id_должности** | FK | СОТРУДНИК | Ссылается на ДОЛЖНОСТЬ(id_должности). Сотрудник не может иметь несуществующую должность. |
| 3 | **Внешний ключ: КУЛИНАРНОЕ_ИЗДЕЛИЕ.id_категории** | FK | КУЛИНАРНОЕ_ИЗДЕЛИЕ | Ссылается на КАТЕГОРИЯ_ИЗДЕЛИЯ(id_категории). Изделие должно относиться к существующей категории. |
| 4 | **Внешний ключ: ЗАКАЗ.id_клиента** | FK | ЗАКАЗ | Ссылается на КЛИЕНТ(id_клиента). Заказ должен быть оформлен существующим клиентом. |
| 5 | **Внешний ключ: РЕЦЕПТУРА.id_изделия** | FK | РЕЦЕПТУРА | Ссылается на КУЛИНАРНОЕ_ИЗДЕЛИЕ(id_изделия). Рецептура описывает существующее изделие. |
| 6 | **Внешний ключ: ПОСТАВКА.id_поставщика** | FK | ПОСТАВКА | Ссылается на ПОСТАВЩИК(id_поставщика). Поставка осуществляется существующим поставщиком. |
| 7 | **Внешний ключ: ПОСТАВКА.id_продукта** | FK | ПОСТАВКА | Ссылается на ПРОДУКТ(id_продукта). Поставляемый продукт должен существовать в справочнике. |
| 8 | **Внешний ключ: ХРАНЕНИЕ.id_продукта** | FK | ХРАНЕНИЕ | Ссылается на ПРОДУКТ(id_продукта). На складе хранится существующий продукт. |
| 9 | **Внешний ключ: ХРАНЕНИЕ.id_склада** | FK | ХРАНЕНИЕ | Ссылается на СКЛАД(id_склада). Продукт хранится на существующем складе. |
| 10 | **Внешний ключ: СОСТАВ_РЕЦЕПТУРЫ.id_рецептуры** | FK | СОСТАВ_РЕЦЕПТУРЫ | Ссылается на РЕЦЕПТУРА(id_рецептуры). Состав относится к существующей рецептуре. |
| 11 | **Внешний ключ: СОСТАВ_РЕЦЕПТУРЫ.id_продукта** | FK | СОСТАВ_РЕЦЕПТУРЫ | Ссылается на ПРОДУКТ(id_продукта). В рецептуре используется существующий продукт. |
| 12 | **Внешний ключ: СОСТАВ_ЗАКАЗА.id_заказа** | FK | СОСТАВ_ЗАКАЗА | Ссылается на ЗАКАЗ(id_заказа). Позиция принадлежит существующему заказу. |
| 13 | **Внешний ключ: СОСТАВ_ЗАКАЗА.id_изделия** | FK | СОСТАВ_ЗАКАЗА | Ссылается на КУЛИНАРНОЕ_ИЗДЕЛИЕ(id_изделия). В заказе указывается существующее изделие. |

### 6.2. Проверочные ограничения (CHECK)

| № | Ограничение | Таблица | Атрибут | Условие | Описание |
|---|-------------|---------|---------|---------|----------|
| 14 | **Положительное количество** | ПОСТАВКА, ХРАНЕНИЕ, СОСТАВ_РЕЦЕПТУРЫ, ПРИГОТОВЛЕНИЕ, СОСТАВ_ЗАКАЗА | количество | количество > 0 | Количество не может быть отрицательным или нулевым |
| 15 | **Неотрицательная цена** | КУЛИНАРНОЕ_ИЗДЕЛИЕ, ПОСТАВКА, СОСТАВ_ЗАКАЗА | цена, цена_закупки | цена >= 0 | Цена не может быть отрицательной |
| 16 | **Положительный вес** | КУЛИНАРНОЕ_ИЗДЕЛИЕ, РЕЦЕПТУРА | вес_грамм, выход_грамм | вес > 0 | Вес изделия должен быть положительным |
| 17 | **Положительный срок годности** | КУЛИНАРНОЕ_ИЗДЕЛИЕ | срок_годности_час | срок_годности > 0 | Срок годности должен быть положительным |
| 18 | **Положительное время приготовления** | РЕЦЕПТУРА | время_приготовления_мин | время > 0 | Время приготовления должно быть положительным |

### 6.3. Ограничения уникальности (UNIQUE)

| № | Ограничение | Таблица | Атрибут | Описание |
|---|-------------|---------|---------|----------|
| 19 | **Уникальность ИНН** | ПОСТАВЩИК | ИНН | ИНН поставщика должен быть уникальным |
| 20 | **Уникальность названия категории** | КАТЕГОРИЯ_ИЗДЕЛИЯ | название_категории | Названия категорий не должны повторяться |
| 21 | **Уникальность названия должности** | ДОЛЖНОСТЬ | название_должности | Названия должностей не должны повторяться |

### 6.4. Ограничения на пустые значения (NOT NULL)

| № | Ограничение | Таблица | Атрибут | Описание |
|---|-------------|---------|---------|----------|
| 22 | **Обязательные поля** | Все таблицы | PK, наименование, ФИО | Первичные ключи и основные наименования не могут быть пустыми |
| 23 | **Обязательная цена** | КУЛИНАРНОЕ_ИЗДЕЛИЕ, СОСТАВ_ЗАКАЗА | цена | Цена изделия и цена в заказе обязательны |
| 24 | **Обязательная дата** | ЗАКАЗ, ПОСТАВКА, ХРАНЕНИЕ, ПРИГОТОВЛЕНИЕ | дата_* | Даты операций обязательны |

### 6.5. Каскадные операции (ON DELETE / ON UPDATE)

| № | Ограничение | Таблица | Связанная таблица | Действие | Описание |
|---|-------------|---------|-------------------|----------|----------|
| 25 | **Каскадное удаление заказа** | ЗАКАЗ | СОСТАВ_ЗАКАЗА | ON DELETE CASCADE | При удалении заказа автоматически удаляются его позиции |
| 26 | **Каскадное удаление клиента** | КЛИЕНТ | ЗАКАЗ | ON DELETE CASCADE | При удалении клиента удаляются его заказы |
| 27 | **Запрет удаления категории** | КАТЕГОРИЯ_ИЗДЕЛИЯ | КУЛИНАРНОЕ_ИЗДЕЛИЕ | ON DELETE RESTRICT | Нельзя удалить категорию, если в ней есть изделия |
| 28 | **Запрет удаления должности** | ДОЛЖНОСТЬ | СОТРУДНИК | ON DELETE RESTRICT | Нельзя удалить должность, если есть сотрудники с этой должностью |
| 29 | **Каскадное обновление PK** | Все таблицы | Все FK | ON UPDATE CASCADE | При изменении PK автоматически обновляются все FK |

---

## Заключение

В ходе выполнения практической работы была спроектирована база данных для предметной области **«Кулинария»**. 

**Выполненные задачи:**

1. ✅ Описана предметная область и основные бизнес-процессы предприятия.
2. ✅ Выделено 10 ключевых объектов системы.
3. ✅ Проведено инфологическое проектирование:
   - Составлена концептуальная ER-диаграмма с 10 сущностями и 9 связями.
   - Составлена уточнённая ER-диаграмма с атрибутами и 5 связующими таблицами для реализации связей M:N.
4. ✅ Проведено логическое проектирование: разработана реляционная схема из 15 таблиц.
5. ✅ Проведена нормализация до 3НФ: устранены частичные и транзитивные зависимости, что исключает аномалии обновления, удаления и вставки.
6. ✅ Описаны ключевые ограничения: 29 ограничений целостности данных, включая PK, FK, CHECK, UNIQUE, NOT NULL и каскадные операции.

**Результат:** спроектированная база данных обеспечивает эффективное хранение и обработку информации о производстве, складском учёте, продажах и кадрах предприятия «Кулинария», соответствует требованиям нормализации и обеспечивает целостность данных.

---

**Список использованной литературы:**

1. Годин В.В. Базы данных: проектирование. Учебник для СПО. М: изд-во Юрайт, 2020 г.