Plan wykładu 2 ZY DNYH Wykład 2: Sprowadzanie do postaci normalnych. SQL. Problemy w bazie danych Przykład sprowadzenia nieznormalizowanej relacji do 3NF SQL Małgorzata Krętowska Wydział Informatyki Politechnika iałostocka Problemy w bazie danych Problemy w bazie danych Nadmiarowość (redundancja). Dane powtarzają się w wielu wierszach dres1 niepotrzebnie się powtarza. W przypadku dodawania nowego zakupu przez Firmę1, gdy osoba wpisująca pomyli się i źle wpisze adres lub nazwę firmy, baza utraci spójność danych (nie będzie wiadomo, która wartość jest prawidłowa). nomalie modyfikacji. W przypadku gdy Firma1 zmieni swój adres, trzeba zmienić wszystkie wiersze (krotki) w tej tabeli (relacji). Jeśli nie zostanie zmieniony choćby jeden wiersz, baza utraci spójność danych. Wymaganie zmiany wszystkich wierszy w dużych bazach spowoduje znaczące obciążenie. nomalie usunięć Usunięcie jedynego zamówienia dla Firmy2 z tabeli powyżej spowoduje usunięcie wszelkich informacji o firmie, a tymczasem celowe może być zachowanie informacji o adresie firmy. W tej tabeli jest to niemożliwe (pomijamy w tej chwili możliwość wstawienia wartości NULL dla pola, co częściowo rozwiązuje problem). Przykład Tabela Sprzedaż Przykład Tabela Sprzedaż Rozwiązaniem tych problemów są postacie normalne, które gwarantują, że takie anomalie nie będą miały miejsca. Źródło: http://pl.wikipedia.org/wiki/nomalie_%28bazy_danych%29 3 Źródło: http://pl.wikipedia.org/wiki/nomalie_%28bazy_danych%29 4
Definicja zależności funkcyjnej Zależności funkcyjne Zależność funkcyjna: 1 2... n Interpretacja: jeśli dwie krotki relacji R są zgodne dla atrybutów 1, 2,.., n (tzn. obie krotki mają takie same wartości składowych dla wymienionych atrybutów), to muszą być również zgodne w pewnym innym atrybucie. Odczyt zapisu: 1, 2,..., n określają funkcyjnie Jeśli zbiór atrybutów 1, 2,..., n określa funkcyjnie więcej niż jeden atrybut tzn. 1 2... n 1 1 2... n 2 1 2... n 3 To taki zbiór zależności skrótowo przedstawiamy jako: 1 2... n 1 2 3 x y Jeśli x i y są zgodne dla atrybutów To muszą być zgodne również dla atrybutów Klucze relacji trybut lub zbiór atrybutów { 1, 2,..., n } tworzy klucz relacji, jeśli: wszystkie pozostałe atrybuty relacji są funkcyjnie zależne od tych atrybutów => nie może być sytuacji, w której dwie różne krotki relacji R były zgodne dla wszystkich atrybutów 1, 2,..., n. Nie istnieje taki podzbiór właściwy zbioru { 1, 2,..., n }, od którego pozostałe atrybuty relacji R są zależne funkcyjnie, tzn. klucz musi być minimalny Reguły dotyczące zależności funkcyjnych Zasady, które pozwalają na zastępowanie zbioru zależności funkcyjnych zbiorami równoważnymi lub na dołączanie do zbioru tych zależności, które wynikają ze zbioru początkowego. Wyróżniamy następujące reguły: reguła łączenia reguła podziału reguła przechodniości
Zasady podziału i łączenia Reguła podziału Zależność funkcyjną 1 2... n 1 2... m możemy zastąpić zbiorem zależności funkcyjnych 1 2... n i, gdzie i=1,2,...,m Reguła łączenia Zbiór zależności funkcyjnych 1 2... n i, gdzie i=1,2,...,m możemy zastąpić pojedynczą zależnością funkcyjną 1 2... n 1 2... m Reguła przechodniości Reguła przechodniości umożliwia kaskadowe łączenie zależności: jeśli w relacji R zachodzą zależności 1 2... n 1 2... m oraz 1 2... m 1 2... k, to w relacji R zachodzi także zależność 1 2... n 1 2... k. Uzasadnienienie powyższej reguły => wyliczenie domknięcia { 1, 2,..., n } +. 10 11 Przykład Przekształcić relację nieznormalizowaną Zamówienia do 3NF NrZamówienia IdDostawcy NazwaDostawcy resdostawcy Idzęści Nazwazęści Ilość dresu 1 300 FSO Żeromskigo 10 53 100 5 hopina 3 57 50 5 hopina 3 łotnik 59 500 6 Mozarta 56 2 400 FSM Tychy Pogodna 2 54 500 5 hopina 3 Koło 32 100 6 Mozarta 56 Gdańsk Silnik 3 500 FSR Olejowa 12 88 15 7 acha 45 4 600 FSM ielsko-iała łotnik Mickiewicza 45 59 400 6 Mozarta 56 Prądnica 21 50 7 acha 45 5 300 FSO Żeromskigo 10 53 200 5 hopina 3 57 30 5 hopina 3 łotnik 6 300 FSO Żeromskigo 10 59 20 6 Mozarta 56 12 Pierwsza postać normalna Relacja jest w pierwszej postaci normalnej, jeśli każda wartość atrybutu w każdej krotce tej relacji jest wartością atomową NrZamówienia IdDostawcy NazwaDostawcy resdostawcy Idzęści Nazwazęści Ilość dresu 1 300 FSO Żeromskigo 10 53 100 5 hopina 3 57 50 5 hopina 3 łotnik 59 500 6 Mozarta 56 2 400 FSM Tychy Pogodna 2 hopina 3 54 500 5
13 Pierwsza postać normalna Relacja w 1NF NrZamówienia IdDostawcy NazwaDostawcy resdostawcy Idzęści Nazwazęści Ilość dresu 1 300 FSO Żeromskigo 10 53 100 5 hopina 3 1 300 FSO Żeromskigo 10 57 50 5 hopina 3 łotnik 1 300 FSO Żeromskigo 10 59 500 6 Mozarta 56 Tychy 2 400 FSM Pogodna 2 54 500 5 hopina 3 Tychy Koło 2 400 FSM Pogodna 2 32 100 6 Mozarta 56 Gdańsk Silnik 3 500 FSR Olejowa 12 88 15 7 acha 45 ielsko-iała łotnik 4 600 FSM Mickiewicza 45 59 400 6 Mozarta 56 ielsko-iała Prądnica 4 600 FSM Mickiewicza 45 21 50 7 acha 45 5 300 FSO Żeromskigo 10 53 200 5 hopina 3 5 300 FSO Żeromskigo 10 57 30 5 hopina 3 łotnik 6 300 FSO Żeromskigo 10 59 20 6 Mozarta 56 14 Zależności funkcyjne dres_dostawcy Id_zęści Nazwa_zęści Ilość dres_u 15 16 Pełna zależność funkcyjna trybut relacji r jest w pełni funkcyjnie zależny od zbioru atrybutów X, jeśli jest funkcyjnie zależny od niego, ale nie jest funkcyjnie zależny od żadnego podzbioru zbioru X. Dana relacja jest w drugiej postaci normalnej, jeśli każdy atrybut tej relacji nie wchodzący w skład żadnego klucza jest w pełni funkcyjnie zależny od wszystkich kluczy tej relacji. klucz D Przekształcenie do 2PN D Rozwiązanie problemu: W celu uzyskania drugiej postaci normalnej należy podzielić relację na zbiór takich relacji, których wszystkie atrybuty będą w pełni funkcyjnie zależne od kluczy. Usunięcie niepełnej zależności funkcyjnej
17 Klucz relacji (, Id_zęści) W jaki sposób podzielić relację, aby była w 2NF? dres_dostawcy Id_zęści Nazwa_zęści Ilość dres_u 18 Dostawca_na_zamówieniu (,,, dres_dostawcy) NrZamówienia IdDostawcy NazwaDostawcy resdostawcy 1 300 FSO Żeromskigo 10 2 400 FSM Tychy Pogodna 2 3 500 FSR Gdańsk Olejowa 12 4 600 FSM ielsko-iała Mickiewicza 45 5 300 FSO Żeromskigo 10 6 300 FSO Żeromskigo 10 19 Dostawca_na_zamówieniu (,,, dres_dostawcy) zęści_w_magazynie (Id_zęści, Nazwa_zęści,, dres_u) 20 Dostawca_na_zamówieniu (,,, dres_dostawcy) zęści_w_magazynie (Id_zęści, Nazwa_zęści,, dres_u) Dostawy_części (Nr_zamówienia, Id_zęści, Ilość) Idzęści Nazwazęści Ilość dresu 53 100 5 hopina 3 57 50 5 hopina 3 łotnik 59 500 6 Mozarta 56 54 500 5 hopina 3 Koło 32 100 6 Mozarta 56 Silnik 88 15 7 acha 45 Prądnica 21 50 7 acha 45 NrZamówienia Idzęści Ilość 1 53 100 1 57 50 1 59 500 2 54 500 2 32 100 3 88 15 4 59 400 4 21 50 5 53 200 5 57 30 6 59 20
21 Zależności funkcyjne Dostawca_na_zamówieniu (,,, dres_dostawcy) zęści_w_magazynie (Id_zęści, Nazwa_zęści,, dres_u) Dostawy_części (Nr_zamówienia, Id_zęści, Ilość) Id_zęści Nazwa_zęści dres_dostawcy dres_u 22 Trzecia postać normalna Dana relacja jest w trzeciej postaci normalnej, jeśli jest ona w drugiej postaci normalnej i każdy jej atrybut nie wchodzący w skład żadnego klucza nie jest przechodnio funkcyjnie zależny od żadnego klucza tej relacji. Id_zęści Ilość Przechodnia zależność funkcyjna Zależności funkcyjne dwóch relacji w 3NF Trzecia postać normalna Trzecia postać normalna 23 24 dres_dostawcy Jakie relacje otrzymamy z relacji Dostawca_na_zamówieniu? Zmówienie_do_dostawcy (Nr_zamówienia, ) Dostawcy (Id_dostawcy, Nazwa_dostawcy, dres_dostawcy) Id_zęści Nazwa_zęści dres_u Jakie relacje otrzymamy z relacji zęści_w_magazynie? zęści (Id_zęści, Nazwa_zęści, ) y (, dres_u) dres_dostawcy Id_zęści Nazwa_zęści dres_u
Trzecia postać normalna Otrzymane relacje 25 26 Id_zęści Zamówienie_do_dostawcy (Nr_zamówienia, ) Ilość Dostawcy (Id_dostawcy, Nazwa_dostawcy, dres_dostawcy) Jakie relacje otrzymamy z relacji Dostawy_części? Dostawy_części (Nr_zamówienia, Id_części, Ilość) zęści (Id_zęści, Nazwa_zęści, ) y (, dres_u) Dostawy_części (Nr_zamówienia, Id_części, Ilość) Pierwsza postać normalna 27 28 Postać nieznormalizowana; struktury danych nie są dwuwymiarowe Przekształcenie do 1PN Relacja R D klucz D Przekształcenie do 2PN D Usunięcie danych nieelementarnych Usunięcie niepełnej zależności funkcyjnej
Trzecia postać normalna Przykład schematu bazy danych 29 Przekształcenie do 3PN Usunięcie przechodniej zależności funkcyjnej 30 Złączenia tabel Przykład SELET [LL DISTINT] wyrażenie [[S] alias],... FROM tabela_1, tabela_2,..., tabela_n WHERE warunki_łączące_tabele Wypisać nazwiska i nazwy departamentów pracowników. SELET nazwisko, pracownik.nr_departamentu "nr_dep (prac)", nazwa, departament.nr_departamentu "nr_dep (dep)" FROM pracownik, departament ; minimalna liczba łączących warunków = liczba tabel -1
Przykład cd Przykład Wypisać nazwiska i nazwy departamentów pracowników. SELET nazwisko, pracownik.nr_departamentu "nr_dep (prac)", nazwa, departament.nr_departamentu "nr_dep (dep)" FROM pracownik, departament WHERE pracownik.nr_departamentu=departament.nr_departamentu ; Wypisać poziomy płac poszczególnych pracowników wraz z ich zarobkami SELET nazwisko, pensja, nr_przedzialu FROM pracownik, poziom_zarobkow WHERE pensja between dolna_granica and gorna_granica; tabela poziom_zarobkow Powiązanie tabeli samej ze sobą 35 Powiązanie tabeli samej ze sobą jest możliwe dzięki zastosowaniu aliasu tabeli. Warunek łączenia odbywa się w taki sposób, jakby to były dwie oddzielne tabele: FROM tabela alias1, tabela alias2 Przykład: Wypisać nazwiska pracowników i nazwiska ich kierowników. select e.nazwisko pracownik, m.nazwisko kierownik from pracownik e, pracownik m where e.id_kierownika=m.id_pracownika;