= Нормализација = == Функциски зависности == **''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, 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) - за крај ја додаваме оваа табела за да можеме да ги влечеме податоците од двете табели заедно и да не се изгубат никакви податоци.