Вторая нормальная форма (2NF)

Вторая нормальная форма 2NFО таблице в базе данных Oracle (и любой другой реляционной базе) говорят, что она находится во второй нормальной форме, если она уже находится в первой нормальной форме и каждый не являющийся ключом атрибут в ней полностью функционально зависит от первичного ключа. Поскольку когда не являющийся ключом атрибут зависит только от какой-то части (составного) ключа, возникает частичная зависимость, определение второй нормальной формы еще иногда формулируют следующим образом:

Таблица находится во второй нормальной форме, если она уже находится в первой нормальной форме и не имеет никаких частичных зависимостей.

Сначала давайте рассмотрим случай, когда таблица находится в первой нормальной форме, но не во второй. Приведенная ниже табл. 2.4 удовлетворяет требованиям первой нормальной формы, поскольку не содержит никаких повторяющихся групп. Однако в ее данных присутствует избыточность, потому что наименование одного и того же навыка (например, навыка по ведению бухгалтерии) отображается для каждого сотрудника, который обладает таким навыком.

Одного столбца идентификатора навыка (Skill ID) будет вполне достаточно для обозначения присутствия навыка в этой таблице. Как рассказывалось в предыдущем разделе, первичный ключ в таблице навыков является составным и состоит из номера сотрудника (Employee Number) и идентификатора навыка (Skill ID). Наименование навыка (Skill Name), однако, является таким атрибутом, который зависит только от части этого составного ключа (а именно — только от идентификатора навыка).

Таблица 1. Таблица, находящаяся в первой, но не во второй нормальной форме

Номер сотрудника Идентификатор навыка Наименование навыка Уровень владения навыком
22 130 Ведение бухгалтерии 9
23 140 Маркетинг 9
24 130 Ведение бухгалтерии 7

В таблице навыков, которая приводилась в предыдущем разделе, первичный ключ состоит из номера сотрудника (Employee Number) и идентификатора навыка (Skill ID).

Это имеет смысл для атрибута уровня владения навыком (Skill Level), поскольку он будет выглядеть по-разному для каждой комбинации “сотрудник-навык”. Но атрибут наименования навыка (Skill Name) зависит только от идентификатора навыка (Skill ID).

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

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

Во избежание подобных проблем нужно обязательно привести таблицы ко второй нормальной форме (2NF). Первым делом необходимо разбить таблицу навыков на более простые версии, чтобы избавиться ото всех частичных зависимостей, т.е. сделать так, чтобы все не входящие в состав ключа атрибуты стали полностью функционально зависимыми от первичного ключа. Для этого достаточно отделить атрибуты, зависящие от обеих частей ключа, от тех, которые зависят только от идентификатора навыка.

Это приведет к получению двух таблиц — таблицы навыков (Skills) с перечнем наименований для каждого обладающего идентификатором навыка и таблицы навыков сотрудника (Employee Skills) с перечнем тех фактических навыков, которыми владеет каждый сотрудник (как показано в табл. 3 и 4). Атрибут уровня владения навыком (Skill Level) в таблице навыков сотрудника будет явно зависеть от обеих частей ключа, поскольку основывается на информации не только о том, о каком именно навыке идет речь, но и о том, насколько хорошо этим навыком владеет конкретный сотрудник.

Таблица 2. Таблица навыков во второй нормальной форме


Идентификатор навыка (Skill ID)

Наименование навыка (Skill Name)


 

Таблица 3. Таблица навыков сотрудника во второй нормальной форме


Номер сотрудника (Employee Number)

Идентификатор навыка (Skill ID)

Уровень владения навыком (Skill Level)


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

Кроме того, можно будет удалять любые данные о сотрудниках без потери информации о самих навыках.

Вас заинтересует / Intresting for you:

Oracle Text и PL/SQL: многоязы...
Oracle Text и PL/SQL: многоязы... 1294 просмотров Максим Николенко Fri, 18 Oct 2019, 12:41:03
Язык SQL и PL/SQL Oracle
Язык SQL и PL/SQL Oracle 2438 просмотров Андрей Волков Tue, 21 Nov 2017, 13:17:28
Язык и платформа Java - различ...
Язык и платформа Java - различ... 2338 просмотров Александров Попков Tue, 21 Nov 2017, 13:26:33
Операции группировки GROUP BY ...
Операции группировки GROUP BY ... 9442 просмотров Светлана Комарова Fri, 20 Apr 2018, 14:07:25
Войдите чтобы комментировать