= Нормализација = == Функциски зависности == **''R''**(id_admin, ime_admin, prezime_admin, email_admin, password_admin, id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik, id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik, id_kvalifikacija, dokument_kvalifikacija, id_predmet, ime_predmet, id_cas, vreme_pocetok_cas, tema_cas, id_domasno, opis_domasno, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, dali_zavrseno_domasno, cena_po_cas, broj_casovi_po_dogovor, opis_predava_predmet) ---- Множество функциски зависности: FD = {\\ id_admin → ime_admin, prezime_admin, email_admin, password_admin,\\ email_admin → id_admin,\\ id_nastavnik → ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik,\\ email_nastavnik → id_nastavnik,\\ id_ucenik → ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik,\\ email_ucenik → id_ucenik,\\ id_kvalifikacija → dokument_kvalifikacija,\\ id_predmet → ime_predmet,\\ ime_predmet → id_predmet, \\ id_predmet, id_ucenik → datum_zainteresiran, \\ ime_predmet, id_ucenik → datum_zainteresiran,\\ id_cas → vreme_pocetok_cas, tema_cas, \\ id_plakjanja → iznos,\\ id_domasno → opis_domasno,\\ id_ucenik, id_domasno → dali_zavrseno_domasno,\\ id_cas, id_slusanje → id_plakjanja, id_ucenik, plateno,\\ id_nastavnik, id_predmet → opis_predava_predmet,\\ id_nastavnik, id_ucenik → cena_po_cas, broj_casovi_po_dogovor\\ } ---- Со примена на неколку чекори (Армстронгова аксиома за декомпозиција, отфрлање екстра атрибути и редундантни зависности), може да се добие следната канонична покривка:\\ Fc = {\\ id_admin → ime_admin, id_admin → prezime_admin, id_admin → email_admin, id_admin → password_admin, email_admin → id_admin,\\ id_nastavnik → ime_nastavnik, id_nastavnik → prezime_nastavnik, id_nastavnik → opis_nastavnik, id_nastavnik → email_nastavnik, id_nastavnik → password_nastavnik, id_nastavnik → telefonski_broj_nastavnik, email_nastavnik → id_nastavnik,\\ id_ucenik → ime_ucenik, id_ucenik → prezime_ucenik, id_ucenik → opis_ucenik, id_ucenik → email_ucenik, id_ucenik → password_ucenik, id_ucenik → telefonski_broj_ucenik, email_ucenik → id_ucenik,\\ id_kvalifikacija → dokument_kvalifikacija,\\ id_predmet → ime_predmet,\\ ime_predmet → id_predmet, \\ id_predmet, id_ucenik → datum_zainteresiran, \\ ime_predmet, id_ucenik → datum_zainteresiran,\\ id_cas → vreme_pocetok_cas, id_cas → tema_cas, \\ id_plakjanja → iznos,\\ id_domasno → opis_domasno,\\ id_ucenik, id_domasno → dali_zavrseno_domasno,\\ id_cas, id_slusanje → id_plakjanja,\\ id_cas, id_slusanje → id_ucenik,\\ id_cas, id_slusanje → plateno,\\ id_nastavnik, id_predmet → opis_predava_predmet,\\ id_nastavnik, id_ucenik → cena_po_cas, \\ id_nastavnik, id_ucenik → broj_casovi_po_dogovor\\ } == Нормална форма == Врз основа на горенаведените функциски зависности, нашиот актуелен дизајн се наоѓа во **1НФ**. Ако погледнеме еден од кандидат клучевите, на пример {id_admin, id_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_slusanje}, ќе забележиме дека подмножество од тој кандидат клуч покажува кон непримарен атрибут, односно постои парцијална зависност (id_admin, што претставува подможество од кандидат клучот, ги определува непримарните атрибути како ime_admin, prezime_admin, email_admin). Ваквиот тип на зависности е нарушување за повисоките нормални форми и според тоа доаѓаме до заклучок дека **''R''** е во 1НФ. == Декомпозиција до највисока можна нормална форма == За започнување со декомпозиција за почеток го гледаме множеството атрибути кои ја сочинуваат нашата релација:\\ **''R''**(id_admin, ime_admin, prezime_admin, email_admin, password_admin, id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik, id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik, id_kvalifikacija, dokument_kvalifikacija, id_predmet, ime_predmet, id_cas, vreme_pocetok_cas, tema_cas, id_domasno, opis_domasno, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, dali_zavrseno_domasno, cena_po_cas, broj_casovi_po_dogovor, opis_predava_predmet) ---- Следно, мораме да пронајдеме кандидат клуч, за таа цел ќе ги извршеме следните чекори:\\ id_admin, ime_admin, prezime_admin, email_admin, password_admin, id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik, id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik, id_kvalifikacija, dokument_kvalifikacija, id_predmet, ime_predmet, id_cas, vreme_pocetok_cas, tema_cas, id_domasno, opis_domasno, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, dali_zavrseno_domasno, cena_po_cas, broj_casovi_po_dogovor, opis_predava_predmet += {id_admin, ime_admin, prezime_admin, email_admin, password_admin, id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik, id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik, id_kvalifikacija, dokument_kvalifikacija, id_predmet, ime_predmet, id_cas, vreme_pocetok_cas, tema_cas, id_domasno, opis_domasno, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, dali_zavrseno_domasno, cena_po_cas, broj_casovi_po_dogovor, opis_predava_predmet} - секој атрибут си се пресликува самиот во себе и така заедно претставуваат супер клуч, но ние треба да стигнеме до идеалиот супер клуч, за да пронајдеме и кандидат клучеви, според горенаведените функциски зависности. \\ id_admin, id_nastavnik, id_ucenik, id_kvalifikacija, id_predmet, id_cas, id_plakanje, id_domasno, id_slusanje += {id_admin, ime_admin, prezime_admin, email_admin, password_admin, id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik, id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik, id_kvalifikacija, dokument_kvalifikacija, id_predmet, ime_predmet, id_cas, vreme_pocetok_cas, tema_cas, id_domasno, opis_domasno, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, dali_zavrseno_domasno, cena_po_cas, broj_casovi_po_dogovor, opis_predava_predmet} - според функциските зависности со атрибути од лева страна го добивме следниот супер клуч.\\ - id_admin, id_nastavnik, id_ucenik, id_kvalifikacija, id_predmet, id_cas, id_plakanje, id_domasno, id_slusanje сами по себе, односно нивните затворачи не претставуваат супер клуч, додека нивниот заеднички затворач ги опфаќа сите останати атрибути, затоа претставува и кандидат клуч. Истиот не претставува и единствен канидадат клуч бидејќи, примарните атрибути односно id_admiн, id_nastavnik, id_ucenik, id_predmet, id_plakjanja се наоѓаат на десната страна функциска зависност. Од тука можеме да увидеме дека кога ќе ги замениме овие атибути со атрибутите од ф.з., ќе добиеме друг кандидат клуч и тоа: email_admin, email_nastavnik, email_ucenik, id_kvalifikacija, ime_predmet, id_cas, id_domasno, id_slusanje.\\ - Со тоа го добиваме и множеството на примарни атрибутити кое го сочинуваат = {id_admin, email_admin, id_nastavnik, email_nastavnik, id_ucenik, email_ucenik, id_kvalifikacija, id_predmet, ime_predmet, id_cas, id_domasno, id_plakanje, id_slusanje}\\ Со тоа можеме да видеме дека имаме парцијални зависности, односно дека подмножество на кандидат клучот покажува кон непримарни атрибути и се наоѓаме во 1НФ. За да преминеме во 2НФ треба да ги отстраниме парцијалните зависности со што ќе ги поделеме во табели, започнувајќи од функциските зависности на атрибутите. \\ R1 = (id_admin, ime_admin, prezime_admin, email_admin, password_admin)\\ R2 = (id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik)\\ R3 = (id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik)\\ R4 = (id_kvalifikacija, dokument_kvalifikacija)\\ R5 = (id_predmet, ime_predmet)\\ R6 = (id_predmet, id_ucenik, datum_zainteresiran)\\ R7 = (id_cas, vreme_pocetok_cas, tema_cas)\\ R8 = (id_plakjanja, iznos)\\ R9 = (id_domasno, opis_domasno)\\ R10 = (id_ucenik, id_domasno, dali_zavrseno_domasno)\\ R11 = (id_cas, id_slusanje, id_plakjanja, id_ucenik, plateno)\\ R12 = (id_nastavnik, id_predmet, opis_predava_predmet)\\ R13 = (id_nastavnik, id_ucenik, cena_po_cas, broj_casovi_po_dogovor)\\