Почему хранение всех данных предметной области в одной универсальной таблице ведет к катастрофе?
Нормализация (Э. Кодд, 1970) — это научно обоснованный алгоритм декомпозиции одного отношения на несколько связанных отношений с целью устранения избыточности и предотвращения аномалий при сохранении семантической целостности.
Что конкретно ломается в базе данных при отсутствии нормализации?
Нельзя зафиксировать факт существования сущности А без сущности Б. Нельзя внести нового поставщика на склад, пока он не оформил накладную (ключ не терпит NULL).
Изменение номера телефона клиента требует обновления 10 000 строк. Сбой транзакции оставляет БД в разорванном, рассогласованном состоянии.
Удаляя строку закрытого заказа с уникальным товаром, мы непреднамеренно физически стираем всю карточку товара с его характеристиками и ценой.
Фундаментальный инструмент описания связей между атрибутами: формула Кодда X → Y.
Говорят, что атрибут Y функционально зависит от X (X → Y), если во всякий момент времени в отношении любые два кортежа с равными значениями X имеют абсолютно равные значения Y:
t1[X] = t2[X] ⇒ t1[Y] = t2[Y]
ИНН_организации → Название_компании.Ключевой водораздел между Первой и Второй нормальными формами.
Атрибут Y зависит от всего составного ключа в целом и не зависит ни от одной его части:
{Номер_накладной, Артикул} → Количество
Количество имеет смысл строго в контексте конкретной накладной и конкретного товара!
Атрибут Y зависит лишь от части составного ключа:
{Номер_накладной, Артикул} → Название_товара
НО: Артикул → Название_товара
Название товара не зависит от накладной! Это грубое нарушение требований 2НФ!
Отношение в 1НФ — это плоская прямоугольная таблица неделимых скалярных значений.
В каждой ячейке хранится ровно одно неделимое значение (скаляр). Никаких списков, массивов или составных строк через запятую.
Каждая строка таблицы обязана быть различима благодаря наличию первичного ключа (простого или составного).
Запрещены повторяющиеся столбцы типа Товар_1, Товар_2, Товар_3. Данные разворачиваются построчно.
Ликвидация частичных функциональных зависимостей от составного ключа.
Отношение находится во Второй нормальной форме (2NF) тогда и только тогда, когда оно находится в 1НФ и каждый неключевой атрибут функционально полно зависит от первичного потенциального ключа отношения.
Если первичный ключ отношения является простым (состоит из одного столбца), то отношение автоматически находится во 2НФ (в нем физически не может быть части составного ключа)!
Вынести частично зависимые атрибуты вместе с определяющей их частью первичного ключа в отдельные таблицы. Оставить в связующей таблице составной ключ и полные зависимости.
Исходная универсальная ведомость оптовой закупки товаров в 1НФ.
| Накладная* | Артикул* | Дата | Поставщик | Название товара | Цена закупки | Количество |
|---|---|---|---|---|---|---|
| ТТН-101 | ART-01 | 2026-10-01 | СеверСнаб | Кабель UTP Cat5e | 45.00 | 500 |
| ТТН-101 | ART-02 | 2026-10-01 | СеверСнаб | Патч-панель 24p | 1800.00 | 4 |
| ТТН-102 | ART-01 | 2026-10-02 | ЮграТрейд | Кабель UTP Cat5e | 45.00 | 200 |
Составной первичный ключ: {Накладная, Артикул}. Видно дублирование даты, поставщика и наименования товара!
Классификация всех зависимостей универсальной ведомости оптовых поставок.
Накладная → {Дата, Поставщик}
Дата поставки и имя поставщика зависят строго от номера накладной, а не от состава товаров.
Артикул → {Название_товара, Цена}
Характеристики товара зависят только от артикула и одинаковы во всех накладных.
{Накладная, Артикул} → Количество
Количество поставленного товара определяется строго пересечением накладной и артикула.
Три нормализованные таблицы, связанные внешними ключами PK → FK.
Номер_накладной (PK)
Дата_поставки
Поставщик
Ключ простой → 2НФ выполнена!
Артикул_товара (PK)
Название_товара
Цена_закупки
Ключ простой → 2НФ выполнена!
Номер_накладной (PK, FK)Артикул_товара (PK, FK)
Количество
Полная зависимость от ключа!
Математическая гарантия точного восстановления исходного отношения естественным соединением.
Декомпозиция отношения R(A, B, C) на R1(A, B) и R2(A, C) является декомпозицией без потерь, если общий атрибут A функционально определяет хотя бы одно из отношений (то есть является его ключом):
A → B или A → C
Исходная универсальная ведомость восстанавливается формулой:
R = (Накладные ⋈ Позиции) ⋈ Товары
Ни одна строка не потеряна, и не возникло ни одного фиктивного «призрачного» кортежа!
Как новая схема защищает бизнес-логику информационной системы.
Новый товар можно добавить в таблицу «Товары» в любой момент, даже если на складе еще не оформлено ни одной накладной.
Аннулирование ошибочной накладной удаляет записи из «Накладные» и «Позиции», но карточка товара остается в таблице «Товары» нетронутой.
Смена цены товара или названия поставщика выполняется строго в одной строке одной таблицы. Рассинхронизация физически невозможна!
Каждый студент выполняет анализ в интерактивном листе zanyatie.html.
Универсальная ведомость {Номер_накладной, Артикул, Дата, Поставщик, Название_товара, Ед_изм, Цена, Кол-во}. Ключ: {Накладная, Артикул}.
Журнал регистратуры {Номер_талона, СНИЛС, ФИО, Дата_рождения, Номер_кабинета, ФИО_врача, Специальность, Диагноз}. Ключ: {Талон, СНИЛС}.
Сводная ведомость {Номер_зачетки, Код_дисциплины, ФИО_студента, Группа, Название_дисциплины, Семестр, Часы, Оценка}. Ключ: {Зачетка, Дисциплина}.
Журнал выездов {Номер_листа, Код_авто, Дата_выезда, Марка, Госномер, Табельный_номер_водителя, ФИО_водителя, Пробег}. Ключ: {Лист, Код_авто}.
Памятка архитектору баз данных при решении практических задач.
{A, B}.{A}, от {B} и от полного ключа {A, B}.A, для B и связующую таблицу {A, B} с внешними ключами.Комикс xkcd №327: «Exploits of a Mom» (автор Рэндалл Манро) — самый цитируемый в мировой IT-индустрии мем об архитектуре реляционных баз данных, структуре таблиц и целостности отношений.
Мама назвала сына: Robert'); DROP TABLE Students;--
Связь с темой нормализации: Если база данных денормализована, и все студенты, оценки, группы и накладные лежат в одной плоской таблице, случайная ошибка или инъекция уничтожает сразу всю систему без возможности восстановления связей. Нормализация и строгие ключи PK → FK — опора надежности!