![]() |
![]() |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2. Нормализация баз данных2.1. Задача нормализации БДПри создании приложений баз данных наиболее важным этапом является конструирование БД (определение структур таблиц, связей между ними и т.д.). Ошибки в структуре данных трудно, а чаще вообще невозможно исправить программным путем. Чем лучше структура данных, тем легче программировать БД. Теория проектирования БД содержит концепцию нормальных форм, предназначенных для оптимизации структуры БД. Нормальные формы - это линейная последовательность правил, применяемых к БД, причем чем выше номер нормальной формы, тем совершеннее структура БД. Нормализация - это многоступенчатый процесс, при котором таблицы БД организуются, разъединяются и данные приводятся в порядок. Концепцию нормализации впервые представил Е.Ф. Кодд (E.F. Codd) в 1970-е годы. Задача нормализации остается той же самой и сегодня: устранить из БД некоторые нежелательные характеристики. В частности, ставится задача устранить некоторые виды избыточности данных и благодаря этому избежать аномалий при изменении данных. Аномалии изменения данных - это сложности при операциях вставки, изменения и удаления данных, возникающие из-за структуры БД. Хотя существует много уровней, обычно достаточно выполнить нормализацию до Третьей нормальной формы (3НФ). Рассмотрим пример нормализации БД управления доставкой заказов. Неупорядоченная БД " Продажи" состояла бы из одной таблицы " Продажи" выглядела бы так:
В таблице каждая запись содержит сведения о нескольких заказах одного клиента. Поскольку столбец со сведениями о товаре содержит слишком много данных, получить упорядоченную информацию из этой таблицы сложно (например, составить отчет о суммарных закупках по различным видам товаров). 2.2. Первая нормальная форма (1НФ)Первая нормальная форма(1НФ) предопределяет атомарность всех данных, содержащихся в столбцах. Слово "атом" происходит от латинского "atomis", что буквально означает "не подлежащий разделению". 1НФ задает существование в каждой позиции, определяемой строкой и столбцом, только одного значения, а не массива или списка значений. Преимущества этого требования очевидны: если в одном столбце хранятся списки значений, то не существует простого способа манипулировать этими значениями. Конечно, при этом увеличивается количество записей в таблице. Выполним нормализацию БД " Продажи" до 1НФ:
2.3. Вторая нормальная форма (2НФ)Ко Второй нормальной форме (2НФ) можно перейти от таблицы, которая уже соответствует 1НФ. Дополнительно должно выполняться следующее условие: каждое неключевое поле должно полностью зависеть от первичного ключа. Выполним нормализацию БД " Продажи" до 2НФ. Все сведения, не связанные с отдельными заказами, выделим в отдельную таблицу. В итоге получим вместо одной таблицы " Продажи" две - таблицу "Заказы":
и таблицу "Товары":
Таким образом, вид товара хранится только в одной таблице.Следует обратить внимание, что при нормализации информация не теряется. 2.4. Третья нормальная форма (3НФ)Считается, что таблица соответствует Третьей нормальной форме (3НФ), если она соответствует 2НФ и все не ключевые столбцы взаимно независимы. Столбец, значения которого получаются вычислением на основе данных из других столбцов, представляет собой один из примеров зависимости. Выполним нормализацию БД "Продажи" до 3НФ. Для этого следует удалить из таблицы "Заказы" столбец "Всего". Значения в этом столбце не зависят ни от одного ключа и могут быть вычислены по формуле ("Цена")*("Количество"). Таблица "Заказы"
Таблица "Товары":
Таким образом, получена БД "Продажи" с оптимальной структурой. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
![]() |