Version 42 (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, согледуваме дека постојат уште кандидат клучеви бидејќи десната страна од овие ф.з. е примарен атрибут.
Заменуваме, ја повторуваме истата постапка со редуцирањето на атрибути и добиваме уште неколку кандидат клучеви:
- id_admin, id_nastavnik, id_kvalifikacija, ime_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
- email_admin, id_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
- id_admin, email_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
- email_admin, email_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
- id_admin, email_nastavnik, id_kvalifikacija, ime_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
- email_admin, id_nastavnik, id_kvalifikacija, ime_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
- email_admin, email_nastavnik, id_kvalifikacija, ime_predmet, id_cas, id_domasno, id_plakanja, id_slusanje
Вкупно 23 кандидат клучеви, односно 8.
Од нив избираме еден за примарен клуч. Најоптимално во пракса би било за примарен клуч да биде избран клуч кој ќе овозможи побрзо пребарување (пр. составен од атрибути кои се цели броеви, наместо стрингови) и според тоа за примарен клуч го избираме клучот
id_admin, id_nastavnik, id_kvalifikacija, id_predmet, id_cas, id_domasno, id_plakanja, id_slusanje.