Обсуждение:Вторая нормальная форма

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Ошибка в примере[править код]

Может, вторая таблица после разбиения все-таки выглядит так?

Должность Наличие компьютера
Кладовщик Нет
Программист Есть

82.137.162.128 09:56, 6 июля 2009 (UTC)[ответить]

Определение[править код]

Существующее определение 2НФ слишком тяжеловесно: «Таблица находится во второй нормальной форме, если она находится в первой нормальной форме, и при этом любой её атрибут, не входящий в состав возможного ключа, функционально полно зависит от каждого возможного ключа. Функционально полная зависимость означает, что атрибут функционально зависит от всего составного ключа, но при этом не находится в функциональной зависимости от какой-либо из входящих в него атрибутов (частей). Или другими словами: в 2NF нет неключевых атрибутов, зависящих от части составного ключа (плюс выполняются условия 1NF).»

Предлагаю более простой вариант: «Таблица находится во второй нормальной форме, если она находится в первой нормальной форме, и при этом каждая её строка уникально идентифицирована.» Есть возражения? --Doomych 06:58, 26 января 2010 (UTC)[ответить]

Вопрос снимается. --Doomych 14:48, 4 марта 2010 (UTC)[ответить]

Поправка (имхо)[править код]

"Второе важное значение второй нормальной формы состоит в том, что она по определению запрещает наличие неключевых атрибутов, которые вообще не зависят от потенциального ключа."- кажется здесь неточность. Поскольку значения атрибутов ключа уникальны, то значения всех остальных атрибутов (неключевых/альтернативноключевых)однозначно сопоставлены с ключевыми отношением R (на котором задан ключ). Таким образом наличие ключа автоматически обеспечивает функциональную зависимость от него всех остальных атрибутов(если какой то атрибут не зависит от ключа, то возможны две записи с одинаковым ключем, но разным значением атрибута, что недопустимо по определению ключа. Этот атрибут просто нужно было бы включить в ключ). Таким образом все это обеспечивается уже первой нормальной формой(обеспечивающей наличие ключа для таблицы), а не второй. Для самопроверки я посмотрел аналогичную статью на английской вики, там ничего не сказано про такое значение 2НФ (это конечно не доказательство, но дополнительный аргумент)

Вы можете легко выявить изъян в ваших рассуждения уже тем, что при них, оказывается, любое отношение всегда находится во второй НФ. Смотрите логику: если наличие ключа автоматически обеспечивает функциональную зависимость от него всех остальных атрибутов, значит условие 2НФ заведомо выполняется.
Не правда ли, что-то не так?
Позвольте пояснить.
Потенциальные ключи — это ограничения целостности, т.е правила, которые проектировщик налагает на отношения на основани своих знаний о предметной области и специфике задачи. Правильность этих правил в общем случае не устанавливается по текущим значениям БД. Например, по текущим значением может представляться, что атрибут A в отношении R обладает свойством уникальности, однако добавление нового кортежа выявит, что это была просто случайность. По текущим значением может представляться, что атрибут X в отношении R функционально зависит от атрибута Y, однако добавление нового кортежа выявит, что и это была просто случайность. Такими образом, никакой автоматичности в определении ОЦ нет. Вы пишете: «наличие ключа автоматически обеспечивает функциональную зависимость от него всех остальных атрибутов». Это ошибка. Наличие функциональной зависимости вытекает исключительно от внешних знаний о природе данных, но не от формального наличия потенциального ключа. Пример: возьмём явно хаотичное отношение: {ФИО_мэра_Томска, Цена_на_дрова_в_Бразилии, Рейтинг_Жириновского}, и назначим ФИО_мэра_Томска первичным ключом. По вашей логике это значит, что ФИО_мэра_Томска однозначно определяет цены в Бразилии и рейтинг Жириновского, что абсурд. На самом деле здесь ошибка проектирования: ни один из неключевых атрибутов не обладает функциональной зависимостью от первичного ключа, что является, кстати, нарушением 2NF. Вы пишете: «если какой то атрибут не зависит от ключа, то возможны две записи с одинаковым ключем, но разным значением атрибута». Позвольте сказать, что это как раз невозможно, т.к. если в отношении задан потенциальный ключ, то два кортежа с «одинаковым ключом» просто невозможны, вне всякой связи со значениями остальных атрибутов. И именно по определению потенциального ключа, как вы сами и заметили.
Ещё раз, для краткости: существование ФЗ объективно вытекает из свойств данных, и никак не связано с тем, какие и кто в отношении задал потенциальные ключи. Вторая нормальная форма предписывает, чтобы в отношении каждый атрибут функционально зависел от всего потенциального ключа. Тем самым, кроме прочего, запрещается наличие атрибутов, которые вообще не зависят от ПК. О чём и написано. А то многие почему-то полагают, что 2НФ автоматически выполняется, если в отношении нет составных ПК, что вовсе не так. В отношении может не быть составных ПК, однако оно при этом может не удовлетворять условию 2НФ (см. пример в предыдущем абзаце). Евгений Мирошниченко 02:34, 20 февраля 2012 (UTC)[ответить]

Спасибо за подробные разъяснения, но честно говоря моих сомнений они не сняли. "Смотрите логику: если наличие ключа автоматически обеспечивает функциональную зависимость от него всех остальных атрибутов, значит условие 2НФ заведомо выполняется.: Не правда ли, что-то не так? " Условие 2НФ говорит о полной ФЗ всех неключевых полей от ПК, а условие существование первичного ключа говорит о просто ФЗ всех неключевых полей от ПК. То есть мои слова про автоматическую зависимость еще не означают что любое отношение находится в 2НФ, поскольку для 2НФ нуна не просто автоматическая зависимость, а полная зависимость.

Согласен, за исключением того утверждения, что «условие существование первичного ключа говорит о просто ФЗ всех неключевых полей от ПК». Это не так, и я пояню это ниже более подробно.

"Позвольте пояснить..." Со всем согласен, но это не меняет моего сомнения. Я вас понял - и потенциальные ключи и все ФЗ вытекают только из внешней природы данных! Но, вот что я имел ввиду в моем первом посте: Если на таблице задан первичный ключ (внешней природой данных) то это означает, что все атрибуты функционально от него зависят (опять же с учетом внешней природы данных). То есть не бывает ситуаций когда какое-то поле не зависит от ПК, который определяется внешней природой данных (не самим разработчиком как он хочет). Вот что об этом пишется в английской вики(http://en.wikipedia.org/wiki/Superkey): " Equivalently a superkey can also be defined as a set of attributes of a relvar upon which all attributes of the relvar are functionally dependent." Суперключ это в частности первичный ключ или любой потенциальный первичный ключ, поэтому все верное для суперключа верно и для обычного ключа. А пишется там что суперключ можно определить как набор полей от которых зависят все остальные (неключевые) поля. Таким образом утверждение, что какое то поле может не зависеть от первичного ключа неверно по определению этого самого ключа.

Сначала пояснение по поводу цитаты из англовики. Это, к сожалению, дефектное определение, которое, тем не менее, можно встретить даже в некоторых (плохих) учебниках.
Доказательство.
1. Определение ФЗ {А} → {B}: если в двух кортежах отношения равны значения {А}, то равны и значения {B}.
2. Определение суперключа {А}: в отношении не существует двух кортежей, в которых значения {А} равны.
Уже понятно? Но я всё же поясню. Если {А} — суперключ, то доказать наличие ФЗ {А} → {B} по определению 1 невозможно, поскольку двух кортежей с равным значением {А} по определению 2 быть не может. Поэтому ни одна путняя книга по БД не определяет потенциальные ключи через функциональные зависимости. Да и нужды в этом нет, так как существуют прекрасные работающие определения 1 и 2, независимые друг от друга.
Теперь вернёмся к исходному вопросу. 2НФ определяется так: каждый неключевой атрибут неприводимо зависит от ее потенциального ключа. Вопрос таков: запрещает ли 2НФ наличие неключевых атрибутов, которые не зависят от потенциального ключа? Ответ: по определению 2НФ, да, запрещает. Прокомментируйте, что с этими рассуждения не так, по вашему.
P.S. Я бы не слишком равнялся на англовики, кстати. Что-то там написано лучше, но что-то и хуже. К примеру, статья en:Database в целом просто ужасна, хотя и зело велика. Евгений Мирошниченко 02:46, 24 февраля 2012 (UTC)[ответить]

С определениями 1 и 2 согласен, но выводы из них делаю другие. 1. "Если {А} — суперключ, то доказать наличие ФЗ {А} → {B} по определению 1 невозможно, поскольку двух кортежей с равным значением {А} по определению 2 быть не может." Как раз наоборот(имхо). Если {А} — суперключ, то доказывается наличие ФЗ {А} → {B} по определению 1. Ведь в определении 1 ничего не сказано об обязательном наличии повторяющихся строк, там сказано если вдруг они есть то... А если их нет в отношении, то что же нет и ФЗ?? Тогда получается, что от первичного ключа не должно зависить вообще ни одно поле, ведь нет строк с повторяющимся ключем (значит по такой логике нет вообще никаких ФЗ от первичного ключа, ведь {A} не повторяется). 2. "Прокомментируйте" Комментирую - все так. Только я настаивал- что уже 1НФ запрещает, а 2НФ уж и подавно.

Оставляяя пока в стороне 2НФ (вернёмся позже), хочу обсудить вашу ремарку относительно 1НФ. Честно говоря, в первый раз я на неё не обратил внимания, а теперь не могу пройти мимо. Скажите, это где вы видели такое определение 1НФ, в котором хоть что нибудь говорилось бы о ключах и функциональных зависимостях? Евгений Мирошниченко 03:51, 27 февраля 2012 (UTC)[ответить]

Если применять термин 1НФ к таблице, то есть такое определение(из русвики): " ...Конкретнее, рассматриваемая таблица должна удовлетворять следующим пяти условиям: ... 3.Нет повторяющихся строк. " Вот это 3 условие очевидно эквивалентно существованию первичного ключа. Да тут не говорится о нем, но фактически имеется ввиду. А раз есть ПК, то есть и ФЗ (Я все же остаюсь верным тому "дефектному определению". Возможно оно дефектное в методическом плане, но не дефектное в плане истины). P.S. Возможно методически не повелось говорить о ПК и ФЗ при определении 1НФ для таблицы. Но почему бы и не сказать об этом. Вот например по ссылке явно говорится о ПК при определении 1НФ: http://www.techopedia.com/definition/25955/first-normal-form-1nf

Ах, это. Во-первых, отсутствие в таблице «повторяющихся строк» не эквивалентно «существованию первичного ключа». Потому, что для понятия «таблица» отсутствует понятие первичного или потенциального ключа, каковое существует только для отношения. Это в свою очередь является следствие того факта, что понятие «таблица» вообще строго не определено. Таким образом, в цитате из Дейта, которую вы привели, речь идёт о том, является ли некоторая таблица корректным представлением некоторого отношения. Далее, для того, чтобы указать на отсутствие в отношении повторяющихся кортежей, никакая 1НФ не нужна. Отсутствие в отношении повторяющихся кортежей — базовое свойство любого отношения, т.к. отношение — это множество (без дубликатов). Отсюда, разумеется, следует, что отношение имеет в своём составе минимум один потенциальный ключ. Однако на этом всё, ведь каков этот потенциальный ключ (какие атрибуты в него входят) — неважно. Для отношения на уровне определения 1Ф неважно, какие атрибуты являются ключевыми, а какие неключевыми. Таким образом, на уровне определения 1НФ нет и речи ни о ключевых/неключевых атрибутах, ни о функциональных зависимостях. Поэтому первой нормальной формой не обеспечивается условие зависимости неключевых атрибутов от потенциального ключа.
(Что касается статьи из techopedia, на которую вы дали ссылку, то она довольно безграмотна, это всё, что о ней можно сказать.)
И позвольте также уточнить, что чего бы вы там не придерживались, фактом является следующее: концепция потенциального ключа не требует для определения концепции функциональных зависимостей, а концепция функциональных зависимостей не требует для определения концепции потенциального ключа. Это две фундаментальные и при этом независимые концепции. Вот это совершенно точно. Поэтому говорить «раз есть ПК, то есть и ФЗ» не представляется ни оправданным, ни даже возможным. Например, здесь полно вопиющих неопределённостей. Что значит «есть ПК»? Объективно есть или просто определён пользователем? Это огромная разница. Что значит «есть ФЗ»? Объективно (из свойств данных) или вытекает (по вашему мнению) из формального наличия заданного ПК? Это опять-таки огромная разница. Заметьте, что утверждение «раз есть ПК, то есть и ФЗ» ещё нужно доказать, а как его доказать, если оно заведомо некорректно сформулировано? Поэтому его никто и не использует. Оно просто не имеет смысла. Евгений Мирошниченко 11:44, 27 февраля 2012 (UTC)[ответить]

По поводу несуществования термина ПК для таблицы- дело в том, что таблица становится синонимом отношения если она удовлетворяет 1НФ. Так что, для таблицы удовлетворяющей 1НФ, уже применимо понятие ПК как к обычному отношению. Поэтому я и сказал что 1НФ на таблице, уже определяет ПК на таблице(отношении), поскольку делает таблицу синонимом отншения, а на всяком отношении можно задать ПК. По поводу независимости концепций ПК и ФЗ. Вы абсолютно верно дали два определения ФЗ и ПК. Они не опираются друг на друга, но имхо следуют друг из друга. "не представляется ни оправданным, ни даже возможным" Оправдано или нет, но возможно. "Есть ПК" это значит из вашего определения 2, что в таблице нет и не будет записей с одинаковым ПК. (объективно есть) "Есть ФЗ" это значит из вашего определения 1, что в таблице нет и не будет записей с одинаковыми {A} но разными {B}. (объективно есть) Уверен, что под этими словами из англовики: "Equivalently a superkey can also be defined as a set of attributes of a relvar upon which all attributes of the relvar are functionally dependent" подпишутся многие. Чтобы окончательно разрешить наше недопонимание, предлагаю обратится на какой-нибудь серьезный форум с этой цитатой и спросить верна ли она.

Я тут поразмыслил, действительно, если от некоторого подмножество атрибутов {A} отношения функционально зависят все остальные, то {A} является потенциальным ключом. : Доказательство. Для простоты рассмотрим отношение с тремя атрибутами: X, Y, Z.
Пусть X → Y и X → Z.
Рассмотрим кортеж, в котором X принимает значение x, Y принимает значение y, Z принимает значение z.
Предположим, что X — не потенциальный ключ. Тогда может существовать второй кортеж, в котором X так же принимает значение x. Но по определению ФЗ в таком кортеже Y вновь принимает значение y, а Z вновь принимает значение z. Следовательно, эти два кортежа совпадают по всем значениям, чего быть не может.
Следовательно, предположение о том, что X — не потенциальный ключ, приводит к противоречию. Следовательно, X — потенциальный ключ.
Однако истинно ли утверждение о том, что если в отношении задан потенциальный ключ, то все остальные атрибуты от него функционально зависят? Не обязательно. Пример был выше: возьмём отношение: {ФИО_мэра_Томска, Цена_на_дрова_в_Бразилии, Рейтинг_Жириновского}, где ФИО_мэра_Томска — первичный ключ. Нарушает ли это отношение 1NF? Нет. Однако ФИО_мэра_Томска не определяет цены в Бразилии и рейтинг Жириновского, значит, оно нарушает 2НФ.
Ещё раз: каждая селёдка — рыба, но не каждая рыба — селёдка. Если атрибут зависим от все остальных, то это ПК, но если если атрибут — ПК, это не значит, что от него зависят все остальные. Евгений Мирошниченко 02:26, 28 февраля 2012 (UTC)[ответить]
Здравствуйте, коллеги! Имеющийся здесь спор 5-летней давности связан с использованием разных определений функциональной зависимости и потенциального ключа. К сожалению, приведённое выше в споре определение ФЗ некорректно. Если привести корректные определения, то спор сразу разрешится:
1. Определение ФЗ: {А} → {B} в отношении R, если в этом отношении не может быть двух или более кортежей, в которых значения {А} равны, а значения {B} не равны.
2. Определение суперключа: Множество атрибутов {А} в отношении R является суперключом, если значения {А} всегда будут являться в этом отношении уникальными, то есть одно и то же значение {А} не может встретиться в двух или более кортежах отношения.
3. Определение потенциального ключа: Множество атрибутов {А} в отношении R является потенциальным ключом, если оно является суперключом, и ни один из атрибутов не может быть убран из множества {А} без потери условия уникальности значения {А}.
То есть потенциальные ключи не назначаются нами произвольно (как в приведённом выше примере: "назначим ФИО_мэра_Томска ключом" - подобные произвольные назначения не обеспечат уникальности), и не определяются текущим составом значений в отношении, а определяются предметной областью (точнее, моделью предметной области): какие комбинации значений в принципе могут храниться в отношении.
Теперь докажем, что если некоторое множество {А} атрибутов отношения является потенциальным ключом или суперключом, то все остальные атрибуты функционально зависят от {А}. Используем доказательство от противного: предположим, что есть некоторый атрибут {B}, не находящийся в ФЗ от {А}. По приведённому определению ФЗ это означает, что в отношении может быть два или более кортежа, в которых значения {А} равны, а значения {B} не равны. Но если в отношении могут быть два кортежа с одинаковым значением {А}, то {А} не является суперключом и не является потенциальным ключом.
Что касается приведённого примера: {ФИО_мэра_Томска, Цена_на_дрова_в_Бразилии, Рейтинг_Жириновского}. Если подразумевается, что в этом отношении всегда будет храниться актуальное состояние предметной области (текущий на данный момент мэр Томска, текущий рейтинг Жириновского по конкретной системе рейтинга, и текущая средняя цена дров в Бразилии) - то получается, что отношение будет состоять всегда только из одного кортежа, и, конечно же, все три атрибута будут в этом случае всегда иметь значение, являющееся в этом отношении уникальным, то есть все три атрибута будут потенциальными ключами, и отношение будет находиться в 2НФ, т.к. не содержит неключевых атрибутов. Если же подразумевается, что рейтингованием Жириновского занимаются разные организации, и мы хотим одновременно хранить разные рейтинги Жириновского, тогда у нас в отношении будет столько кортежей, сколько разных рейтингов имеет Жириновский по версии разных организаций, а мэр Томска и средняя цена дров будет одна и та же - соответственно, потенциальным ключом будет только атрибут {Рейтинг_Жириновского}, а два других атрибута в этом случае будут неключевыми. Но они будут находиться в ФЗ от потенциального ключа, так как невозможна будет ситуация, что в разных кортежах у этих неключевых атрибутов будут разные значения (см. определение ФЗ). Таким образом, отношение опять же будет в 2НФ. Если же и цена дров хранится не как средняя по Бразилии, а как несколько разных цен, установленных разными фирмами в Бразилии - значит, у нас будет ещё больше кортежей (для корректного отражения предметной области каждый имеющийся рейтинг Жириновского должен встречаться с каждой имеющейся ценой на дрова), при этом потенциальным ключом становится пара атрибутов {Цена_на_дрова_в_Бразилии, Рейтинг_Жириновского}, а {ФИО_мэра_Томска} остаётся неключевым атрибутом, имеющим одно и то же значение во всех атрибутах отношения, и потому находящийся в ФЗ от потенциального ключа. При этом 2НФ соблюдается, но нарушается 4НФ, т.к. здесь мы уже имеем дело с многозначными зависимостями. 93.185.30.193 04:39, 19 октября 2017 (UTC)[ответить]

Прошу пояснить насчет декомпозиции[править код]

В отношении {Сотрудник Должность Зарплата} присутствует ФЗ (Сотрудник Должность)->Зарплата. Но если из ключа (Сотрудник Должность) убрать атрибут Должность, то значение Зарплата все равно однозначно определяется. Получается что в составе потенциального ключа пристуствует подмножество атрибутов (Сотрудник), от которого можно также вывести данную функциональную зависимость, т.е.неприводимость не выполняется.109.184.225.14 19:44, 20 апреля 2016 (UTC)[ответить]

Заменил пример на более очевидный. Евгений Мирошниченко 02:40, 21 апреля 2016 (UTC)[ответить]

Надо исправить в примере отношение R2[править код]

В примере после декомпозиции в отношении R2 получается составной первичный ключ (Должность + Наличие компьютера), хотя достаточно только Должности 91.232.196.249 08:54, 11 октября 2016 (UTC) Тарасов Владимир[ответить]

Верно подмечено. Исправил. Евгений Мирошниченко 10:41, 11 октября 2016 (UTC)[ответить]