За цел имаме оптимизација на базата така што ќе се отстранат редундантни податоци, отстранат какви било аномалии при додавање, бришење или ажурирање на податоци ќе го постигнеме со помош на функционални зависности, откривање на соодветен покривач и нормализација каде што ќе целиме до 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}