Часть 3.8: Третья нормальная форма (3NF)

Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3. Мы уже рассмотрели первую и вторую нормальную форму, давайте теперь разберемся с тем, как привести отношение ко третьей нормальной форме и избавиться от транзитивной зависимости.

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


Давайте разбираться. Если база данных находится в третьей нормальной форме, то в ней должны быть соблюдены требования второй нормальной формы, а соответственно и первой. Область оптимизации третьей нормальной формы – таблица, третья нормальная форма избавляет нас от транзитивных зависимостей: любой столбец таблицы должен зависеть только от ключевого столбца.

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

Данное отношение находится в третьей нормальной форме

Данное отношение находится в третьей нормальной форме

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

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

Кстати, внимательный читатель заметит, что индекс зависит не только от города, но и от адреса, если честно, он зависит от номера дома. Но об этом я предлагаю поговорить в следующей части данной темы.

Текст комментария: