JavaRush /Курсы /Модуль 4. Работа с БД /Нормальные формы базы данных

Нормальные формы базы данных

Модуль 4. Работа с БД
17 уровень , 2 лекция
Открыта

3.1 Нормализация базы данных

Нормальная форма - это свойство отношения в реляционной модели данных, которое характеризует его с точки зрения избыточности. Это может привести к логически неверным результатам выборки или изменения данных. Нормальная форма определяется как набор требований, которым должно соответствовать отношение (таблица в базе данных).

Процесс преобразования отношений базы данных в нормальную форму называется нормализацией. Она предназначена для минимизации логической избыточности и не влияет на производительность или размер базы данных.

Цель нормализации - уменьшить потенциальную противоречивость информации, хранящейся в базе данных.Общее назначение процесса нормализации заключается в следующем:

  • Исключение некоторых типов избыточности предусмотрено.
  • Исправление некоторых аномалий при обновлении.
  • Разработка проекта базы данных, который представляет реальный мир качественно, интуитивно понятен и может служить хорошей основой для дальнейшего расширения.
  • Облегчение процедуры применения необходимых ограничений целостности

Устранение избыточности обычно достигается декомпозицией отношений так, чтобы в каждом из них хранились только первичные факты. Хотя идеи нормализации полезны для проектирования баз данных, они не являются единственным или исчерпывающим способом улучшения качества проекта. Это связано с тем, что существует слишком большое разнообразие возможных ошибок и недостатков в структуре БД, которые не могут быть устранены при помощи нормализации.

Теория нормализации является важным достижением реляционной теории и практики. Она даёт строгие и обоснованные критерии для оценки качества проекта БД и методы для его улучшения. Это значительно лучше, чем чисто эмпирические подходы к проектированию в других моделях данных. Во всей сфере информационных технологий практически нет методов оценки и улучшения проектных решений, сравнимых с теорией нормализации реляционных баз данных по уровню формальной строгости.

Нормализация часто критикуется как «просто здравый смысл», и любой компетентный профессионал может проектировать полностью нормализованную БД без использования теории зависимостей. Однако, профессор Кристофер Дейт отмечал, что нормализация является формализованным здравым смыслом, которым руководствуется зрелый проектировщик. Идентифицировать и формализовать эти принципы — сложная задача, и успех в её решении — значительное достижение.

3.2 Первая нормальная форма

1НФ — базовая нормальная форма отношения в реляционной модели данных, называемая первой нормальной формой.

Переменная отношения находится в первой нормальной форме, когда в любом допустимом значении этой переменной каждый кортеж содержит только одно значение для каждого атрибута. В реляционной модели отношение всегда находится в первой нормальной форме по определению.

Что касается различных таблиц, то они могут не представлять правильно отношения и, соответственно, не быть в 1НФ. Согласно определению Кристофера Дейта, такая таблица нормализована (то есть находится в первой нормальной форме) тогда и только тогда, когда она является прямым и верным представлением отношения. Более конкретно, таблица должна удовлетворять пяти условиям:

  • Строки не упорядочены по порядку, то есть их порядок не несет никакой информации.
  • Столбцы не упорядочены слева направо. То есть, порядок столбцов не несет никакой информации...
  • Нет повторяющихся строк в документе.
  • Каждое пересечение строки и столбца содержит только одно значение из соответствующего домена.
  • Все столбцы являются обычными.

Обычность всех столбцов таблицы означает, что в ней нет «скрытых» компонентов, доступных только при вызове определённого оператора вместо ссылок на имена регулярных столбцов, или приводящих к побочным эффектам для строк или таблиц при вызове стандартных операторов.

Таблица, не представляющая нормализованное отношение:

Employee Phone number
Nicole Garnett

231-232-4978

617-842-3385

Cal Hannah 510-378-5911
Cale Dane

Таблица, приведённая к 1НФ, представляет правильное соотношение.

Employee Phone number
Nicole Garnett

231-232-4978

Cal Hannah 617-842-3385
Cale Dane 510-378-5911

3.3 Вторая нормальная форма

Переменная отношения находится во второй нормальной форме только в том случае, если она находится в первой нормальной форме и каждый неключевой атрибут неприводимо зависит от каждого её потенциального ключа.

Неприводимость означает, что в составе потенциального ключа отсутствует меньшее подмножество атрибутов, необходимое для вывода данной функциональной зависимости. Это явление часто называют «полной функциональной зависимостью».

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

Пример приведения отношения к второй нормальной форме: Пусть в отношении первичный ключ состоит из пары атрибутов {Филиал компании, Должность}.

R

Company branch Position Salary Availability of a computer
Branch in Mumbai Cleaner 20000 No
Branch in Sydney Programmer 40000 Yes
Branch in Mumbai Programmer 25000 Yes

Допустим, что зарплата зависит от филиала и должности, а наличие компьютера – только от должности.

Существует функциональная зависимость Должность → Наличие компьютера, где левая часть (детерминант) является частью первичного ключа. Это нарушает условие второй нормальной формы.

Для приведения к 2NF исходное отношение нужно декомпозировать на два отношения.

R1

Company branch Position Salary
Branch in Mumbai Cleaner 20000
Branch in Sydney Programmer 40000
Branch in Mumbai Programmer 25000

R2

Position Availability of a computer
Cleaner No
Programmer Yes

3.4 Третья нормальная форма (3НФ, 3NF)

Переменная отношения R находится в 3NF только при соблюдении следующих условий:

  • R должна быть во второй нормальной форме;
  • ни один неключевой атрибут R не должен находиться в транзитивной функциональной зависимости от потенциального ключа R.

Пояснения к определению:

Атрибут R без ключа - это атрибут, который не связан с каким-либо потенциальным ключом R. Если атрибуты X определяют атрибуты Z (записывается X → Z, произносится «икс определяет зет») и между X и Z есть множество атрибутов Y, то это называется транзитивной функциональной зависимостью. При этом ни одно из множеств X, Y и Z не должно быть подмножеством другого. Функциональные зависимости X → Z, X → Y и Y → Z не должны быть тривиальными, и не должно быть функциональной зависимости Y → X. В 1982 году Карло Заниоло дал определение 3NF, которое эквивалентно определению Кодда, только другими словами. Отношение находится в 3NF, если для каждой из ее функциональных зависимостей X → A выполнено одно из следующих условий.

  • Х содержит А (то есть X → A — тривиальная функциональная зависимость)
  • Х — суперключ
  • А — ключевой атрибут (то есть А входит в состав потенциального ключа).

3NF и НФБК отличаются. НФБК не имеет третьего условия «А — ключевой атрибут». Билл Кент дал помнимую формулировку для 3NF: все неключевые атрибуты должны связываться с ключом, полным ключом и ни с чем кроме ключа. Это значит, что отношение находится во второй нормальной форме, а для 3NF необходимо дополнительное условие. Крис Дейт обозначает это резюме как «интуитивно привлекательное» и оно может быть использовано для НФБК: все атрибуты должны связываться с ключом, полным ключом и ни с чем кроме ключа.

Вариант определения 3NF Кента менее строгий, чем вариант нормальной формы Бойса-Кодда в формулировке Дейта, поскольку первый требует лишь того, чтобы неключевые атрибуты зависели от ключей.

Первичные атрибуты (которые являются ключами или их частями) не должны быть функционально зависимыми. Каждый из них предоставляет информацию о ключе самим ключом или его частью. Однако это правило действительно только для неключевых атрибутов. Если применить его ко всем атрибутам, то будут запрещены все сложные альтернативные ключи, поскольку каждый элемент такого ключа нарушит условие «полного ключа».

В качестве примера рассмотрим переменную отношения R1:

R1

Employee Department Phone
Nicole Accounting 23-23-49
Kassy Accounting 23-23-49
Diana Supply 51-37-59

Каждый сотрудник относится исключительно к одному отделу. Каждый отдел имеет единственный телефон. Атрибут Сотрудник является первичным ключом. У сотрудников нет личных телефонов, и телефон сотрудника зависит от отдела.

В примере существуют следующие функциональные зависимости: Сотрудник → Отдел, Отдел → Телефон, Сотрудник → Телефон.

Переменная отношения R1 находится во второй нормальной форме, поскольку каждый атрибут имеет не приводимую функциональную зависимость от потенциального ключа Сотрудника.

Зависимость Сотрудник → Телефон является транзитивной, поэтому отношение не находится в третьей нормальной форме.

В результате разделения R1 получаются два отношения, находящиеся в 3NF.

R2

Department Phone
Accounting 23-23-49
Supply 51-37-59

R3

Employee Department
Nicole Accounting
Kassy Accounting
Diana Supply

Исходное отношение R1 можно легко получить в результате операции соединения отношений R2 и R3.

Комментарии (18)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Валерий кривой Уровень 25
24 ноября 2025
Представьте себе базу данных для магазина видеоигр. У нас есть таблица, где указаны игра, платформа, цена, возрастное ограничение, магазин и адрес магазина. Сразу видно, что могут быть проблемы: одна игра бывает на нескольких платформах, возрастное ограничение зависит только от игры, а адрес магазина зависит от магазина, а не от игры. Game Platform Price Age_Rating Store Store_Address Mario Kart Switch, Wii 55 E GameStop 123 Main St, New York, NY Call of Duty PC, PS5 70 M Best Buy 456 Elm St, Los Angeles, CA FIFA 25 PS5, Xbox 65 E Target 789 Oak St, Chicago, IL Вот как применяем правила нормализации: 1NF – в каждой ячейке только одно значение. Например, если у игры несколько платформ, не пишем «Switch, Wii», а делаем отдельную строку для каждой платформы. Game Platform Price Age_Rating Store Store_Address Mario Kart Switch 55 E GameStop 123 Main St, New York, NY Mario Kart Wii 45 E GameStop 123 Main St, New York, NY 2NF – если ключ составной (например, «Игра + Платформа»), все данные должны зависеть от всей пары. Если «Возрастное ограничение» зависит только от игры, а не от платформы, эту информацию выносим в отдельную таблицу с одной колонкой «Игра → Возраст». 3NF – данные, не являющиеся ключами, не должны зависеть друг от друга. Адрес магазина зависит от магазина, а не от игры, поэтому создаём отдельную таблицу «Магазин → Адрес» и в основной таблице оставляем только ссылку на магазин. В итоге получаем чистую структуру: - Таблица игр с платформами и ценой - Таблица с возрастными ограничениями - Таблица магазинов с адресами Так база данных становится логичной, понятной и легко расширяемой.
Алексей Уровень 115
9 сентября 2025
Всё-таки диалоги с Амиго и его друзьями куда интереснее были 🙂
Родион Уровень 113
11 августа 2025
за какие грехи?..
Евгений Уровень 97
24 февраля 2025
Жестокая жесть...
Шиконоко Уровень 42
16 ноября 2024
Может я тупой, но мне кажется, что подача информации скомкана и непоследовательна, а часть и вовсе дается без контекста. Вообще не понятно
Олег Уровень 106 Expert
24 октября 2024
Очень сложно
Евгений Уровень 1
17 июля 2025
Олег, держись!
Олег Уровень 111 Expert
2 ноября 2023
И четвёртый пункт: Основные условия для таблицы, чтобы соответствовать третьей нормальной форме, следующие: Таблица должна быть во второй нормальной форме (2NF). Все неключевые атрибуты должны быть непрямо зависимыми от первичного ключа. Вторая нормальная форма (2NF) требует, чтобы каждый неключевой атрибут полностью зависел от всего первичного ключа, а не от его части. То есть все неключевые атрибуты должны быть функционально зависимыми от первичного ключа. Третья нормальная форма (3NF) добавляет еще одно условие. Она требует, чтобы все неключевые атрибуты были непрямо зависимыми от первичного ключа. То есть неключевые атрибуты не должны функционально зависеть от других неключевых атрибутов. Это означает, что если у нас есть таблица, где атрибут A функционально зависит от атрибута B, а атрибут B зависит от атрибута C, то атрибут A непрямо зависит от атрибута C. В таком случае, атрибуты A и C следует разделить на две отдельные таблицы, чтобы избежать транзитивных зависимостей.
Олег Уровень 111 Expert
2 ноября 2023
Третий пункт кратко: Чтобы таблица соответствовала второй нормальной форме, необходимо выполнение следующих условий: Таблица должна быть в первой нормальной форме (1NF). Все неключевые атрибуты должны полностью функционально зависеть от первичного ключа. Первая нормальная форма (1NF) требует, чтобы каждая ячейка таблицы содержала только одно значение и не было повторяющихся групп значений. Также каждая таблица должна иметь уникальный идентификатор (первичный ключ), который однозначно идентифицирует каждую запись в таблице. Вторая нормальная форма (2NF) требует, чтобы каждый атрибут, не являющийся частью первичного ключа, полностью зависел от всего первичного ключа, а не от его части. Это означает, что если в таблице есть составной первичный ключ, то каждый неключевой атрибут должен зависеть от всего составного первичного ключа, а не от его отдельных частей. Другими словами, во второй нормальной форме таблица разбивается на отдельные таблицы таким образом, чтобы каждая таблица содержала только те атрибуты, которые полностью зависят от первичного ключа этой таблицы.
Олег Уровень 111 Expert
2 ноября 2023
Второй пункт кратко можно предложить в таком изложении: 1НФ - это базовый уровень нормализации, который определяет структуру данных в реляционной модели. Основные критерии для того, чтобы отношение (таблица) находилось в 1НФ: Уникальность строк: Каждая строка в таблице должна быть уникальной, то есть не должно быть одинаковых строк. Это гарантирует, что каждая запись в таблице имеет уникальный идентификатор или первичный ключ. Атомарные значения: Значения в каждой ячейке (пересечении строки и столбца) должны быть атомарными, то есть не могут быть разделены на более мелкие части. Например, если у вас есть столбец "Адрес", он не должен содержать несколько частей адреса, таких как улица, город и почтовый индекс, в одной ячейке. Без упорядочения строк и столбцов: Порядок строк и столбцов в таблице не имеет значения для 1НФ. Информация не должна зависеть от порядка. Без повторяющихся строк: Каждая строка в таблице должна быть уникальной, и не должно быть дублирования строк. Все столбцы должны быть обычными: Это означает, что в таблице не должно быть специальных или скрытых столбцов, и каждый столбец должен содержать атомарные данные. Соблюдение этих условий обеспечивает, что данные в таблице организованы так, чтобы они были легко доступны и манипулируемы в реляционной базе данных. Это является отправной точкой для более высоких нормальных форм и помогает избежать избыточности и несогласованности данных.
Олег Уровень 111 Expert
2 ноября 2023
Думаю первый пункт кратко можно изложить так: "Нормализация базы данных - это метод оптимизации структуры реляционных баз данных, направленный на минимизацию избыточности данных и обеспечение их целостности. Процесс нормализации разделяет данные на более мелкие и связанные части, чтобы избежать дублирования информации и снизить вероятность ошибок. Преимущества нормализации: Устранение избыточности: Уменьшение дублирования данных, что экономит место на диске. Целостность данных: Минимизация возможных ошибок и противоречий. Интуитивное проектирование: Создание базы данных, которая легко понимается и обслуживается. Соблюдение ограничений целостности: Упрощение внедрения правил и ограничений для данных. Нормализация - важный метод в реляционной теории баз данных, предоставляющий строгие критерии для проектирования эффективных и надежных баз данных."