За цел имаме оптимизација на базата така што ќе се отстранат редундантни податоци, отстранат какви било аномалии при додавање, бришење или ажурирање на податоци ќе го постигнеме со помош на функционални зависности, откривање на соодветен покривач и нормализација каде што ќе целиме до BCNF нормална форма.Анализата ќе биде извршувана на претпоследната верзија од базата соодветно со последната ревизија направена од сите три члена на тимот од иницијалниот проект.Бидејќи чуваме многу податоци и тоа би резултирало во преголема почетна релација за да ја отпочнеме нормализацијата ќе биде поделена на 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} **Vozac**={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} **Avtobus**={ a_registracija, a_seriski_broj, a_broj_sedista} во 3NF и BCNF **li_id** -> li_ime, li_pravec **Istanca_Na_Linija**={inl_id, inl_datum_pocetok, inl_datum_kraj, vozac_k_id, a_registracija, li_id} во 3NF и BCNF **Linija**={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**={kontrola_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 **Kontroli**={kontrola_id, kontrola_datum, konduktor_k_id, inl_id} во 3NF и BCNF **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_2_1**={inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id, li_ime, li_pravec} **Avtobus**={a_registracija, a_seriski_broj, a_broj_sedista} во 3NF и BCNF **li_id** -> li_ime, li_pravec **Istanca_Na_Linija**={inl_id, inl_datum_pocetok, inl_datum_kraj, a_registracija, li_id} во 3NF и BCNF **Linija**={li_id, li_ime, li_pravec} во 3NF и BCNF **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} **Konduktor**={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} во 3NF и BCNF **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 **Kazna_Za_Registriran**= {kzr_kz_id, patnik_k_id} во 3NF и BCNF **Patnik**={patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka} во 3NF и BCNF **kzn_kz_id** -> kzn_ime, kzn_adresa, kzn_telefon **Kazna**={konduktor_k_id, kontroli_id,kz_id, kz_dokument, kz_datum, kz_iznos, kz_plateno, kz_datum_plateno} во 3NF и BCNF **Kazna_Za_Neregistriran**={kz_id, kzn_ime, kzn_adresa, kzn_telefon} во 3NF и BCNF = Реализирани возења од патници = **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} **Patnik**={patnik_k_id, patnik_k_ime, patnik_k_adresa, patnik_k_email, patnik_k_telefon, patnik_k_is_admin, patnik_k_lozinka} во 3NF и BCNF **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 **Bilet**={b_id, b_status, b_datum_na_kupuvanje, b_datum_istekuvanje, tb_id, patnik_k_id} во 3NF и BCNF **Tip_Bilet**={tb_id, tb_ime, tb_trajnost, tb_cena} во 3NF и BCNF **vozenje_id** -> vozenje_start, vozenje_end, vozenje_status, b_id, patnik_k_id, pnl_id **Vozenje**={patnik_k_id, b_id, vozenje_id, vozenje_start, vozenje_end, vozenje_status, pnl_id, inl_id} во 3NF и BCNF **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} **Linija**={li_id, li_ime, li_pravec} во 3NF и BCNF **p_id** -> p_ime, m_id **Postojka_Na_Linija**={pnl_id, pnl_reden_broj, p_id, li_id} во 3NF и BCNF **R1_1_2_1_2**= {p_id, p_ime, m_id, m_opstina, m_ulica} **m_id** -> m_opstina, m_ulica **Postojka**= {p_id, p_ime, m_id} во 3NF и BCNF **Mesto**={m_id, m_opstina, m_ulica} во 3NF и BCNF = Резиме = ==== 1NF ==== Сите релации кои произлегоа од првичните три релации кои ги разгледавме оделно се во 1NF со оглед на тоа што ниеден од нивните атрибути не беа мултивредносни. ==== 2NF ==== За секоја од релациите сите непримарни атрибути се целосно функционално зависни од примарниот клуч, без никакви парцијални зависности(не зависат само од дел од клучот). ==== 3NF ==== Транзитивните зависности кои беа застапени се отсранија со помош на декомпозиција, па така атрибутите директно се зависни од примарниот клуч и ја избегнуиваме ситуацијата на (X -> Y -> Z). ==== BCNF ==== По постигнувањето на 3NF беше постигната и BCNF бидејќи секоја од детерминантите за не тривијалните функционални зависности е кандидат клуч. ==== Lossless и презервација на зависностите ==== Декомпозициите претставуваат loseless бидејќи и по добивањето на повеќе мали релации може да се реконструира без никаква загува на податоци и функционалните зависности со кои отпочнавме сеуште се застапени во ново добиените помали релации. ==== Резултати од декомпозиција и нормализација ==== * Отсранување и избегнување на дупликат информации * Превенција од аномалии при операциите на внесување, ажурирање и бришење податоци * Полесно надградување на шемата