= Нормализација За табелите од нашата база на податоци, со цел разликување на самите id за секој ентитет, ќе ги преименуваме id атрибутите во <име_на_релација>_id. Со тоа добиваме: user_id, non_admin_user_id, admin_id, listener_id, musical_entity_id, song_id, artist_id, event_id, album_id, playlist_id. === Функционални зависности **user_id** -> profile_photo, email, username, full_name, password[[br]] **musical_entity_id** -> title, genre, release_date, artist_id[[br]] **song_id** -> link, album_id[[br]] **playlist_id** -> cover, playlist_name, listener_id[[br]] **event_id** -> event_name, location, venue, date, time, artist_id, admin_id[[br]] **(artist_id, musical_entity_id)** -> role[[br]] **(listener_id, musical_entity_id)** -> grade, comment[[br]] **(listener_id, song_id)** -> timestamp[[br]] **non_admin_user_id** -> /[[br]] **admin_id** -> /[[br]] **listener_id** -> /[[br]] **artist_id** -> /[[br]] **album_id** -> /[[br]] **(listener_id, playlist_id)** -> /[[br]] **(playlist_id, song_id)** -> /[[br]] **(follower_id, followee_id)** -> /[[br]] **(event_id, artist_id)** -> /[[br]] **(listener_id, musical_entity_id)** -> /[[br]] **Лево:**[[br]] user_id,[[br]] musical_entity_id,[[br]] song_id,[[br]] playlist_id,[[br]] event_id,[[br]] non_admin_user_id,[[br]] follower_id,[[br]] followee_id[[br]] **Десно:**[[br]] profile_photo, email, username, full_name, password,[[br]] title, genre, release_date, link, cover, playlist_name,[[br]] event_name, location, venue, date, time, role, grade, comment,[[br]] timestamp[[br]] **Лево и десно:**[[br]] artist_id, [[br]] admin_id,[[br]] listener_id, [[br]] album_id[[br]] **Глобална релација** [[br]] **R**={ user_id, musical_entity_id, song_id, playlist_id, event_id, non_admin_user_id, follower_id, followee_id, profile_photo, email, username, full_name, password, title, genre, release_date, link, cover, playlist_name, event_name, location, venue, date, time, role, grade, comment, timestamp, artist_id, admin_id, listener_id, album_id } == Покривачи 1. **user_id+** = {user_id, profile_photo, email, username, full_name, password} -> **Не ги содржи сите атрибути** 2. **musical_entity_id+** = {musical_entity_id, title, genre, release_date, artist_id, role} -> **Не ги содржи сите атрибути** 3. **song_id+** = {song_id, link} -> **Не ги содржи сите атрибути** 4. **playlist_id+** = {playlist_id, cover, playlist_name, listener_id} -> **Не ги содржи сите атрибути** 5. **event_id+** = {event_id, event_name, location, venue, date, time, artist_id, admin_id} -> **Не ги содржи сите атрибути** 6. **non_admin_user_id+** = {non_admin_user_id} -> **Не ги содржи сите атрибути** 7. **follower_id+** = {follower_id} -> **Не ги содржи сите атрибути** 8. **followee_id+** = {followee_id} -> **Не ги содржи сите атрибути** ==== Ги комбинираме покривачите за да дојдеме до сите атрибути: 1. **{user_id, musical_entity_id}+** = {user_id,musical_entity_id, profile_photo, email, username, full_name, password, title, genre, release_date, artist_id, role} -> **Не ги содржи сите атрибути** 2. **{user_id, musical_entity_id, song_id}+** = {user_id, musical_entity_id, song_id, profile_photo, email, username, full_name, password, title, genre, release_date, artist_id, role, link, album_id} -> **Не ги содржи сите атрибути** 3. **{user_id, musical_entity_id, song_id, playlist_id }+** = {user_id, musical_entity_id, song_id, playlist_id, profile_photo, email, username, full_name, password, title, genre, release_date, artist_id, role , link, album_id, cover, playlist_name, listener_id, grade, comment, timestamp } -> **Не ги содржи сите атрибути** 4. **{user_id, musical_entity_id, song_id, playlist_id, event_id }+** = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, admin_id, profile_photo, email, username, full_name, password,title, genre, release_date, role , link, album_id,cover, playlist_name, listener_id, grade, comment, timestamp,event_name, location, venue, date, time} -> **Не ги содржи сите атрибути** 5. **{user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id}+** = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_id, cover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> **Не ги содржи сите атрибути** 6. **{user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id}+** = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_id, cover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> **Не ги содржи сите атрибути** 7. **{user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id}+** = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_idcover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> **Не ги содржи сите атрибути** 8. **{user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id, non_admin_user_id}+** = {user_id, musical_entity_id, song_id, playlist_id, event_id, follower_id, followee_id, non_admin_user_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_id, artist_id, cover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> **Ги содржи сите атрибути** **Избран примарен клуч: {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id, non_admin_user_id}**[[br]] Релацијата ја задоволува **1НФ**, но не ја задоволува **2НФ** поради постоење на парцијални зависности. == Декомпозиција во 2НФ Најпрво ги групираме атрибутите само според клучевите од кои зависат. 1. user_id-> profile_photo, email, username, full_name, password 2. musical_entity_id-> title, genre, release_date, artist_id 3. song_id-> link, album_id 4. playlist_id-> cover, playlist_name, listener_id 5. event_id-> event_name, location, venue, date, time, artist_id, admin_id == Декомпозиција во релации - user_id-> profile_photo, email, username, full_name, password - musical_entity_id-> title, genre, release_date, artist_id - song_id-> link, album_id - playlist_id-> cover, playlist_name, listener_id - event_id-> event_name, location, venue, date, time, artist_id, admin_id - (artist_id, musical_entity_id)-> role - (listener_id, musical_entity_id)-> grade, comment - (listener_id, song_id)-> timestamp **R1 - {user_id, profile_photo, email, username, full_name, password} -> BCNF** **R2 - {musical_entity_id, title, genre, release_date, artist_id} -> BCNF** **R3 - {song_id, link, album_id} -> BCNF** **R4 - {playlist_id, cover, playlist_name, listener_id} -> BCNF** **R5 - {event_id, event_name, location, venue, date, time, artist_id, admin_id} -> Не задоволува 3НФ** **R6 - {(artist_id, musical_entity_id), role} -> BCNF** **R7 - {(listener_id, musical_entity_id), grade, comment} -> BCNF** **R8 - {(listener_id, song_id), timestamp} -> BCNF** **R9 - {(follower_id, followee_id)} -> BCNF** **R10 - {(playlist_id, song_id)} -> BCNF** **R11 - {(listener_id, musical_entity_id)} -> BCNF** **R12 - {(listener_id, playlist_id)} -> BCNF** **R13 - {(event_id, artist_id)} -> BCNF** === Декомпозиција на R5 Поради транзитивната зависност во **R5 (venue -> location)**, поточно секој venue секогаш ќе ја има истата локација, правиме декомпозиција во две релации: - **R5.1 {event_id, event_name, venue, date, time, artist_id, admin_id}** - **R14 {venue, location}** == Проверка за 3НФ **R1 - Клуч: user_id и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R2 - Клуч: musical_entity_id и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R3 - Клуч: song_id и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R4 - Клуч: playlist_id и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R5.1 - Клуч: event_id и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R6 - Клуч: (artist_id, musical_entity_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R7 - Клуч: (listener_id, musical_entity_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R8 - Клуч: (listener_id, song_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R9 - Клуч: (follower_id, followee_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R10 - Клуч: (playlist_id, song_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R11 - Клуч: (listener_id, musical_entity_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R12 - Клуч: (listener_id, playlist_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R13 - Клуч: (event_id, artist_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF** **R14 - Клуч: venue и сите атрибути зависат директно само од него. Релацијата е во BCNF** == Финални релации во BCNF 1. **Users** {user_id, profile_photo, email, username, full_name, password} 2. **Musical_Entities** {musical_entity_id, title, genre, release_date, artist_id} 3. **Songs** {song_id, link, album_id} 4. **Playlists** {playlist_id, cover, playlist_name, listener_id} 5. **Events** {event_id, event_name, location, venue, date, time, artist_id, admin_id} 6. **Artist_Contributions** {artist_id, musical_entity_id, role} 7. **Reviews** {listener_id, musical_entity_id, grade, comment} 8. **Listens** {listener_id, song_id, timestamp} 9. **Follows** {follower_id, followee_id} 10. **Playlist_Songs** {playlist_id, song_id} 11. **Likes** {listener_id, musical_entity_id} 12. **Saved_Playlists** {listener_id, playlist_id} 13. **Performs_At** {event_id, artist_id} 14. **Venues** {venue, location} == Дискусија на разликите од моделот во Фаза P2 Процесот на нормализација го потврди концептуалниот дизајн од [[html(Фаза 2)]]. Ова значи дека ЕР дијаграмот е солидно сработен. Единствена нова релација која произлезе од нормализацијата е **R14 (Venues)**, од каде произлегува и функционалната зависност venue -> location