пятница, 30 мая 2014 г.

Нормализация БД. 4 нормальная форма. Теорема Фейджина.

Теорема Фейджина: Пусть X, Y, Z - непересекающиеся множества атрибутов отношения R(X,Y,Z). Декомпозиция отношения R на проекции R1=R[X,Y] и R2=[X,Z] будет декомпозицией без потерь тогда и только тогда, когда имеется многозначная зависимость X->>Y|Z.
Напомню, что функциональная зависимость - это однозначное соответствие левой и правой части. Например:
  • ребенок -> биологические родители
  • идентификатор товара -> его название
Многозначная зависимость - это когда левой части (детерминанту) соответствует один из множества вариантов правой части. Например:
  • родители -> ребенок  (так как детей может быть несколько)
  • студент -> зачет
Если многозначная зависимость имеет вид X->>Y|Z, при этом функциональные зависимости X->Y или X->Z не существуют, такая  зависимость является нетривиальной многозначной зависимостью.

Вернемся к теореме Фейджина.
Допустим, вы с друзьями любите пиво. По пятницам вы посещаете пабы, где дегустируете все доступные сорта пива.

manpubbeer
DarthGolden Gate PubGuinness
DarthGolden Gate PubMurphy's Irish Stout
DarthO'Connor'sMurphy's Irish Stout
DarthO'Connor'sNewcastle
YodaGolden Gate PubGuinness
YodaGolden Gate PubMurphy's Irish Stout
Jabba the HuttO'Connor'sMurphy's Irish Stout
Jabba the HuttO'Connor'sNewcastle

Ваше времяпровождение определяется многозначной зависимостью good_life(pub->>man|beer).
А это значит, что можно выполнить следующую декомпозицию:

pubbeer
Golden Gate PubGuinness
Golden Gate PubMurphy's Irish Stout
O'Connor'sMurphy's Irish Stout
O'Connor'sNewcastle

pubman
Golden Gate PubDarth
Golden Gate PubYoda
O'Connor'sDarth
O'Connor'sJabba the Hutt

И из неё при желании можно восстановить исходное отношение:
pub_beer(pub->>beer) NATURAL JOIN pub_men(pub->>man) = good_life(pub->>man,beer)

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

В 4 нормальной форме отношение находится тогда, когда оно соответствует НФБК и все нетривиальные многозначные зависимости фактически являются функциональными зависимостями от её потенциальных ключей.

А это значит, что отношение good_life(pub->>man,beer) не находится в 4 НФ. 
И теперь небольшой трюк. Возьмем отношение paid_goof_life(pub,man,beer->payment):

manpubbeerpayment
DarthGolden Gate PubGuinness10$
DarthGolden Gate PubMurphy's Irish Stout20$
DarthO'Connor'sMurphy's Irish Stout30$
DarthO'Connor'sNewcastle15$
YodaGolden Gate PubGuinness10$
YodaGolden Gate PubMurphy's Irish Stout20$
Jabba the HuttO'Connor'sMurphy's Irish Stout30$
Jabba the HuttO'Connor'sNewcastle15$

Трюк этот называется внедренной зависимостью. После добавления атрибута payment отношение стало соответствовать 4 НФ.

Комментариев нет:

Отправить комментарий