= Нормализација = == Функциски зависности == **''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_ucenik += {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_pocetk_cas, tema_cas, id_domasno, opis_domasno, id_zainteresiran_za, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, id_ucenici_domasno, dali_zavrsena_domasna, id_predava_na, cena_po_cas, broj_casovi_po_dogovor, id_predava_predmet, opis_predava_predmet} - според функциските зависности со атрибути од лева страна го добивме следниот супер клуч.\\ id_admin, id_ucenik - id_admin и id_ucenik сами по себе, односно нивните затворачи не претставуваат супер клуч, додека нивниот заеднички затворач ги опфаќа сите останати атрибути, затоа претставува и кандидат клуч. Истиот претставува и единствен канидадат клуч бидејќи, примарните атрибути односно id_admin и id_ucenik не се наоѓаат на десната страна на ниту една функциска зависност.\\ Со тоа можеме да видеме дека имаме парцијални зависности, односно дека подмножество на кандидат клучот покажува кон непримарни атрибути и се наоѓаме во 1НФ. За да преминеме во 2НФ. треба да ги отстраниме парцијалните зависности со што ќе ги поделеме во табели. \\ R1 = (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_kvalifikacija, dokument_kvalifikacija, id_predmet, ime_predmet, id_cas, vreme_pocetk_cas, tema_cas, id_domasno, opis_domasno, id_zainteresiran_za, datum_zainteresiran, id_plakanja, iznos, id_slusanje, plateno, id_ucenici_domasno, dali_zavrsena_domasna, id_predava_na, cena_po_cas, broj_casovi_po_dogovor, id_predava_predmet, opis_predava_predmet) R2 = (id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik) - после ова разделување гледаме дека, R2 сме ја доведиле со BCNF, но R1 се наоѓа во 2нф, каде има транзитивни зависности и затоа не сме ни во 3нф. За да продолжеме со декомпозирање мора да создадеме уште табели и да ги разделеме податоците.\\ R3 = (id_admin, ime_admin, prezime_admin, email_admin, password_admin, id_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_zainteresiran_za, id_plakanja, id_slusanje, id_ucenici_domasno, id_predava_na, id_predava_predmet) R4 = (id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik) R5 = (id_kvalifikacija, dokument_kvalifikacija) R6 = (id_predmet, ime_predmet) R7 = (id_cas, vreme_pocetk_cas, tema_cas) R8 = (id_domasno, opis_domasno) R9 = (id_zainteresiran_za, datum_zainteresiran) R10 = (id_plakanja, iznos) R11 = (id_slusanje, plateno) R12 = (id_ucenici_domasno, dali_zavrsena_domasna) R13 = (id_predava_na, cena_po_cas, broj_casovi_po_dogovor) R14 = (id_predava_predmet, opis_predava_predmet) - табелите од R4-R14 сега ни се наоѓаа во BCNF, гледаме дека сме ги декомпозирале добро, со тоа што имаат еден супер и кандидат клуч, не се трицијални и имаат по една ф.з., но R3 сега ни се наоѓа во 3нф за таа цел треба да направеме уште неколку чекори со што ќе ги декомпозираме до крај.\\ R31 = (id_admin, ime_admin, prezime_admin, email_admin, password_admin) R32 = (id_admin, id_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_zainteresiran_za, id_plakanja, id_slusanje, id_ucenici_domasno, id_predava_na, id_predava_predmet) - со ова сме ги декомпозирале до BCNF сите табели без да имаме загубени ф.з. и податоци.\\ R15 = (id_admin, id_ucenik) - за крај ја додаваме оваа табела за да можеме да ги влечеме податоците од двете табели заедно и да не се изгубат никакви податоци.