Version 28 (modified by 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 = ()
R7 = (id_cas, vreme_pocetok_cas, tema_cas)
R8 = (id_plakjanja, iznos)
R9 = (id_domasno, opis_domasno)