Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Формы нормализации


Автор: Alexey91 27.7.2013, 18:01
Здравствуйте!

Читаю книжку "Beginning Mysql"  (Sheldon, Moes) (Third Normal Form page 111-116).  В ней приводится примеры по нормализации. 

Если вам трудно ответить, то я буду очень благодарен, если вы дадите источник (русский, английский не важно), в котором про нормализацию подробно описано. В дополнение я посмотрел википедию. Я не понимаю 3-ей нормальной формы, которая заключается в том, что все неключевые атрибуты зависят только от ключевых. И никаких других зависимостей быть не должно.  

Приводится объяснение на примере сотрудников:

Сотрудник    Отдел                Телефон 
Иванов         Бухгалтерия       11-22-33
Петров         Бухгалтерия      11-22-33
Ларин          Снабжение        44-55-33

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

Здесь мы видим, что существует ФЗ между бухгалтерией и телефоном. Зная, что название отдела – «Бухгалтерия», всегда можно сопоставить номер телефона - 11-22-33. То есть существует зависимость Отдел --> Телефон

Но что значит, что все атрибуты зависят от ключевых?. Они вместе зависят? То есть (Отдел, Телефон) сопоставляется одному значению Сотрудник.
Или каждый по отдельности? Отдел сопоставляется Сотрудник, Телефон сопоставляется Сотрудник ... ?

Также не ясно про транзитивную зависимость. На множествах понятно: X->Z, X->Y, Y->Z
Но где в этой таблице транзитивная зависимость?

И из определения ФЗ (http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) выходит противоречие, поскольку, если считать, что отдел зависит от сотрудника. То тогда два отдела с одним именем «Бухгалтерия» сопоставляются двум разным сотрудникам (Иванов, Петров). А они должны сопоставляться одному, чтобы не нарушать определение.

Похоже я запутался.


Автор: Gromdron 27.7.2013, 23:45
Книгу не читал, но чисто мое предположение - состоит из 3 таблиц:

FID | Фамилия
OID | Отдел
PID | Телефон



Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51f3e1276ccc197c4100000a#findElement_E7045_51f4315a6ccc19cd4a0072c9_0

Автор: Alexey91 28.7.2013, 08:42
Gromdron

Они пишут, что существуют зависимость от ключа.

Существует определение функциональной зависимости: элемент из множества А является функционально зависимым от элемента из множества B, если элементу А сопоставляется только одно значения из множества B.

Тогда колонка Отдел зависит от первичного ключа (Сотрудник). То есть одному значению из Отдел можно сопоставить ровно одно значение из Сотрудник. Но возьмите название отдела "Бухгалтерия". Этот отдел встречается в двух строках, а следовательно сопоставляется двум значениям первичного ключа. Несоответствие. Я не понимаю  smile 

Автор: Gromdron 28.7.2013, 14:46
Вы неправильно поняли.

Почитайте:
http://alexvolkov.ru/database-normalization-third-normal-form.html
http://www.libma.ru/kompyutery_i_internet/bazy_dannyh_konspekt_lekcii/p10.php


Если хотите понять: у вас дана исходная таблица, а не приведенная к 3НФ.

Если ее привести к 3НФ получиться 2 таблицы:

Отдел|Наименование отдела|Телефон
1|Бухгалтерия|11-22-33
2|Снабжение|44-55-66

Фамилия|Отдел
Гришин|1
Васильев|1
Петров|2

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51f3e1276ccc197c4100000a#findElement_E7045_51f504a06ccc196e4200001c_0

Автор: Alexey91 29.7.2013, 12:44
Нет, там даже не в этом дело, похоже авторы статьи в русской википедии просто не до конца объяснили.
Я неправильно понял определение функциональной зависимости.

http://en.wikipedia.org/wiki/Database_normalization -- здесь все подробно изложено

Background to normalization: definitions

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)