Version 36 (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НФ.
Декомпозиција до највисока можна нормална форма
При определување на кандидат клучевите, тргнуваме од најтривијалниот суперклуч составен од сите атрибути, чиј затворач ги содржи сите атрибути.
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, id_zainteresiran_za, 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_kvalifikacija, id_predmet, id_cas, id_domasno, id_plakanja, 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_kvalifikacija, id_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
Треба да се направи проверка дали има уште кандидат клучеви. Поради ф.з. ime_predmet → id_predmet; email_admin → id_admin; email_nastavnik → id_nastavnik; email_ucenik → id_ucenik, согледуваме дека постојат уште кандидат клучеви бидејќи десната страна од сите ф.з. е примарен атрибут.
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)
Кога ќе погледнеме во горе поделените табели, имаме дел од табелите кои што се наоѓаат во BCNF, односно дека со нив веќе сме завршиле со нормализација. Но, гледаме дека вака ќе имаме губење на информации, односно дека, некои табели воопшто нема да имаат спојување, со што ако ги оставеме така ќе дојде до нивно губење, затоа ќе треба да постојат уште една табели, со цел да се запазе спојувањето на табелите и примарните атрибути да може да се влечат од една табела.
R14 = (id_admin, id_nastavnik, id_ucenik, id_kvalifikacija, id_predmet, id_cas, id_plakjanja, id_domasno, id_slusanje)
Од функциските зависности добивме 14 табели од кои:
R1 = (id_admin, ime_admin, prezime_admin, email_admin, password_admin) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_admin кој што претставува кандидат клуч.
R2 = (id_nastavnik, ime_nastavnik, prezime_nastavnik, opis_nastavnik, email_nastavnik, password_nastavnik, telefonski_broj_nastavnik) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_nastavnik кој што претставува кандидат клуч.
R3 = (id_ucenik, ime_ucenik, prezime_ucenik, opis_ucenik, email_ucenik, password_ucenik, telefonski_broj_ucenik) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_ucenik кој што претставува кандидат клуч.
R4 = (id_kvalifikacija, dokument_kvalifikacija) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_kvalifikacija кој што претставува кандидат клуч.
R5 = (id_predmet, ime_predmet) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_predmet кој што претставува кандидат клуч.
R6 = (id_predmet, id_ucenik, datum_zainteresiran) -BCNF, бидејќи имаме една функциска зависност, која доаѓа кандидат клуч, односно супер клучот составен од id_predmet и id_ucenik.
R7 = (id_cas, vreme_pocetok_cas, tema_cas) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_cas кој што претставува кандидат клуч.
R8 = (id_plakjanja, iznos) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_plakjanja кој што претставува кандидат клуч.
R9 = (id_domasno, opis_domasno) -BCNF, бидејќи имаме една функциска зависност, која доаѓа од id_domasno кој што претставува кандидат клуч.
R10 = (id_ucenik, id_domasno, dali_zavrseno_domasno) -BCNF, бидејќи имаме една функциска зависност, која доаѓа кандидат клучот, односно исто така супер клуч составен од id_ucenik, id_domasno.
R11 = (id_cas, id_slusanje, id_plakjanja, id_ucenik, plateno) -BCNF, бидејќи имаме една функциска зависност, која доаѓа кандидат клучот, односно исто така супер клуч составен од id_cas, id_slusanje.
R12 = (id_nastavnik, id_predmet, opis_predava_predmet) -BCNF, бидејќи имаме една функциска зависност, која доаѓа кандидат клучот, односно исто така супер клуч составен од id_nastavnik, id_predmet.
R13 = (id_nastavnik, id_ucenik, cena_po_cas, broj_casovi_po_dogovor) -BCNF, бидејќи имаме една функциска зависност, која доаѓа кандидат клучот, односно исто така супер клуч составен од id_nastavnik, id_ucenik.
R14 = (id_admin, id_nastavnik, id_ucenik, id_kvalifikacija, id_predmet, id_cas, id_plakjanja, id_domasno, id_slusanje) -BCNF, бидејќи немаме функциски зависности и самиот супер клуч претставува и кандидат клуч.
Табелите ги сведивме до BCNF, така крајниот резултат на нормализација е со 14 табели.