Проектиране на функционални зависимости
Нека R е релация, която удоволетворява множеството от функционалните зависимости F. Да предположим, че S е нова релация, която се получава от R с премахване на атрибути. Казваме, че S е проекция на R. Тогава функционалните зависимости, които са в сила за S са точно онези, които следват от F и в които участват само
атрибути на S.
Като пример да разгледаме релация R (A, B, C, D) с множеството от функционални зависимости F = { A B, B C, C D }.
Нека новата релация е S (A, C, D). За да намерим функционалните зависимости за S изчисляваме покритията на всички подмножества на
{ A, C, D } относно F. Естествено, можем да пропуснем и { A, C, D}, тъй като от тях не може да се получи нетривиална функционална зависимост. Имаме { A} + = { A, B, C, D }, { C} + = { C, D }, { D} + = { D}.
Така получаваме функционални зависимости A C, A D, C D.
Няма смисъл да разглеждаме надмножества на { A}, тъй като { A} + съдържа всички атрибути на S. Така остава само { C, D} + = { C, D}, от което не получаваме нова функционална зависимост.
Окончателно, в S се проектират следните функционални зависимости:
A C, A D, C D.
Аксиоми на Армстронг
Както вече видяхме, чрез алгоритъма за намиране на покритие винаги можем да определим дали дадена функционална зависимост следва от дадено множество от функционални зависимости.
Аксиомите на Армстронг са правила, чрез които може да се извлече всяка функционална зависимост, която следва от дадено множество функционални зависимости. Те са следните:
-
Рефлексивност - ако { B1, B2, …, Bm} { A1, A2, …, An}, то
A1 A2 …An B1 B2 …Bm.
-
Нарастване – ако A1 A2 …An B1 B2 …Bm и C1, C2, …, Ck са произволни атрибути, то
A1 A2 …An C1 C2 …Ck B1 B2 …Bm C1 C2 …Ck.
-
Транзитивност – ако A1 A2 …An B1 B2 …Bm и
B1 B2 …Bm C1 C2 …Ck, то A1 A2 …An C1 C2 …Ck.
Проектиране на схеми на релационните бази от данни
При проектиране на схема на една релация трябва да се избягват следните аномалии:
-
Излишество – информацията безсмислено да се дублира в кортежите.
-
Аномалии на обновяването – при обновяване на данните да не са актуализирани всички засегнати кортежи.
-
Аномалии на изтриването – при изтриване на данни да се губи друга информация като страничен ефект.
Като пример да разгледаме следният екземпляр на релацията Movies, към която е присъединена релацията за връзката StarsIn.
-
title
|
year
|
length
|
type
|
studioName
|
starName
|
Star Wars
|
1977
|
124
|
color
|
Fox
|
Carrie Fisher
|
Star Wars
|
1977
|
124
|
color
|
Fox
|
Mark Hamill
|
Star Wars
|
1977
|
124
|
color
|
Fox
|
Harrison Ford
|
Mighty Duck
|
1991
|
104
|
color
|
Disney
|
Emilio Estevez
|
Wayne’s World
|
1992
|
95
|
color
|
Paramount
|
Dana Carvey
|
Wayne’s World
|
1992
|
95
|
color
|
Paramount
|
Mike Meyers
|
Тази релация съдържа и трите аномалии:
-
Информацията type, length излишно се дублира.
-
Ако обновяваме length на Star Wars, например, трябва да засегнем всичките три кортежа – това увеличава вероятността за грешка.
-
Ако трябва да изтрием Emilio Estevez от звездите, които участват във филма Mighty Duck, то трябва да премахнем целият кортеж, което ще доведе до загуба на останалата информация за филма.
Декомпозиция на релациите
Общоприетият начин за елиминиране на изброените аномалии е декомпозицията на релациите – една релация се разбива на две нови релации. По-формално, нека R (A1, A2, …, An) е релация.
Тогава тя се декомпозира на две нови релации
S (B1, B2, …, Bm) и T (C1, C2, …, Ck), ако:
-
{ B1, B2, …, Bm} { C1, C2, …, Ck} = { A1, A2, …, An}.
-
Кортежите в S са проекции на кортежите на R по B1, B2, …, Bm.
Това означава, че от всеки кортеж на екземпляр на R избираме само компонентите, които съответстват на B1, B2, …, Bm и по този начин получаваме кортежите на S. Естествено, от два различни кортежа на R могат да се получат две еднакви проекции, но в екземпляра на S поставяме само едната от тях.
-
Аналогично, кортежите в T са проекции на кортежите на R по
C1, C2, …, Ck.
Да разгледаме релацията
Movies (title, year, length, type, studioName, starName) от по-горе и да я декомпозираме на следните две релации:
Movies1 (title, year, length, type, studioName)
Movies2 (title, year, starName)
Съответният екземпляр на Movies1 ще е следния:
-
title
|
year
|
length
|
type
|
studioName
|
Star Wars
|
1977
|
124
|
color
|
Fox
|
Mighty Duck
|
1991
|
104
|
color
|
Disney
|
Wayne’s World
|
1992
|
95
|
color
|
Paramount
|
Съответният екземпляр на Movies2 ще е следния:
-
title
|
year
|
starName
|
Star Wars
|
1977
|
Carrie Fisher
|
Star Wars
|
1977
|
Mark Hamill
|
Star Wars
|
1977
|
Harrison Ford
|
Mighty Duck
|
1991
|
Emilio Estevez
|
Wayne’s World
|
1992
|
Dana Carvey
|
Wayne’s World
|
1992
|
Mike Meyers
|
По този начин елиминираме всички аномалии. Действително:
-
Няма излишество на информация – length и type за всеки филм се появяват само веднъж в екземпляра на Movies1. Повторението на title, year в Movies2 не може да се избегне, тъй като те образуват ключ за филмите, чрез който те се идентифицират.
-
Избегната е аномалията за обновяване – промяната на length или type за всеки филм трябва да се извърши само на едно място в съответния кортеж от Movies1.
-
Избегната е аномалията на изтриването – при премахване на участието на звезда в даден филм, информацията за филма в Movies1 се запазва.
Нормална форма на Boyce-Codd
Като цяло нормалните форми са условия, които ако са изпълнени в дадена релация, то в нея със сигурност няма аномалии от определен вид.
Целта на декомпозицията е да разбие релациите на по-малки релации, за които е в сила условието за нормална форма.
Казваме, че една релация R е в нормална форма на Boyce-Codd (BCNF), ако във всяка нетривиална функционална зависимост
A1 A2 …An B за R имаме, че { A1, A2, …, An} е суперключ.
Еквивалентна дефиниция е следната: във всяка нетривиална функционална зависимост A1 A2 …An B1 B2 …Bm за R имаме, че
{ A1, A2, …, An} е суперключ.
Например, релацията Movies, която разгледахме преди малко не е в нормална форма на Boyce-Codd. Действително,
title year length type studioName е нетривиална функционална зависимост, но { title, year} не е суперключ, тъй като ключът е
{ title, year, starName}.
От друга страна, релациите Movies1 и Movies2 са в нормална форма на Boyce-Codd. Действително, ключът на Movies1 е { title, year } и той със сигурност присъства в лявата част на всяка нетривиална функционална зависимост. В Movies2 няма нетривиални функционални зависимости.
Ще покажем, че всяка релация с два атрибута е в BCNF.
Нека R (A, B) e релация с два атрибута.
-
Ако за R няма нетривиални функционални зависимости, то R естествено е в BCNF. В този случай R има единствен ключ - { A, B}.
-
Нека за R е в сила A B, но не е в сила B A. Тогава R има единствен ключ { A} и той се съдържа във всяка нетривиална функционална зависимост за R (тя е единствена – A B).
-
Нека за R е в сила B A, но не е в сила A B. Този случай е аналогичен на предния.
-
Нека за R е в сила A B и B A. Тогава R има два ключа
{ A} и { B}. Нетривиалните функционални зависимости за R са
A B и B A и те не нарушават BCNF.
Декомпозиция в BCNF
Чрез подходящи декомпозиции всяка схема на релация може да се декомпозира на няколко схеми, така че да са изпълнени следните условия:
-
Всички получени релации да са в BCNF.
-
Информацията трябва да се запазва, т.е. от екземпляри на новополучените релации еднозначно да се възстановява съответният екземпляр на първоначалната релация.
Най-простият вариант е да разбием схемата на релацията на схеми с по два атрибута, които със сигурност ще са в BCNF. При такава произволна декомпозиция, обаче, се нарушава условие 2. както ще видим
по-нататък.
Стратегията за декомпозиция, която възприемаме е следната.
Нека A1 A2 …An B1 B2 …Bm е нетривиална функционална зависимост и
{ A1, A2, …, An} не е суперключ. При това ще предполагаме, че в дясната част на функционалната зависимост участват всички атрибути от
{ A1, A2, …, An } +. Това условие не е задължително, но може да се приеме като оптимизация. Тогава декомпозираме релацията R на следните две релации:
-
Първата релация има атрибути A1, A2, …, An, B1, B2, …, Bm.
-
Втората релация има атрибути A1, A2, …, An и всички останали атрибути на R, които не участват във функционалната зависимост.
Ако новополучените релации не са в BCNF, то към тях прилагаме същата процедура. При това, функционалните зависимости в новите релации се изчисляват чрез проектиране на функционалните зависимости от изходната релация. Процесът на декомпозиране ще е краен, тъй като винаги получаваме релации с по-малко атрибути, а всяка релация с два атрибута е в BCNF.
Да разгледаме пример с релацията
MovieStudio (title, year, length, type, studioName, studioAddress).
Ключът е { title, year } и функционалната зависимост
studioName studioAddress нарушава BCNF и съдържа максимална дясна част. Следвайки стратегията за декомпозиция разбиваме релацията MovieStudio на две нови релации със следните схеми:
MovieStudio1 (title, year, length, type, studioName) и
MovieStudio2 (studioName, studioAddress).
Лесно се вижда, че ключът на MovieStudio1 е { title, year }, а ключът на MovieStudio2 е { studioName}. Новите релации са в BCNF, тъй като
title year length type studioName е единствената нетривиална функционална зависимост за MovieStudio1, а MovieStudio2 има два атрибута. Така процесът на декомпозиция приключва.
Да разгледаме по-сложен пример със следната релация:
MovieStudioPres (title, year, studioName, president, presAddress).
Функционалните зависимости, които предполагаме са следните:
title year studioName
studioName president
president presAddress.
Единственият ключ на MovieStudioPres е { title, year }, така че последните две функционални зависимости нарушават BCNF.
Да предположим, че започваме с първата функционална зависимост
studioName president. Първо добавяме в дясна част всевъзможните атрибути от { studioName} + и получаваме функционалната зависимост
studioName president presAddress. След това декомпозираме на две релации със следните схеми:
MovieStudioPres1 (title, year, studioName)
MovieStudioPres2 (studioName, president, presAddress).
Първата релация е в BCNF, тъй като единствената функционална зависимост е title year studioName и { title, year } е единственият ключ.
Втората релация не е в BCNF, тъй като функционалната зависимост
president presAddress се е проектирала в нея, а studioName е единственият ключ. Така разбиваме MovieStudioPres2 на две релации със следните схеми:
MovieStudioPres21 (studioName, president)
MovieStudioPres22 (president, presAddress).
Новополучените релации са в BCNF. Ключът на първата релация е studioName, а ключът на втората релация е president.
Лесно се вижда, че ако започнем с втората функционална зависимост ще достигнем до същия резултат.
Възстановяване на информацията след декомпозиция
Ще покажем, че след декомпозиция извършена по гореописаната стратегия информацията може да се възстанови, т.е. екземплярите на получените релации еднозначно определят екземпляра на декомпозираната релация. Идеята е да използваме съединение на кортежите.
За да не претрупваме означенията ще си мислим, че разглеждаме релация с три атрибута R (A, B, C). Да предположим, че функционалната зависимост B C нарушава BCNF. Ако A B е функционална зависимост, то { A} е единственият ключ. В противен случай, единственият ключ е { A, B }. И в двата случая декомпозицията по функционалната зависимост B C води до релации със следните схеми:
R1 (A, B), R2 (B, C). Нека t (a, b, c) е кортеж в екземпляр на релацията R.
Тогава проекцията на t в R1 е (a, b), проекцията на t в R2 е (b, c).
Съединението представлява следното: от всеки два кортежа от екземплярите на R1 и R2, които се съгласуват по съединяващите атрибути (в случая B), т.е. имат еднакви компоненти, съответни на съединяващите атрибути, образуваме кортеж от екземпляра на R.
В случая кортежът (a, b) на R1 и (b, c) на R2 се съгласуват по съединяващия атрибут B и от тях получаваме кортежът t (a, b, c) от екземпляра на R.
Ясно е, че при съединението се възстановяват всички кортежи на екземпляра на релацията R. Въпросът е дали няма да се получат излишни кортежи.
Да предположим, че в екземпляра на R има друг кортеж v (d, b, e).
Тогава проекцията на v в R1 е (d, b), проекцията на v в R2 е (b, e).
При съединението кортежът (а, b) от екземпляра на R1 се съгласува с кортежа (b, e) от екземпляра на R2. По този начин получаваме кортеж
w (a, b, e). Въпросът е дали w е кортеж от екземляра на R. Тъй като B C е функционална зависимост в R и кортежите t, v имат еднакви компоненти за B, то те трябва да имат еднакви компоненти за C, т.е. получаваме c = e, така че x = w. Така w действително е кортеж от екземпляра на R. По този начин, ако декомпозицията се извършва използвайки функционална зависимост по описаната стратегия, то със сигурност чрез съединение еднозначно можем да възстановяваме екземплярите на декомпозираната релация.
Аргументите, които приведохме естествено се обобщават когато A, B, C са множества от атрибути.
Ще покажем, че при произволна декомпозиция не е сигурно, че екземплярът на първоначалната релация ще може да се възстанови.
Нека R (A, B, C) е същата релация, но функционалната зависимост B C не е в сила. Нека разгледаме екземпляр на R, който се състои от следните два кортежа: (a, b, c), (d, b, e). Да предположим, че декомпозираме релацията на R1 (A, B) и R2 (B, C). Тогава проектираният екземпляр на R1 ще бъде (a, b), (d, b), а проектираният екземпляр на R2 ще бъде
(b, c), (b, e). Като извършим съединение получаваме следните кортежи:
(a, b, c), (a, b, e), (d, b, c), (d, b, e). Така екземплярът на R не се възстановява правилно – има два излишни кортежа (a, b, e) и (d, b, c).
Този пример показва, че не трябва да се извършва безпринципна декомпозиция.
Трета нормална форма
Третата нормална форма е по-слаба от нормалната форма на
Boyce-Codd, но тя също се използва.
Да предположим, че е дадена релация със следната схема:
Bookings (title, theater, city).
Кортежът (p, t, c) интерпретираме по следния начин: пиесата p се играе в театъра t, който се намира в град c.
Разумни са следните функционални зависимости:
theater city и city title theater.
Чрез втората функционална зависимост предполагаме, че една пиеса не може да се играе по едно и също време в два различни театъра на един и същи град.
Ключовете на релацията са следните: { title, city }, { title, theater}.
Естествено, { city, theater } не е ключ. При това положение е очевидно, че релацията Bookings не е в BCNF - theater city е нетривиална функционална зависимост и theater не е суперключ. По стратегията за декомпозиция разпадаме Bookings на две релации със следните схеми:
Bookings1 (theater, title)
Bookings2 (theater, city)
При тази декомпозиция, обаче, функционалната зависимост
city title theater се изгубва. Действително, ако да разгледаме следните екземпляри на Bookings1 и Bookings2:
-
theater
|
title
|
|
|
|
theater
|
city
|
Guild
|
The Net
|
|
|
|
Guild
|
Menlo Park
|
Park
|
The Net
|
|
|
|
Park
|
Menlo Park
|
Те са коректни, в смисъл, че не нарушават функционалните зависимости, които са проектирани в тях. След съединението им, обаче, се получава следният екземпляр на релацията Bookings:
-
theater
|
title
|
city
|
Guild
|
The Net
|
Menlo Park
|
Park
|
The Net
|
Menlo Park
|
В този екземпляр на Bookings е нарушена функционалната зависимост
title city theater.
По този начин при декомпозиране към нормална форма на Boyce-Codd не винаги запазваме функционалните зависимости.
Решението на проблема е да отслабим условието на Boyce-Codd.
Казваме, че една релация R е в трета нормална форма (3NF), ако за всяка нетривиална функционална зависимост A1 A2 …Ak B имаме, че
{ A1, A2, …, Ak} е суперключ или B е част от ключ.
Например, релацията Bookings е в 3NF, тъй като във функционалната зависимост theater city имаме, че city е част от ключ.
Третата нормална форма запазва функционалните зависимости, но при нея има може да има излишества. Може да се покаже, че всяка релация може да се декомпозира подходящо в релации, които са в трета нормална форма.
Също са дефинирани първа и втора нормална форма, но тях няма да ги разглеждаме, тъй като те много рядко се използват на практика.
Четвъртата нормална форма ще разгледаме по-нататък.
Многозначни зависимости
Многозначните зависимости са обобщение на функционалните зависимости. Най-общо те са твърдения за незавимост на атрибути.
Ще разгледаме пример за релация в BCNF, в която има излишества. Естествено, тези излишества няма да са породени от функционални зависимости. Най-общо такива излишества произтичат от връзки много към много.
Да разгледаме следният екземпляр на релацията
StarsIn (name, street, city, title, year), която описва участие на актьор във филм заедно с неговия адрес. Предполагаме, че една звезда може да има повече от един адрес.
name
|
street
|
city
|
title
|
year
|
Carrie Fisher
|
123 Maple Str.
|
Hollywood
|
Star Wars
|
1977
|
Carrie Fisher
|
5 Locust Ln.
|
Malibu
|
Star Wars
|
1977
|
Carrie Fisher
|
123 Maple Str.
|
Hollywood
|
Empire Strikes Back
|
1980
|
Carrie Fisher
|
5 Locust Ln.
|
Malibu
|
Empire Strikes Back
|
1980
|
Carrie Fisher
|
123 Maple Str.
|
Hollywood
|
Return of the Jedi
|
1983
|
Carrie Fisher
|
5 Locust Ln.
|
Malibu
|
Return of the Jedi
|
1983
|
Звездата Carrie Fisher има два адреса и играе в три филма. За да се отрази това в релацията трябва да се комбинира всеки адрес с всеки филм, което води до очевидно излишество. Въпреки това, релацията е в BCNF, тъй като в нея няма функционални зависимости и всички атрибути образуват ключ.
Сподели с приятели: |