Процесс приведения данных в реляционную форму называют нормализацией. Нормализация данных преследует две цели:
1. Исключение избыточности данных.
2. Обеспечение наибольшей гибкости структуры таблиц на случай будущих изменений.
Специалисты различают пять последовательных этапов (форм) приведения данных к реляционному виду: от первой нормальной формы (First Normal
Form, 1NF) до пятой (5NF). Впрочем, на практике программисты ограничиваются приведением данных к третьей нормальной форме. Это здоровый компромисс между полнотой нормализации и простотой написания программного продукта. Мы кратко ознакомимся со всеми нормальными формами.
Первая нормальная форма - 1NF
Первая нормальная форма является основой реляционной системы. Согласно требованиям этого этапа каждое из полей таблицы должно быть неделимым и не может содержать повторяющихся групп.
Что такое неделимое поле и как достичь неделимости на практике? Предположим, что мы работаем над БД домашней библиотеки. Взгляните на ненормализованный вариант таблицы Library. Она состоит из двух полей: Writer - автор книги и Books - название произведения. В этой таблице есть две ошибки, связанные с неделимостью поля. Наиболее грубая из них - в поле Books: атрибут поля одновременно содержит названия двух и более книг. Это неверно - для каждого произведения должна быть отведена отдельная строка таблицы. Вторая ошибка связана с полем Writer, где мы храним имя, отчество и фамилию писателя. Целесообразно сформировать три отдельных поля: имя - FName, отчество - LName, фамилия - Name, и причин тому несколько.
Представьте себе, что при вводе информации в колонку Writer пользователь вместо «Лев Николаевич Толстой» ввел «Толстой Лев Николаевич». С точки зрения человеческой логики это абсолютно одинаковые значения, но компьютер воспримет их как разные, что сразу отразится на работе программы. Вторая причина: разделив колонку Writer на три (по смыслу уже неделимых), мы значительно упростим задачу сортировки и выборки данных средствами SQL-запросов. Теперь, к примеру, мы получим возможность отобрать записи авторов без отчества и т. п. Заметьте, что приведенная к первой нормальной форме таблица приобрела явную избыточность, но на этом этапе это не страшно.
Теперь поговорим о повторяющейся группе. Повторяющаяся группа представляет собой поле, которое повторяется внутри строки с целью хранения
нескольких значений атрибута. Рассмотрим другой пример. Допустим, что мы разрабатываем БД, предназначенную для хранения данных о температуре воздуха, причем измерения производятся ежедневно каждый четный час.
Для хранения даты в таблице temperature используется поле TmprDate, а для хранения температуры - поле Tmpr. В одно и то же поле заносится несколько значений, разделенных точкой с запятой. Несостоятельность такого подхода при проектировании таблицы не вызывает сомнений. Представьте, как бы выглядела таблица, если бы измерения проводились каждые четверть часа.
Даже если повторяющихся групп немного, они все равно затруднят построение запросов и форматирование отчетов. Посмотрим, как от них избавиться. Для того чтобы преобразовать таблицу температур к 1NF, необходимо создать таблицу, состоящую из трех столбцов: даты, времени и температуры. И здесь (как и в случае приведения к 1NF таблицы Library) мы получили некоторую избыточность, но зато все логично.