wiki:Normalization

Version 29 (modified by 193140, 2 years ago) ( diff )

--

Нормализација

Функциски зависности

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)

Note: See TracWiki for help on using the wiki.