Проектирование реляционных баз данных: аномалии, функциональные зависимости и нормализация (1NF, 2NF, 3NF)
Теоретические основы проектирования БД: функциональные зависимости, аномалии обновления, удаления и вставки, правила нормализации от 1NF до 3NF.
При проектировании баз данных наивный подход часто приводит к созданию одной огромной 'универсальной' таблицы, куда складываются все атрибуты сущностей (например, студент, его группа, куратор, номер кабинета куратора и название сданного экзамена). Такой подход порождает избыточность данных (дублирование) и три критические аномалии модификации:
1. Аномалия вставки (Insertion Anomaly): невозможно добавить куратора или курс в систему до тех пор, пока на него не записан хотя бы один студент (первичный ключ студента не может быть NULL).
2. Аномалия удаления (Deletion Anomaly): если единственный студент группы отчисляется и его запись удаляется, безвозвратно теряются данные о самой группе, кураторе и кабинете.
3. Аномалия обновления (Update Anomaly): если куратор меняет номер кабинета, необходимо обновить сотни строк для каждого студента его группы. Если хотя бы одна строка будет пропущена, база данных придет в состояние логической несогласованности.
Процесс нормализации баз данных — это пошаговая декомпозиция таблиц на основе математической теории функциональных зависимостей для устранения избыточности без потери данных.
Реляционная структура связи таблиц БД
Функциональная зависимость (X -> Y)
Декомпозиция без потерь
Таблица находится в Первой нормальной форме (1NF), если:
1. В каждом поле каждого кортежа (строки) содержится ровно одно атомарное (неделимое) значение.
2. В таблице отсутствуют повторяющиеся группы или массивы в рамках одной строки (например, поле 'Телефоны' не должно содержать строку '8701111; 8702222').
3. У таблицы определен первичный ключ (простой или составной), однозначно идентифицирующий каждую строку.
Нарушение 1NF делает невозможным эффективный поиск, сортировку и индексацию по отдельным элементам составного поля. Для приведения к 1NF массивы значений выносятся в отдельные строки или связные дочерние таблицы.
Таблица находится во Второй нормальной форме (2NF), если:
1. Она уже находится в Первой нормальной форме (1NF).
2. Каждый неключевой атрибут функционально полно зависит от всего первичного ключа в целом, а не от его части.
Требование 2NF актуально для таблиц с составным первичным ключом (ключом, состоящим из двух и более колонок). Если первичный ключ состоит из (StudentID, CourseID), а поле CourseTitle зависит исключительно от CourseID, то это частичная функциональная зависимость.
Для приведения к 2NF атрибуты, зависящие от части ключа, выносятся в отдельную таблицу (в данном примере — справочник Courses со своим ключом CourseID).
Действие 1
Действие 2
Действие 3
Действие 4
Действие 5
Таблица находится в Третьей нормальной форме (3NF), если:
1. Она находится во Второй нормальной форме (2NF).
2. Ни один неключевой атрибут не зависит транзитивно от первичного ключа.
Транзитивная зависимость возникает, когда первичный ключ X определяет неключевой атрибут Y, а атрибут Y, в свою очередь, определяет другой неключевой атрибут Z (X -> Y и Y -> Z, следовательно, X -> Z).
Классический пример: в таблице Студентов с первичным ключом StudentID хранятся поля GroupID и GroupSpecialty. Первичный ключ определяет группу, а группа определяет специальность. Специальность зависит от StudentID транзитивно через GroupID. Приведение к 3NF требует выноса GroupID и GroupSpecialty в отдельную таблицу Groups.
Золотое мнемоническое правило 3NF
Каждый неключевой атрибут должен зависеть от ключа (1NF), только от всего ключа (2NF) и ни от чего, кроме ключа (3NF), 'да поможет мне Кодд!' (Эдгар Кодд — создатель реляционной модели).
