Лекции по бази данни



страница3/10
Дата16.12.2016
Размер1.96 Mb.
#11293
ТипЛекции
1   2   3   4   5   6   7   8   9   10

Комбиниране на релации
Комбинирането на релации може да се извършва в хода на преобразуването на ER-диаграма в релационни схеми.

Типична ситуация е следната: имаме две множества същности E, F и връзка R много към един от E към F. В този случай ключовите атрибути на E се съдържат както в релацията за E (заедно с останалите атрибути на E), така и в релацията за R. Релацията за R съдържа още ключовите атрибути на F, както и атрибутите на R, ако има такива. Тъй като R е връзка много към един, последните атрибути се определят еднозначно от ключовите на атрибути на E, което означава, че можем да комбинираме релациите на E и R в една релация със следните атрибути:



  • всички атрибути на E;

  • ключовите атрибути на F;

  • атрибутите на R.

Един проблем е, че в кортеж, съответстващ на същност от Е, която не е свързана със същност от F съответните компоненти за ключовите атрибути на F и за атрибутите на R трябва да имат null-стойности.
Като пример релацията за множеството същности Моvies може да се комбинира с релацията за връзката Owns, тъй като връзката Owns е много към един от Movies към Studios. В резултат получаваме следната схема на релация: Movies (title, year, length, type, studioName).
Неудачно е релациите за всички връзки да се комбинират с релации за множества същности, особено, ако връзките са много към много.

Например, да опитаме да комбинираме релацията Movies и релацията за връзката StarsIn.

Получаваме следната схема:

Movies (title, year, length, type, starName). Тъй като в един филм може да участва повече от една звезда, то за всяко такова участие трябва да има по един кортеж в екземпляр за Movies. Това, обаче, води до дублиране на останалата информация за филмите.


Преобразуване на слаби множества същности
Нека W е слабо множество от същности.

Преобразуването се извършва по следния начин:



  • релацията за слабото множество W включва атрибутите на W и всички останали атрибути, които формират ключа на W; тези атрибути се определят от поддържащите връзки на W;

  • релацията за една връзка, в която участва W, трябва да съдържа всички ключови атрибути на W, включително тези, които не са собствени атрибути на W; това важи само за връзки, които не са поддържащи;

  • поддържащите връзки въобще не се преобразуват в релации – ако имат атрибути, те се добавят към атрибутите на релацията за W.

Като пример да преобразуваме слабото множество Crews, което разгледахме по-горе. Получаваме следните две схеми на релации:

Studios (name, address)

Crews (crewNumber, studioName).

Да предположим, все пак, че сме добавили и схема за връзката unit_of:

UnitOf (crewNumber, studioName, studioName1). Тук сме включили, както обикновено, ключовете на множествата същности Studios и Crews.

При това положение, кортежите във всеки екземпляр на релацията ще имат еднакви стойности за studioName и studioName1. Поради тази причина можем да премахнем атрибутът studioName1 от схемата.

Новополучената схема е абсолютно идентична на Crews, затова можем да я премахнем.


От примера по-горе може да останем с погрешно впечатление, че ако атрибутите на една релация са подмножество на атрибутите на друга релация, то може да премахнем първата релация.

Това не може да се осъществи, ако между релациите няма семантична връзка - например, релациите Studios и Stars имат едни и същи атрибути, но представляват съвсем различни същности.

Има случаи, в които между релациите има връзка, но елиминирането отново не може да се извърши.

Да разгледаме следния пример с две релации:

People (name, #ss)

TaxPayers (name, #ss, money)

Кортежите на първата релация отговарят на всички хора, които имат социални осигуровки. Кортежите на втората релация отговарят на хората, които имат социални осигуровки и са платили определена сума.

Ако премахнем релацията People, ще загубим информацията за хората, които са социално осигурени, но не са плащали данъци.



Преобразуване на isa-йерархии
При преобразуване на isa-йерархии се използват три подхода.
ER подход
При този подход всяко множество същности в йерархията се преобразува към отделна релация, която включва собствените атрибути на множеството същности и ключовите атрибути на коренното множество същности. Връзките isa не се преобразуват към релации.
Като пример isa-йерархията от по-горе с корен Movies се преобразува към следните схеми на релации:

Movies (title, year, length, type)

Cartoons (title, year)

MurderMysteries (title, year, weapon)

За всеки филм има кортеж в екземпляра на Movies. Ако един филм е конкретна същност от Cartoons, то за него ще има кортеж както в екземпляра на Movies, така и в екземпляра на Cartoons. Аналогично, ако един филм е конкретна същност от MurderMysteries, то за него ще има кортеж както в Movies, така и в MurderMysteries.

Ако един филм е едновременно конкретна същност както в Cartoons, така и в MurderMysteries, то за него ще има кортежи и в трите релации.

Връзката voice_of се преобразува към следната релация:

VoiceOf (starName, title, year).

Тук starName е ключът на множеството същности Star, title, year е ключът на Cartoons, който съвпада с ключа на Movies.

Да отбележим, че схемата на релацията Cartoons е подсхема на релацията Voices. Въпреки това, можем да елиминираме релацията Cartoons само ако сме сигурни, че всички анимационни филми са озвучени.


Обектно-ориентиран подход
За всяко поддърво на йерархията, което съдържа корена се образува по една релация, като в нея се включват атрибутите на всички множества същности от поддървото.
В примера с йерархията с корен Movies имаме четири поддървета:

  • поддървото, съставено само от Movies;

  • поддървото, съставено от Movies и Cartoons;

  • поддървото, съставено от Movies и МurderMysteries;

  • поддървото, съставено от Movies, Cartoons и MurderMysteries.

Така трябва да съставим четири схеми на релации:

Movies (title, year, length, type)

MoviesC (title, year, length, type)

MoviesMM (title, year, length, type, weapon)

MoviesCMM (title, year, length, type, weapon)
За всяка конкретна същност от Movies има точно един кортеж в точно една от дефинираните релации. Затова подходът е обектно-ориентиран – всяка същност принадлежи на собствения си клас.

Връзката voice_of отново трябва да преобразуваме към следната схема на релация: VoiceOf (title, year, starName).

Ако има значение в коя релация е кортежът за даден филм от Cartoon, то за връзката voice_of трябва да съставим по една релация за всяко съответно поддърво. Ако поставим такова изискване връзката Voices ще се преобразува към следните две релации:

VoicesC (title, year, starName)

VoicesCMM (title, year, starName)
Използване на null-стойности
Създава се една обща релация, която включва всички атрибути на всички множества същности от йерархията. За всяка конкретна същност има точно един кортеж в релацията. Ако тази същност не принадлежи на някое множество същности от йерархията, то компонентите в кортежа, съответни на собствените атрибути на това множество същности трябва да съдържат null-стойности.
В примера с йерархията Моvies трябва да образуваме една релация:

Movies (title, year, length, type, weapon).

За филмите, в които няма мистериозни убийства стойността на атрибута weapon ще е null. Връзката voice_of се преобразува аналогично към релация VoiceOf (title, year, starName). И в този случай могат да се дефинират няколко релации за връзката voice_of, ако има значение в кои множества същности от йерархията попада съответния анимационен филм.
Сега ще сравним трите подхода по някои критерии.


  1. Скъпо е да се отговаря на заявки, в които участват няколко релации. По този критерий най-добрият подход е с null-стойностите. Другите два подхода имат предимства и недостатъци в зависимост от заявките. Например:

    1. Нека заявката е “кои филми от 1999г. са по-дълги от 150 минути?”. Тогава при ER подхода търсенето ще се осъществи само в релацията Movies, докато при обектно-ориентирания подход трябва да се търси във всяка една от релациите.

    2. Нека заявката е “какво оръжие се използва в анимационните филми, които са по-дълги от 150 минути?”. Тогава при ER подхода търсенето ще започне в релацията Movies, където ще се определят филмите, които са по-дълги от 150 минути. След това ще продължи в релацията Cartoons за да се определят кои от намерените са анимационни филми, след това в релацията MurderMysteries за да се определи в кои от тях има мистериозни убийства. Така търсенето засяга и трите релации. При обектно-ориентирания подход трябва да се търси само в една релация – MoviesCMM, където е налице всичката нужна информация.

  2. Добре е да не използваме много релации. Тук отново подходът с null-стойности е най-добър. Обектно-ориентираният подход е най-лош, тъй като броят на поддърветата расте експоненциално с нарастване на броя на множествата същности в йерархията.

  3. Минимизиране на пространството и избягване на повторенията. Тук най-добър е обектно-ориентираният подход, тъй като за всяка същност има точно един кортеж, който съдържа точно тази информация, която е смислена за кортежа. При ER подхода за една същност може да има няколко кортежа, но в тях се дублират само ключовете. Подходът с null-стойности е най-лош по този критерий за големи йерархии, въпреки че отново за всяка същност има единствен кортеж – при него има огромно разхищение на пространство.

При конкретни СУБД, които поддържат ER модела има опции коя от трите стратегии да се използва.


Функционални зависимости
Ще разгледаме по-подробно ограничения на единствената стойност в релационния модел, които ще наречем функционални зависимости.

Освен тях се използват многозначни зависимости и ограничения за референтна цялостност. Всички тези ограничения се използват за усъвършенстване на схемата на една база от данни.


Функционална зависимост в една релация R наричаме твърдение от вида от следния вид: ако два кортежа имат едни и същи компоненти, отговарящи на атрибутите A1, A2, …, An, то те имат едни и същи компоненти, отговарящи на атрибута B. Казваме още, че атрибутите

A1, A2, …, An функционално определят атрибута B.

Бележим функционалната зависимост по следния начин: A1 A2 … An  B.

Ако A1, A2, …, An функционално определят повече от един атрибут, т.е.

имаме A1 A2 … An  B1, A1 A2 … An  B2, …, A1 A2 … An  Bk, то съкратено записваме A1 A2 … An  B1 B2 …Bk.
Като пример в релацията

Movies (title, year, length, type, studioName, starName)

имаме следните функционални зависимости:

title year  length, title year  type, title year  studioName или съкратено

title year  length type studioName.

Първите две зависимости произтичат от това, че в диаграмата ER

title, year е ключ на множеството същности Movies, а третата зависимост произтича от това, че има връзка много към един от Movies към Studios.

От друга страна, за релацията Movies не е в сила функционалната зависимост title year  starName, тъй като в един филм може да участва повече от една звезда.


Функционалните зависимости са ограничения за единствената стойност, които се отнасят към схемата на една релация, а не към определен неин екземпляр. По даден екземпляр можем да съдим за отсъствие, но не и за присъствие на функционална зависимост в схемата на релацията.
Ще определим понятието ключ в релационния модел.

Казваме, че множеството { A1, A2, …, An} от един или повече атрибути на релацията R образуват ключ на R, ако A1, A2, …, An функционално определят всички атрибути на R и { A1, A2, …, An} е минимално по включване с това свойство. Ако ключ се състои от единствен елемент, не поставяме фигурни скоби.


Например, в релацията Movies по-горе { title, year, starName } е ключ.
Възможно е една релация да има повече от един ключ. Обикновено в такава ситуация се избира един ключ, който се обявява за първичен ключ. Първичният ключ се използва при съхранение на релацията.

Естествено, добре е първичният ключ да съдържа колкото се може

по-малко атрибути.
В означението за схемата на релацията ще подчертаваме атрибутите, които образуват първичния ключ на тази релация. Например:

Movies (title, year, length, type, studioName, starName).


В модела ER няма изискване за минималност на ключовете.

За минималност на ключа можем да съдим само ако разполагаме с пълния набор от функционални зависимости между атрибутите.


Суперключ на една релация R се нарича множество от атрибути, което съдържа ключ. С други думи, атрибутите на суперключа трябва да определят функционално всички атрибути на R, но не е задължително суперключът да е минимален. Естествено, всеки ключ е суперключ, но обратното не е вярно.
Откриване на ключове в релации
Ако една релация се получава от множество същности на ER диаграма, то ключът на тази релация съвпада с ключа на множеството същности. Например:

Movies (title, year, length, type)

Stars (name, address)

Ако една релация се получава от бинарна връзка, то нейният ключ се определя в зависимост от типа на връзката:



  • ако връзката е много към много, то ключът на релацията за връзката се състои от ключовете на двете множества същности;

  • ако връзката е много към един от E към F, то ключът на релацията за връзката се състои от ключовите атрибути на E;

  • ако връзката е един към един между E и F, то ключът на релацията за връзката се състои или от ключовите атрибути на E или от ключовите атрибути на F, т.е. релацията няма единствен ключ.

Примери:

Owns (title, year, studioName)

StarsIn (title, year, starName)
Ако една релация се получава от небинарна връзка, то от диаграмата ER не може да се определят всички функционални зависимости, които съществуват между нейните атрибути. Със сигурност е изпълнено следното: ако връзката е много към един към някое множество същности E, т.е. има стрелка към E, то със сигурност съществува ключ на релацията за връзката, който не съдържа ключовите атрибути на E.
Правила за функционалните зависимости
Ще разгледаме някои правила, чрез които от даден набор функционални зависимости в релация можем да извличаме нови функционални зависимости в тази релация.
Функционалните зависимости за една релация често могат да бъдат представени по различен начин. По-формално, казваме че множествата S и T от функционални зависимости са еквивалентни, ако множеството от екземплярите на релацията, удоволетворяващи S съвпада с множеството от екземплярите на релацията, удоволетворяващи T.

По-общо, множеството функционални зависимости S следва от множеството от функционални зависимости T, ако всеки екземпляр на релацията, който удоволетворява T, удоволетворява и S.

Естествено, ако от S следва T и от T следва S тогава и само тогава, когато S и T са еквивалентни.
Нека е дадена функционална зависимост A1 A2 …An  B1 B2 …Bm.

Тогава можем да заменим тази функционална зависимост със следните функционални зависимости: A1 A2 …An  Bi, i = 1, 2, …, m. Това правило наричаме правило за разделяне.

Обратно, функционалните зависимости A1 A2 …An  Bi, i = 1, 2, …, m можем да заменяме с една функционална зависимост

A1 A2 …An  B1 B2 …Bm. Това правило наричаме правило за комбиниране.

Очевидно е, че и в двата случая полученото множество функционални зависимости е еквивалентно на изходното.

Например, множествата функционални зависимости { title year  length,

title year  type, title year  studioName } и

{ title year  length type studioName } са еквивалентни.


Казваме, че функционалната зависимост A1 A2 …An  B е тривиална, ако B = Ai за някое i  { 1, 2, …, n }. Естествено, трививалните функционални зависимости са изпълнени във всяка релация.
По-общо, казваме че функционалната зависимост

A1 A2 …An  B1 B2 …Bm е тривиална, ако { B1, B2, …, Bm}  { A1, A2, …, An}.

Казваме, че функционалната зависимост A1 A2 …An  B1 B2 …Bm е нетривиална, ако съществува i  { 1, 2, …, m}, такова че

Bi  { A1, A2, …, An}.

Казваме, че функционалната зависимост A1 A2 …An  B1 B2 …Bm е напълно нетривиална, ако за всяко i  { 1, 2, …, m}, имаме

Bi  { A1, A2, …, An}.


Например, функционалната зависимост title year  title е тривиална,

функционалната зависимост title year  year length е нетривиална,

а функционалната зависимост title year  length е напълно нетривиална.
Нека A1 A2 …An  B1 B2 …Bm е нетривиална функционална зависимост.

Тогава можем да премахнем онези Bi, които съвпадат с някое Aj.

Получаваме нова функционална зависимост A1 A2 …An  C1 C2 …Ck, която очевидно е еквивалентна на изходната. Това правило наричаме правило за отстраняване на тривиалните зависимости.
Нека A1 A2 …An  B1 B2 …Bm и B1 B2 …Bm  C1 C2 …Ck са функционални зависимости. Тогава добавяме нова функционална зависимост

A1 A2 …An  C1 C2 …Ck. Това правило наричаме транзитивно правило.

Ясно е, че добавената функционална зависимост следва от изходните функционални зависимости, така че получаваме еквивалентно множество от функционални зависимости.
Например, да разгледаме релацията

Movies (title, year, length, type, studioName, studioAddress).

За нея са в сила функционалните зависимости

title year  studioName, studioName  studioAddress.

По транзитивното правило получаваме, че функционалната зависимост

title year  studioAddress също е в сила за тази релация.


Изчисляване на покритие на атрибути
Нека { A1, A2, …, An} е множество от атрибути, S е множество от функционални зависимости. Покритие на { A1, A2, …, An} относно S е множеството от всички атрибути B, такива че всеки екземпляр на релацията, който удоволетворява S удоволетворява и функционалната зависимост A1 A2 …An  B, т.е. от S следва A1 A2 …An  B.

Означаваме покритието по следния начин: { A1, A2, …, An} +.

Естествено, { A1, A2, …, An }  { A1, A2, …, An} +, тъй като тривиалните функционални зависимости винаги са изпълнени.
Ще опишем алгоритъм за изчисляване на покритието на { A1, A2, …, An} относно S.


  1. Инициализираме X = { A1, A2, …, An }.

  2. Търсим функционална зависимост B1 B2 …Bm  C в S, такава че B1, B2, …, Bm  X, но C  X. Тогава добавяме C към X.

  3. Повтаряме стъпка 2., докато вече не е възможно добавяне на атрибути в X. Този момент винаги ще настъпи, тъй като X винаги расте, а множеството от атрибути е крайно.

  4. Покритието { A1, A2, …, An} + съвпада с X.

Ще разгледаме пример. Нека атрибутите на релацията са A, B, C, D, E, F.

Нека S се състои от следните функционални зависимости

AB  C, BC  AD, D  E, CF  B.

Да изчислим покритието на { A, B} в S.


  1. X = { A, B }.

  2. X = { A, B, C}, чрез AB  C.

  3. X = { A, B, C, D}, чрез BC  AD.

  4. X = { A, B, C, D, E }, чрез D  E.

Невъзможно е X да нараства още, така че { A, B} + = { A, B, C, D, E }.

Покритието се използва при определяне дали дадена функционална зависимост следва от множество функционални зависимости по следната схема. Нека A1 A2 …An  B е функционална зависимост, S е множество от функционални зависимости. Тогава образуваме покритието на { A1, A2, …, An } относно S.



  1. Ако B  { A1, A2, …, An} +, то функционалната зависимост A1 A2 …An  B следва от S.

  2. Ако B  { A1, A2, …, An} +, то функционалната зависимост A1 A2 …An  B не следва от S.

По-общо, функционалната зависимост A1 A2 …An  B1 B2 …Bm следва от S тогава и само тогава, когато { B1, B2, …, Bm}  { A1, A2, …, An } +.
В примера, който разгледахме преди малко нека да определим дали функционалната зависимост D  A следва от S.

Първо изчисляваме { D} +.



  1. X = { D }.

  2. X = { D, E }, чрез D  E.

Невъзможно е X да нараства още, така че { D} + = { D, E }. Тъй като

А  { D, E }, то функционалната зависимост D  A не следва от S.


Ще се заемем със задачата да покажем, че описаният алгоритъм е коректен. Трябва да покажем две неща:

  1. (коректност) Ако B  { A1, A2, …, An} +, то функционалната зависимост A1 A2 …An  B действително следва от S.

  2. (пълнота) Ако A1 A2 …An  B следва от S, то задължително

B  { A1, A2, …, An} +.
С индукция по броя на изпълненията на стъпка 2. от алгоритъма ще покажем, че за всеки атрибут D в X, имаме, че функционалната зависимост A1 A2 …An  D следва от S.

База: преди да се изпълни стъпка 2. имаме X = { A1, A2, …, An}, така че функционалната зависимост A1 A2 …An  D e тривиална и следва от S.

Предположение: нека твърдението е изпълнено след k-тото изпълнение на стъпка 2.

Стъпка: нека D е добавено в X при k+1-то изпълнение на стъпка 2.

Тогава съществува функционална зависимост B1 B2 …Bm  D от S и

B1 B2 …Bm са били в X след k-тото изпълнение на стъпка 2.

По индукционното предположение функционалните зависимости

A1 A2 …An  Bi, i = 1, 2, …, m следват от S, също B1 B2 …Bm  D е в S, така че A1 A2 …An  D следва от S по транзитивното правило.


Тъй като след изпълнението на алгоритъма X = { A1, A2, …, An} +, то коректността е доказана.
Нека B  { A1, A2, …, An} +. Ще покажем, че A1 A2 …An  B не следва от S.

За целта разглеждаме следният екземпляр на релацията:







{ A1, A2, …, An} +

останалите атрибути (тук е B)

t:

1

1



1

0

0



0

s:

1

1



1

1

1



1

Нека C1 C2 …Ck  D е функционална зависимост от S. Да допуснем, че

тя не е в сила за горния екземпляр. Тъй като в него има само два кортежа, то те я нарушават, т.е. стойностите им за C1 C2 …Ck съвпадат, но стойностите за D не съвпадат. Ясно е, че при това положение

C1, C2, …, Ck  { A1, A2, …, An} +, D  { A1, A2, …, An} +. Но това е противоречие, тъй като D трябва да е било добавено към X чрез функционалната зависимост C1 C2 …Ck  D когато X е било

{ A1, A2, …, An} +. И така, функционалните зависимости от S са в сила за посочения екземпляр. От друга страна, очевидно функционалната зависимост A1 A2 …An  B не е в сила за него, тъй като

Аi  { A1, A2, …, An} +, i = 1, 2, …, n, но B  { A1, A2, …, An} +.

Така намерихме екземпляр на релацията, който удоволетворява S, но не удоволетворява A1 A2 …An  B, така че A1 A2 …An  B не следва от S.

С това доказахме пълнотата.


Да отбележим, че { A1, A2, …, An } + се състои от всички атрибути на релацията  { A1, A2, …, An } е суперключ на тази релация. Така, ако трябва да проверим дали дадено множество { A1, A2, …, An } е ключ на дадена релация, то първо проверяваме дали { A1, A2, …, An } + изчерпва всички атрибути и след това се уверяваме, че никое собствено подмножество на { A1, A2, …, An } няма това свойство.
Множество от функционални зависимости за една релация, от което могат да се извлекат всички останали функционални зависимости в тази релация се нарича база на релацията. База, която е минимална по включване с това свойство наричаме минимална база. Минималните бази могат да се използват за представяне на всички функционални зависимости в дадена релация.

Като пример да разгледаме релацията R (A, B, C) със следните функционални зависимости A  B, A  C, B  A, B  C, C  A, C  B,

AC  B, AB  C, BC  A. Тогава множествата

{ A  B, B  A, B  C, C  A } и { A  B, B  C, C  A } образуват минимални бази на релацията.



Каталог: materials
materials -> Исторически преглед на възникването и развитието на ес
materials -> Съюз на математиците в българия-секция русе коледно математическо състезание – 12. 2006 г. 4 клас
materials -> Великденско математическо състезание 12. 04. 2008 г. 2 клас Времето за решаване е 120 минути
materials -> Съюз на математиците в българия-секция русе коледно математическо състезание – 09. 12. 2006г
materials -> Съюз на математиците в българия-секция русе коледно математическо състезание – 12. 2006 г. 8 клас
materials -> Великденско математическо състезание 12. 04. 2008г. 3 клас
materials -> К а т е д р а " информатика"
materials -> Зад. 2 Отг.: 5- 3т Зад. 3 Отг.: (=,-);(+,=);(+,=) по 1т., общо 3т. За
materials -> Іv клас От 1 до 5 зад по 3 точки, от 6 до 10 – по 5 и от 11 до 15 – по 7


Сподели с приятели:
1   2   3   4   5   6   7   8   9   10




©obuch.info 2024
отнасят до администрацията

    Начална страница