wiki:Normalization

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

Note: See TracWiki for help on using the wiki.