= Нормализација на базата = == Нормални форми по релации == == Почетна релација == * Сите атрибути се атомични ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''Full(track_id, name, album_id, artist_id, media_type_id, genre_id, composer, milliseconds, bytes, price_id, value, date, invoice_line_id, invoice_id, quantity, customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id, employee_id, title, reports_to, birth_date, hire_date, address_info_id, address, city, state, country, postal_code, phone, fax, email, playlist_id, playlist_name, playlist_track_id)'''||track_id, album_id, artist_id, media_type_id, genre_id, price_id, invoice_line_id, invoice_id, customer_id, employee_id, address_info_id, contact_id, playlist_id, playlist_track_id||Многу функционални зависности (track_id → {...}, album_id → {...}, artist_id → name, ...)||1NF|| == Основни ентитети== ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''Track(track_id, name, album_id, media_type_id, genre_id, composer, milliseconds, bytes)'''||track_id||track_id → {name, album_id, media_type_id, genre_id, composer, milliseconds, bytes}||BCNF|| ||'''Album(album_id, title, artist_id)'''||album_id||album_id → {title, artist_id}||BCNF|| ||'''Artist(artist_id, name)'''||artist_id||artist_id → name||BCNF|| ||'''Genre(genre_id, name)'''||genre_id||genre_id → name||BCNF|| ||'''!MediaType(media_type_id, name)'''||media_type_id||media_type_id → name||BCNF|| == Табела за цени== ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''Price(price_id, value, date, track_id)'''||price_id (и можен (date, track_id))||price_id → {value, date, track_id}||BCNF|| == Фактури== ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''!InvoiceLine(invoice_line_id, invoice_id, track_id, quantity)'''||invoice_line_id (и можен (invoice_id, track_id))||(invoice_line_id → {invoice_id, track_id, quantity})||BCNF|| ||'''Invoice(invoice_id, customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total)'''||invoice_id||invoice_id → {customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total}||BCNF|| == Контакт инфо == ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''Customer(customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id)'''||customer_id||customer_id → {first_name, last_name, company, support_rep_id, personal_info_id, contact_id}||BCNF|| ||'''Employee(employee_id, first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id)'''||employee_id||employee_id → {first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id}||BCNF|| ||'''!AddressInfo(address_info_id, address, city, state, country, postal_code)'''||address_info_id||address_info_id → {address, city, state, country, postal_code}||BCNF|| ||'''Contact(contact_id, phone, fax, email)'''||contact_id||contact_id → {phone, fax, email}||BCNF|| == отстрануваат повторувања на Track во Playlist == ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''Playlist(playlist_id, name)'''||playlist_id||playlist_id → name||BCNF|| ||'''!PlaylistTrack(playlist_track_id, playlist_id, track_id)'''||playlist_track_id (и можен (playlist_id, track_id))||playlist_track_id → {playlist_id, track_id}||BCNF|| == Нормализирана база == ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =|| ||'''Track(track_id, name, album_id, media_type_id, genre_id, composer, milliseconds, bytes)'''||track_id||track_id → {name, album_id, media_type_id, genre_id, composer, milliseconds, bytes}||BCNF|| ||'''Album(album_id, title, artist_id)'''||album_id||album_id → {title, artist_id}||BCNF|| ||'''Artist(artist_id, name)'''||artist_id||artist_id → name||BCNF|| ||'''Genre(genre_id, name)'''||genre_id||genre_id → name||BCNF|| ||'''!MediaType(media_type_id, name)'''||media_type_id||media_type_id → name||BCNF|| ||'''Price(price_id, value, date, track_id)'''||price_id (и можен (date, track_id))||price_id → {value, date, track_id}||BCNF|| ||'''!InvoiceLine(invoice_line_id, invoice_id, track_id, quantity)'''||invoice_line_id (и можен (invoice_id, track_id))||(invoice_line_id → {invoice_id, track_id, quantity})||BCNF|| ||'''Invoice(invoice_id, customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total)'''||invoice_id||invoice_id → {customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total}||BCNF|| ||'''Customer(customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id)'''||customer_id||customer_id → {first_name, last_name, company, support_rep_id, personal_info_id, contact_id}||BCNF|| ||'''Employee(employee_id, first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id)'''||employee_id||employee_id → {first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id}||BCNF|| ||'''!AddressInfo(address_info_id, address, city, state, country, postal_code)'''||address_info_id||address_info_id → {address, city, state, country, postal_code}||BCNF|| ||'''Contact(contact_id, phone, fax, email)'''||contact_id||contact_id → {phone, fax, email}||BCNF|| ||'''Playlist(playlist_id, name)'''||playlist_id||playlist_id → name||BCNF|| ||'''!PlaylistTrack(playlist_track_id, playlist_id, track_id)'''||playlist_track_id (и можен (playlist_id, track_id))||playlist_track_id → {playlist_id, track_id}||BCNF|| == Заклучок == * Сите релации се во **BCNF**. * Релациите **Price** и **!InvoiceLine** може да сметаме дека се во 3NF, бидејќи date, track_id се уникатни кај Price, invoice_id, track_id кај InvoiceLine, во база не е сетирано дека мора да се уникатни, но за ова се осигураме деке е такa со соодветни тригери (**upsert_price** и **merge_invoice_line**). * **Price** – нова теабела која ни овозможува чување на историј на цени. * Новите табели **!AddressInfo** и **Contact** овозможуваат отстранување на повторувања на адреси и контакти → уште почиста нормализација. [[Image(Fianl Diagram Light.png, width=800, align=center)]] ** ← [wiki: Назад на почетна] **