За цел имаме оптимизација на базата така што ќе се отстранат редундантни податоци, отстранат какви било аномалии при додавање, бришење или ажурирање на податоци ќе го постигнеме со помош на функционални зависности, откривање на соодветен покривач и нормализација каде што ќе целиме до BCNF нормална форма.Анализата ќе биде извршувана на претпоследната верзија(18-та верзија) од базата соодветно со последната ревизија направена од сите три члена на тимот од иницијалниот проект.Бидејќи чуваме многу податоци и тоа би резултирало во преголема почетна релација за да ја отпочнеме нормализацијата ќе биде поделена на 3 помали релации соодветно според 3-те корисници на апликацијата.Исто така изоставен е атрибутот m_grad со оглед на тоа што апликацијата се однесува само за град Скопје, па ја губи смислата исто споменатиот атрибут.Покрај тоа ентитетите Возачи, Кондуктор и Патник ќе станат преклопувачки специјализиарни поткласи за соодветните ентитети Корисник и Вработен.Од пример табелите за секоја од 3-те корисници ќе ги изоставиме колоните кои ги претставуваат атрибутите за самите корисници бидејќи многу место окупираат, а истите се подразбираат со оглед на тоа што главната намена за апликацијата е 3-та типа корисници.Трите релации во прашање се:
- Реализирани линии од возачи
- Реализирани контроли
- Реализирани возења од патници
Реализирани линии од возачи
R={vozac_k_id, vozac_k_ime, vozac_k_adresa, vozac_k_email, vozac_k_telefon, vozac_k_is_admin, vozac_k_lozinka, vozac_v_plata, vozac_v_datum_vrab, vozac_v_datum_prekin_vrab, inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, a_seriski_broj, a_broj_sedista, li_id, li_ime, li_pravec}
Функционални зависности
vozac_k_id -> vozac_k_ime, vozac_k_adresa, vozac_k_email, vozac_k_telefon, vozac_k_is_admin, vozac_k_lozinka, vozac_v_plata, vozac_v_datum_vrab, vozac_v_datum_prekin_vrab
inl_id -> inl_datum_pocetok, inl_datum_kraj, vozac_k_id, a_registracija, li_id
a_registracija -> a_seriski_broj, a_broj_sedista
li_id -> li_ime, li_pravec
Лево
inl_id
Лево и десно
vozac_k_id, a_registracija, li_id
Десно
vozac_k_ime, vozac_k_adresa, vozac_k_email, vozac_k_telefon, vozac_k_is_admin, vozac_k_lozinka, vozac_v_plata, vozac_v_datum_vrab, vozac_v_datum_prekin_vrab, inl_datum_pocetok, inl_datum_kraj, a_seriski_broj, a_broj_sedista, li_ime, li_pravec
Покривач
{inl_id}+={inl_datum_pocetok, inl_datum_kraj, vozac_k_id , vozac_k_ime, vozac_k_adresa, vozac_k_email, vozac_k_telefon, vozac_k_is_admin, vozac_k_lozinka, vozac_v_plata, vozac_v_datum_vrab, vozac_v_datum_prekin_vrab , a_registracija, a_seriski_broj, a_broj_sedista, li_id, li_ime, li_pravec}
Кандидат клуч
inl_id
1NF е задоволена бидејќи немаме мултивредносни атрибути
2NF е задоволена бидејќи немаме парцијални зависности
3NF е нарушена бидејќи имаме транзитивни зависности, па така не е задоволена ни BCNF кон која целиме бидејќи потребно е да е задоволена нормализиацијата која и претходи во случајов 3NF
Декомпозиција
vozac_k_id -> vozac_k_ime, vozac_k_adresa, vozac_k_email, vozac_k_telefon, vozac_k_is_admin, vozac_k_lozinka, vozac_v_plata, vozac_v_datum_vrab, vozac_v_datum_prekin_vrab
R1={inl_id, inl_datum_pocetok, inl_datum_kraj, vozac_k_id, a_registracija, a_seriski_broj, a_broj_sedista, li_id, li_ime, li_pravec}
R2={vozac_k_id, vozac_k_ime, vozac_k_adresa, vozac_k_email, vozac_k_telefon, vozac_k_is_admin, vozac_k_lozinka, vozac_v_plata, vozac_v_datum_vrab, vozac_v_datum_prekin_vrab} во 3NF и BCNF
a_registracija -> a_seriski_broj, a_broj_sedista
R1_1={inl_id, inl_datum_pocetok, inl_datum_kraj, vozac_k_id, a_registracija, li_id, li_ime, li_pravec}
R1_2={ a_registracija, a_seriski_broj, a_broj_sedista} во 3NF и BCNF
li_id -> li_ime, li_pravec
R1_1_1={inl_id, inl_datum_pocetok, inl_datum_kraj, vozac_k_id, a_registracija, li_id} во 3NF и BCNF
R1_1_2={li_id, li_ime, li_pravec} во 3NF и BCNF
Реализирани контроли
R={konduktor_k_id, konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab, konduktor_v_datum_prekin_vrab, kontroli_id, kontroli_datum, inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, a_seriski_broj, a_broj_sedista, li_id, li_ime, li_pravec, kz_id, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kzn_ime, kzn_adresa, kzn_telefon, patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka}
Функционални зависности
Konduktor_k_id -> konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab,konduktor_v_datum_prekin_vrab
Kontroli_id -> kontrola_datum, Konduktor_k_id, inl_id
Inl_id -> inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id
a_registracija -> a_seriski_broj, a_broj_sedista
li_id -> li_ime, li_pravec
Kz_id -> kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kontrola_id, konduktor_k_id
kzr_kz_id -> patnik_k_id
kzn_kz_id -> kzn_ime, kzn_adresa, kzn_telefon
patnik_k_id -> patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka
Лево
kz_id
Лево и десно
кonduktor_k_id, kontroli_id, inl_id, a_registracija, li_id, patnik_k_id
Десно
konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab, konduktor_v_datum_prekin_vrab, kontrola_datum, inl_datum_pocetok, inl_datum_kraj, a_seriski_broj, a_broj_sedista, li_ime, li_pravec, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kontrola_id, konduktor_k_id, kzn_ime, kzn_adresa, kzn_telefon
Покривач
{Kz_id}+={kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, patnik_k_id, kontrola_id, konduktor_k_id, konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab, konduktor_v_datum_prekin_vrab, kontrola_datum, Inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id, a_seriski_broj, a_broj_sedista, li_ime, li_pravec, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kontrola_id, konduktor_k_id, kzn_ime, kzn_adresa, kzn_telefon}
Кандидат клуч
kz_id
1NF е задоволена бидејќи немаме мултивредносни атрибути
2NF е задоволена бидејќи немаме парцијални зависности
3NF е нарушена бидејќи имаме транзитивни зависности, па така не е задоволена ни BCNF кон која целиме бидејќи потребно е да е задоволена нормализиацијата која и претходи во случајов 3NF
Декомпозиција
Kontroli_id -> kontrola_datum, Konduktor_k_id, inl_id
R1={konduktor_k_id, konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab, konduktor_v_datum_prekin_vrab, kontroli_id, kz_id, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kzn_ime, kzn_adresa, kzn_telefon, patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka}
R2={kontroli_id, kontrola_datum, Konduktor_k_id, inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, a_seriski_broj, a_broj_sedista, li_id, li_ime, li_pravec}
Inl_id -> inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id
R2_1={kontroli_id, kontrola_datum, Konduktor_k_id, inl_id}
R2_2={Inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, a_seriski_broj, a_broj_sedista, li_id, li_ime, li_pravec}
a_registracija -> a_seriski_broj, a_broj_sedista
R2_1_1={Inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id, li_ime, li_pravec}
R2_1_2={a_registracija, a_seriski_broj, a_broj_sedista}
li_id -> li_ime, li_pravec
R2_1_1_1={Inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id}
R2_1_1_2={li_id, li_ime, li_pravec}
Konduktor_k_id -> konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab, konduktor_v_datum_prekin_vrab
R1_1={konduktor_k_id, kontroli_id, kz_id, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kzn_ime, kzn_adresa, kzn_telefon, patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka}
R1_2={konduktor_k_id -> konduktor_k_ime, konduktor_k_adresa, konduktor_k_email, konduktor_k_telefon, konduktor_k_is_admin, konduktor_k_lozinka, konduktor_v_plata, konduktor_v_datum_vrab, konduktor_v_datum_prekin_vrab}
kzr_kz_id -> patnik_k_id
R1_1_1={konduktor_k_id, kontroli_id,kz_id, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno, kzn_ime, kzn_adresa, kzn_telefon}
R1_1_2={kzr_kz_id, patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka}
patnik_k_id -> patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka
R1_1_2_1= {kzr_kz_id, patnik_k_id}
R1_1_2_2={patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka}
kzn_kz_id -> kzn_ime, kzn_adresa, kzn_telefon
R1_1_1_1={konduktor_k_id, kontroli_id,kz_id, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno}
R1_1_1_2={kz_id, kzn_ime, kzn_adresa, kzn_telefon}
Реализирани возења од патници
R={patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka, b_id, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, tb_ime, tb_trajnost, tb_cena, vozenje_id, vozenje_start, vozenje_end, vozenje_status, pnl_id, pnl_reden_broj, p_id, p_ime, m_id, m_opstina, m_ulica, li_id, li_ime, li_pravec}
Функционални зависности
Patnik_k_id -> patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka
B_id -> b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, patnik_k_id
Tb_id -> tb_ime, tb_trajnost, tb_cena
Vozenje_id -> vozenje_start, vozenje_end, vozenje_status, b_id, patnik_k_id, pnl_id
Pnl_id -> pnl_reden_broj, li_id, p_id
Li_id -> li_ime, li_pravec
P_id -> p_ime, m_id
M_id -> m_opstina, m_ulica
Лево
Vozenje_id
Лево и десно
Patnik_k_id, b_id, pnl_id, li_id, p_id, m_id
Десно
patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_ime, tb_trajnost, tb_cena, vozenje_start, vozenje_end, vozenje_status, pnl_reden_broj, li_ime, li_pravec, p_ime, m_opstina, m_ulica
Покривач
{Vozenje_id}+={patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka, b_id, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, tb_ime, tb_trajnost, tb_cena, vozenje_id, vozenje_start, vozenje_end, vozenje_status, pnl_id, pnl_reden_broj, p_id, p_ime, m_id, m_opstina, m_ulica, li_id, li_ime, li_pravec}
Кандидат клуч
vozenje_id
1NF е задоволена бидејќи немаме мултивредносни атрибути
2NF е задоволена бидејќи немаме парцијални зависности
3NF е нарушена бидејќи имаме транзитивни зависности, па така не е задоволена ни BCNF кон која целиме бидејќи потребно е да е задоволена нормализиацијата која и претходи во случајов 3NF
Декомпозиција
Patnik_k_id -> patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka
R1={patnik_k_id, b_id, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, tb_ime, tb_trajnost, tb_cena, vozenje_id, vozenje_start, vozenje_end, vozenje_status, pnl_id, pnl_reden_broj, p_id, p_ime, m_id, m_opstina, m_ulica, li_id, li_ime, li_pravec}
R2={patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka}
B_id -> b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, patnik_k_id
R1_1={patnik_k_id, b_id, vozenje_id, vozenje_start, vozenje_end, vozenje_status, pnl_id, pnl_reden_broj, p_id, p_ime, m_id, m_opstina, m_ulica, li_id, li_ime, li_pravec}
R1_2={b_id, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, tb_ime, tb_trajnost, tb_cena, patnik_k_id}
Tb_id -> tb_ime, tb_trajnost, tb_cena
R1_2_1={b_id, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, patnik_k_id}
R1_2_2={tb_id, tb_ime, tb_trajnost, tb_cena}
Vozenje_id -> vozenje_start, vozenje_end, vozenje_status, b_id, patnik_k_id, pnl_id
R1_1_1={patnik_k_id, b_id, vozenje_id, vozenje_start, vozenje_end, vozenje_status, pnl_id}
R1_1_2={pnl_id, pnl_reden_broj, p_id, p_ime, m_id, m_opstina, m_ulica, li_id, li_ime, li_pravec}
Li_id -> li_ime, li_pravec
R1_1_2_1={pnl_id, pnl_reden_broj, p_id, p_ime, m_id, m_opstina, m_ulica, li_id}
R1_1_2_2={li_id, li_ime, li_pravec}
P_id -> p_ime, m_id
R1_1_2_1_1={pnl_id, pnl_reden_broj, p_id, li_id}
R1_1_2_1_2= {p_id, p_ime, m_id, m_opstina, m_ulica}
M_id -> m_opstina, m_ulica
R1_1_2_1_2_1= {p_id, p_ime, m_id}
R1_1_2_1_2_2={m_id, m_opstina, m_ulica}