Zależność funkcyjna występuje wtedy, gdy po ustaleniu wartości pewnych atrybutów relacji wartości jakichś innych atrybutów tej relacji są jednoznacznie wyznaczone (unikalne).
Używa się notacji:
Mówimy, że zależność funkcyjną
Formalnie mozna to wyrazić następująco
choć funkcja
Zależność funkcyjną, której prawa strona zawiera kilka atrybutów
można zastąpić zbiorem zależności o pojedynczych prawych stronach
Operacja ta jest oczywiście odwracalna.
Przykład:
Uwaga:Nie wolno rozbijać lewych stron zależności!
Jeśli w przykładowym ZOO każdy zwierzak nazywa się inaczej, to dla relacji
Zwierz(imie,gatunek,waga,wiek) zachodzi zależność:
imie
Jeśli przyjęto (raczej naturalną) zasadę ,,Żadne dwa wykłady nie
odbywają się o tej samej godzinie w tej samej sali”, to mamy zależność
funkcyjną
godzina sala
Jak określa się zależności dla danej relacji? Jedynie przez odpytanie użytkowników.
Nie należy natomiast liczyć na to, że wykryjemy je na podstawie zawartości tabeli w bazie danych. W takiej tabeli może być pozornie spełniona pewna zależność, która przestanie zachodzić za pięć minut (po dodaniu do tabeli nowych wierszy)! W ten sposób można jedynie upewnić się, że podana zależność nie zachodzi.
Zależność
Zależności trywialne zachodzą zawsze i nie dostarczają żadnej informacji.
Jednym z ważniejszych pojęć w projektowaniu relacyjnych baz danych jest pojęcie klucza relacji. Zaczniemy od pomocniczej definicji.
Podzbiór
Czyli zbiór wszystkich atrybutów relacji na pewno jest jej nadkluczem.
Podzbiór
Inaczej mówiąc, klucze relacji to jej minimalne nadklucze. Obejrzymuy teraz przykłady kluczy.
Niech w relacji Zwierz zachodzi zależność
imie
{imie,gatunek} jest nadkluczem w relacji Zwierz
Nie jest jednak kluczem, bo {imie} też jest nadkluczem
{imie} jest kluczem i nie ma innych kluczy
Skąd się biorą klucze? Na ogół są wyznaczane z zależności funkcyjnych.
Czasem jednak otrzymane w ten sposób klucze obejmują zbyt wiele kolumn,
co jest w praktyce niewygodne. Wprowadza się wtedy arbitralnie tzw.
klucze sztuczne), dodając do relacji R nowy atrybut
gdzie
Pewne zależności można wyprowadzić z innych. Przykład: jeśli zachodzi
i zachodzi
to musi zachodzić
Można to sprawdzić z definicji. Inny sposób to skorzystać z reguł wnioskowania Armstronga.
Domknięciem zbioru atrybutów
Dla dowolnej zależności
Jeśli
Dla przykładu policzymy domknięcie atrybutu
Krok bazowy:
Indukcja: ponieważ
Indukcja: ponieważ
Wniosek: ponieważ
Spróbujmy innego przykładu. Dla zbioru zależności
domknięciem
Domknięcie zbioru zależności
Dwa zbiory zależności
Minimalny zbiór zależności jest to taki zbiór zależności, który nie jest równoważny żadnemu swojemu podzbiorowi.
Uwaga: to jest uproszczona definicja, pełna jest bardziej skomplikowana.
Minimalny zbiór zależności dla danego wyjściowego zbioru zależności nie jest wyznaczony jednoznacznie.
Reguły wnioskowania Armstronga służą do wyprowadzania zależności z innych zależności.
Jeden z celów, który staramy się osiągnąć podczas projektowania schematu bazy danych to unikanie redundancji (nadmiarowości). Redundancja oznacza, że niektóre informacje są zapisane w bazie danych wielokrotnie. Prowadzi to do anomalii podczas modyfikacji i usuwania
Anomalia modyfikacji: informacja zostaje uaktualniona tylko w niektórych miejscach
Przykład: zmiana adresu studenta na nowy, jeśli informacja o studencie i jego adresie trzymana jest w kilku miejscach.
Anomalia usuwania: wraz z usunięciem ostatniego wiersza szczegółowego znika informacja ogólna
Gdyby informacje o adresie studenta trzymać przy przedmiotach, na które jest zarejestrowany, to po zakończeniu sesji (a przed nową rejestracją) adres ten by zniknął.
Obejrzyjmy przykład złego projektu i jego konsekwencje. Przypuśćmy, że mamy relację Zwierzaki(gatunek,imie,waga,kontynent) z następującymi zależnościami
imie |
gatunek |
Przykładowa zawartość takiej relacji
gatunek | imie | waga | kontynent |
Papuga | Kropka | 3,50 | ??? |
Papuga | Lulu | 5,35 | Ameryka |
Papuga | Hipek | 3,50 | ??? |
Lis | Fufu | 6,35 | Europa |
Krokodyl | Czako | 75,00 | Afryka |
Występuje redundancja, ponieważ wartości dla ??? można łatwo odgadnąć (czy jak kto woli wyznaczyć) na podstawie zależności.
Normalizacja to proces, służący do przekształcenia schematu zawierającego redundancję w schemat, który jej nie zawiera. Zależnie od potrzeb określa się różne poziomy normalizacji — zakresy usuwania redundancji, nazywane postaciami normalnymi.
Dotychczas formalnie zdefiniowano pięć (poziomów) postaci normalnych, choć tylko trzy pierwsze są powszechnie używane podczas projektowania baz danych.
Postacie normalne są ponumerowane kolejno, ale istnieje postać pośrednia BCNF między 3 i 4 poziomem. Postacie o wyższych numerach automatycznie (z definicji) spełniają warunki dla niższych postaci, dlatego relacja w drugiej postaci normalnej jest automatycznie w pierwszej postaci normalnej.
Odwrotne wynikanie oczywiście nie zachodzi; drugą postać normalną otrzymujemy z pierwszej po nałożeniu dodatkowego warunku.
Proces normalizacji polega na dekompozycji tabel aż do otrzymania pożądanej postaci.
Warunkiem pierwszej postaci normalnej jest to, by każdy atrybut w relacji przyjmował tylko wartości niepodzielne. Przez wartości niepodzielne rozumiemy takie pojedyncze wartości, jak używane w atrybutach ,,numer klienta” czy ,,nazwisko klienta”.
Relacja w pierwszej postaci normalnej nie może zawierać atrybutu, w którym można upakować kilka wartości, np. odddzielając je przecinkami.
Daty można traktować jako wartości niepodzielne lub tworzyć oddzielne atrybuty dla dnia, miesiąca i roku.
Aby stwierdzić, czy relacja będąca w pierwszej postaci normalnej jest także w drugiej, należy określić klucze relacji.
Każdej wartości klucza powinien jednoznacznie odpowiadać pojedynczy wiersz w tabeli. Na przykład dla relacji Zamówienie_klienta kluczem może być numer_zamówienia.
Warunkiem na drugą postać normalną jest to, aby każdy niekluczowy atrybut zależał funkcyjnie od całego klucza. Niedozwolone są więc tzw. zależności częściowe.
Uwaga: przypominamy, że kluczy może być kilka!
Dla sprawdzenia, czy relacja będąca w drugiej postaci normalnej jest także w trzeciej, bada się zależności między atrybutami niekluczowymi.
Atrybuty niekluczowe powinny zależeć funkcyjnie wyłącznie od klucza i niczego więcej. Wykluczamy w ten sposób zależności przechodnie.
Bardziej restrykcyjna niż trzecia postać normalna jest postać normalna Boyce-Codda, lecz jest ona rzadziej wykorzystywana w aplikacjach komercyjnych.
Relacja R jest w tej postaci, jeśli jest w 1NF oraz dla każdej
nietrywialnej zależności
W odróżnieniu od 3NF sprowadzenie do BCNF nie gwarantuje zachowania zależności funkcyjnych przy rozkładzie.
Popatrzmy na inną definicję 3NF, lepiej pokazującą różnicę między nią a BCNF.
Relacja jest w 3NF jeśli jest w 1NF oraz
dla każdej nietrywialnej zależności
lewa strona zależności
lub
prawa strona zależności
Dekomponując relację R do BCNF pozbywamy się kolejno zależności naruszających ją. Przedtem należy zminimalizować zbiór zależności, ale pominiemy ten etap.
Dla relacji
Oblicz
Będzie zawierać tylko część atrybutów
Zastąp
Zrzutuj zbiór zależności
Powtarzaj dopóki relacje nie będą w BCNF.
Czasem zależności powodują kłopoty przy przejściu do BCNF. Weźmy tabelę Gdzie(adres,miasto,kod-pocztowy) i dwie zależności
adres miasto |
kod-pocztowy |
Mamy tu dwa klucze: {adres,miasto} oraz {adres,kod-pocztowy}.
Ale zależność kod-pocztowy
Gdzie1(adres,kod-pocztowy) |
Gdzie2(miasto,kod-pocztowy) |
Popatrzmy jednak na poniższy (ciut złośliwy) przykład
Gdzie2 | |
---|---|
adres | kod |
Banacha 2 | 01-234 |
Banacha 2 | 01-235 |
Gdzie1 | |
---|---|
miasto | kod |
Warszawa | 01-234 |
Warszawa | 01-235 |
Pozornie wszystko jest w porządku (żadna zależność nie jest naruszona), ale po złączeniu będzie już inaczej
Gdzie | ||
---|---|---|
adres | miasto | kod |
Banacha 2 | Warszawa | 01-234 |
Banacha 2 | Warszawa | 01-235 |
Naruszona jest zależność
adres miasto
Takie kłopotliwe układy zależności nie są rzadkie, popatrzmy na inny przykład zależności dla fikcyjnej sieci kin
kino |
film miasto |
Pierwsza z nich jest oczywista: każde kino znajduje się tylko w jednym mieście. Druga może wynikać z prowadzonej ,,polityki” wyświetlania, aby kina w tym samym mieście nie konkurowały ze sobą filmami. Skutek jest taki sam jak poprzednio.
W większości baz danych wystarcza dekompozycja do trzeciej postaci normalnej. Mogą jednak czasem występować anomalie wstawiania, powodowane zależnością wielowartościową.
Będzie tak między innymi wtedy, gdy pewne dwa niekluczowe atrybuty przyjmują dla każdej wartości innego atrybutu tylko po kilka wybranych wartości, niezależnie od innych atrybutów.
Na przykład na seminariach korzysta się z kilku książek. Każde seminarium ma tylko jedną nazwę, ale może mieć kilku prowadzących. Należy wówczas dokonać dekompozycji na dwie osobne relacje: prowadzący seminaria oraz teksty do seminariów, w przeciwnym razie wypadałoby umieścić w relacji dla danego seminarium wszystkie kombinacje prowadzących i książek.
Tabela
Aktorzy(nazwisko,ulica,miasto,film,rok)
podaje adresy aktorów (mogą mieć kilka) i filmy, w których grali.
Każdy aktor mógł grać w wielu filmach i może mieć kilka adresów.
Ale w pojedynczym wierszu możemy zapisać tylko jeden film i jeden adres.
Trudno będzie wtedy znajdować wszystkie filmy aktorów mieszkających w Warszawie.
W zasadzie powinniśmy zapisać wszystkie kombinacje adresów z filmami.
Zależność wielowartościowa
dla relacji
Inaczej mówiąc, lewa strona każdej takiej zależności nie wyznacza pojedynczej wartości, lecz zbiór wartości, np.
nazwisko |
nazwisko |
Każda zależność funkcyjna jest
zależnością wielowartościową, czyli jeśli zachodzi
to zachodzi także
Niestety odwrotna implikacja nie jest prawdziwa!
Jeśli dla relacji
to zachodzi także
Jeśli dla relacji
to zachodzi także
Podobnie jak dla zależności funkcyjnych, nie wolno rozbijać lewej strony zależności.
Ale dla zależności wielowartościowych nie wolno również rozbijać prawej strony!
Zależność wielowartościowa
Relacja
Jeśli relacja jest w 4NF, to jest też w BCNF.
Odwrotne zawieranie nie zachodzi.
Podobnie jak dla BCNF, szukamy zależności
Rozbijamy relację
Kończymy, gdy już nie ma takich zależności.
Zaczynamy od relacji Aktorzy(nazwisko,ulica,miasto,film,rok)
i zależności
nazwisko |
nazwisko |
W skład klucza wchodzą wszystkie kolumny tabeli.
Obie zależności naruszają więc 4NF (bo nie są trywialne).
Wybieramy do rozkładu pierwszą z nich.
Otrzymujemy dwie tabele
Aktorzy1(nazwisko,ulica,miasto) |
Aktorzy2(nazwisko,film,rok) |
z tymi samymi zależnościami.
Ponieważ obie zależności stały się trywialne, kończymy.
Czy któraś z podanych zależności funkcyjnych jest zależnością trywialną?
Pierwsza i trzecia.
Dla relacji
nie ma żadnego klucza
ma jeden klucz
ma 4 klucze.
Ma jeden klucz, składający się z wszystkich atrybutów relacji.
Które z poniższych stwierdzeń są prawdziwe:
Każda relacja w 3NF jest także w BCNF.
Każda relacja w BCNF jest także w 3NF.
Każda relacja dwuargumentowa jest w BCNF.
Drugie i trzecie.
Dana jest tabela
Który z poniższych zbiorów atrybutów jest kluczem
Tylko
Dana jest tabela
będąca w pierwszej postaci normalnej (1NF).
W jakich jeszcze postaciach jest ta tabela?
2NF
3NF
BCNF
2NF i 3NF.
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.