Представьте отношение с составным ключом: как по функциональным зависимостям обнаружить нарушение второй нормальной формы?
Нарушение второй нормальной формы (2НФ) обнаруживается, если отношение уже находится в первой нормальной форме, но некоторый неключевой атрибут функционально зависит только от proper-подмножества составного кандидатного ключа, а не от всего ключа. Нужно проверить такую зависимость для каждого кандидатного ключа, а не только для объявленного первичного.
Если ключ состоит из одного атрибута, частичной зависимости быть не может, поэтому любое отношение в 1НФ с одноатрибутным ключом автоматически соответствует 2НФ.
Нормализация появилась как способ уменьшить избыточность данных и связанные с ней аномалии вставки, обновления и удаления. Вторая нормальная форма уточняет первую: недостаточно хранить атомарные значения, важно также не смешивать в одной таблице факты, относящиеся к отдельным частям составного идентификатора.
Такой подход помогает отделить свойства сущностей от свойств связей между ними. Это делает зависимости данных явными и уменьшает риск противоречивых обновлений.
Рассмотрим отношение с ключом из двух атрибутов, например идентификаторов сотрудника и проекта. Если имя сотрудника зависит только от идентификатора сотрудника, хранение этого имени в каждой строке проекта создаёт дублирование.
При неверной структуре изменение имени потребует обновить много строк. Добавление нового сотрудника без проекта может оказаться невозможным, а удаление последнего проекта сотрудника может привести к потере сведений о нём.
Сначала определяют все кандидатные ключи и функциональные зависимости между атрибутами. Затем для каждого неключевого, то есть непримарного, атрибута проверяют, зависит ли он от всего ключа целиком.
Если ключ имеет вид {A, B}, а существует зависимость A → C, где C не входит ни в один кандидатный ключ, то это частичная зависимость и нарушение 2НФ. Зависимость A, B → C сама по себе нарушением не является: атрибут C использует весь составной ключ.
Для исправления отношение обычно декомпозируют. Атрибуты, зависящие только от A, выносят в отношение с ключом A, а в исходном отношении оставляют A, B и атрибуты, зависящие от всей пары.
Проверять нужно именно кандидатные ключи. Наличие первичного ключа не гарантирует корректность анализа, если существуют альтернативные кандидатные ключи. Кроме того, 2НФ не устраняет транзитивные зависимости: отношение может соответствовать 2НФ и при этом нарушать 3НФ.
Декомпозиция уменьшает дублирование, но часто требует соединений при чтении. Поэтому в прикладных системах иногда сознательно сохраняют денормализованные данные ради производительности, но тогда согласованность поддерживают ограничениями, триггерами или кодом приложения.
Есть отношение «назначения сотрудников на проекты» с атрибутами ИдентификаторСотрудника, ИдентификаторПроекта, ИмяСотрудника, НазваниеПроекта, КоличествоЧасов. Кандидатный ключ — пара «сотрудник, проект»; имя сотрудника зависит только от сотрудника, название проекта — только от проекта, а количество часов — от всей пары.
Вариант оставить одну таблицу прост для чтения, но приводит к дублированию имён и названий, а также к аномалиям обновления. Вариант разделить данные на три отношения — сотрудников, проектов и назначений — требует соединений, зато устраняет частичные зависимости и сохраняет каждый факт в одном месте.
Выбирают декомпозицию, если данные часто изменяются и важнее согласованность. В результате изменение названия проекта выполняется в одной строке, а назначение нового сотрудника не требует искусственно создавать проектную запись.
Нет, если оно уже находится в 1НФ. У одноатрибутного ключа нет непустого собственного подмножества, поэтому частичная функциональная зависимость невозможна. Однако такое отношение всё ещё может нарушать 3НФ или содержать другие проблемы моделирования.
Нет. 2НФ определяется относительно всех кандидатных ключей. Если атрибут зависит от части альтернативного кандидатного ключа, нарушение существует даже тогда, когда первичный ключ выбран иначе. Поэтому сначала необходимо выявить кандидатные ключи, а затем анализировать зависимости.
Нет. Нарушение возникает, когда зависимый атрибут является непримарным. Если зависимый атрибут сам входит в кандидатный ключ, он является примарным, и его частичная зависимость не нарушает 2НФ. Но это не означает автоматическую корректность схемы: могут оставаться транзитивные зависимости, избыточность или нарушение 3НФ.